如图所示,5维的x需要转变成6维的H,需要6*5=30个权重。以下同理,所以这是一个非常大的工作量。
两层神经网络计算公式:
非线性函数,sigmoid函数,右侧为计算图。
找公式的网站:cn.bing.com国内版,找matrix cookbook这本书就可以了。
反馈计算:
l.backward()是个tensor类型(向量无法用backward),为了避免构建计算图,所以需要用.data计算。
import torch
x_data=[1.0,2.0,3.0]
y_data=[2.0,4.0,6.0]
w=torch.Tensor([1.0])
#计算梯度。构建的tensor默认不计算梯度。在有需要的时候才计算。
#w是1*1的矩阵。
w.requires_grad=True
def forward(x):
return x*w
#此处w是tensor类型的,x需要强制类型转换为tensor类型的
def loss(x,y):
y_pred=forward(x)
#w是需要梯度的,所以此处y_pred也是需要梯度的
return (y_pred-y)**2
print("Predict (before training):",4,forward(4).item())
for epoch in range(100):
for x,y in zip(x_data,y_data):
l=loss(x,y)
l.backward()
print("\tgrad: ",x,y,w.grad.item())
w.data=w.data-0.01*w.grad.data
#w.data-=0.01*w.grad.data在这里是不可以的,可能会导致w变类型
w.grad.data.zero_()
#要把梯度的数据清零
print("progress:",epoch,l.item())
print("Predict(after training):",4,forward(4).item())
tensor类的变量 只要用了backward就会自动反向求导。
zero是用来导数清零的 防止下一次导数累加。
…