import matplotlib.pyplot as plt
#初试数据
x_data=[1.0,2.0,3.0]
y_data=[2.0,4.0,6.0]
#设置初始参数w的值为1
w=1.0
def forward(x):#预测函数,根据x得到y_pre
return x*w
def cost(xs,ys):#损失函数,计算当前参数w的值为1的时候的平均损失值
cost=0
for x,y in zip(xs,ys):
y_pred=forward(x)
cost+=(y-y_pred)**2#cost=cost+(y-y_pre)**2
return cost/len(xs)#这里len(列表)得到列表中的元素个数
def gradient(xs,ys):#计算当前损失值loss对参数w的求导
grad=0
for x,y in zip(xs,ys):
grad+=2*x*(x*w-y)
return grad/len(xs)
epoch_list=[]
cost_list=[]
print("predict(before training)",4,forward(4))
for epoch in range(500):
#以epoch为0举例子
cost_val=cost(x_data,y_data)#在epoch为0的情况下,计算w为1时候的平均损失值
grad_val=gradient(x_data,y_data)#同理,计算w为1情况下损失值对参数w的导数,这将决定w的方向
w=w-0.01*grad_val#学习率0.01,根据计算的求导的值和学习率来改变w的值,进入到下一个epoch
#解释负号:
#4. 调参问题:梯度表示了损失函数在当前参数值下的变化率。
#梯度下降问题中,所谓的梯度也就是损失值对可变参数的求导。当梯度为正,稍稍增大参数就会引起损失值的增大,故此时应该减小参数所以使用负号。当梯度为负,减小参数的值会引起损失值的增大,故应该增大参数,所以使用负号。所以,在梯度下降过程中,我们应该使用负号
print("epoch:",epoch,"w=",w,"loss=",cost_val)
epoch_list.append(epoch)
cost_list.append(cost_val)
print("predict (after training)",4,forward(4))#输入4,可以得到4*当前w的值
plt.plot(epoch_list,cost_list)
plt.ylabel("cost")
plt.xlabel("epoch")
plt.show()
PyTorch 深度学习实践 第3讲
于 2023-09-19 17:45:46 首次发布