比照视频中的代码进行运行,得到的结果与视频中结果有所出入,因此对代码进行了分析,并进行了总结。
详细视频中的代码及结果
代码
import matplotlib.pyplot as plt # matplotlib.pyplot包导入
x_data = [1.0, 2.0, 3.0] # 定义x数据
y_data = [2.0, 4.0, 6.0] # 定义y数据
w = 1.0 # 给定/预测初始权重
def forward(x): #定义线性模型
return x * w # 线性模型详情
def cost(xs, ys): # 定义损失函数
cost = 0 # 总损失为0
for x, y in zip(xs, ys): # 将x,y以成对的形式出现
y_pred = forward(x) # 预测y
cost += (y_pred - y) * (y_pred - y) # 损失累加
return cost / len(xs) # 返回损失均值
def gradiet(xs, ys): # 定义梯度函数
grad = 0 # 定义梯度初始值
for x, y in zip(xs, ys): # 将x,y以成对的形式出现
grad += 2 * x * (x * w - y) # 根据公式计算求梯度
return grad / len(xs) # 计算梯度均值
print("Predict (before training)", 4, forward(4)) # 训练前直接预测
cost_list = []
epoach_list = []
for epoach in range(100): # 定义训练的轮数
cost_val = cost(x_data, y_data) # 计算损失
grad_val = gradiet(x_data, y_data) # 求梯度
w -= 0.01 * grad_val # 更新权重
cost_list.append(cost_val) # 损失存储
epoach_list.append(epoach) # 轮数存储
print("Epoch:", epoach, "w = ", w, "loss = ", cost_val) # 打印轮数、权重、损失
print("Predict (after training)", 4, forward(4)) # 训练后预测
plt.plot(epoach_list, cost_list) # 绘图:权重和MSE损失图
plt.ylabel('Cost') # 绘图:y坐标标签
plt.xlabel('Epoch') # 绘图:x坐标标签
plt.show() # 绘图:显示图
运行结果
虽然代码和视频中的代码完全一致,但是得到的结果却相差很多。
修正在该系列教程的开篇有交待过使用的PyTorch版本是0.4,但是我安装的是1.0.2
由此推断可能是部分代码不兼容的问题,并对部分代码做了调整
调整后的代码如下
import matplotlib.pyplot as plt # matplotlib.pyplot包导入
import numpy as np
x_data = np.array([1.0, 2.0, 3.0]) # 定义x数据
y_data = np.array([2.0, 4.0, 6.0]) # 定义y数据
w = 1.0 # 给定/预测初始权重
def forward(x): #定义线性模型
return x * w # 线性模型详情
def cost(xs, ys): # 定义损失函数
cost = 0 # 总损失为0
# for x, y in zip(xs, ys): # 将x,y以成对的形式出现
y_pred = forward(xs) # 预测y
cost += (y_pred - ys) * (y_pred - ys) # 损失累加
return np.sum(cost) / len(xs) # 返回损失均值
def gradiet(xs, ys): # 定义梯度函数
# grad = 0 # 定义梯度初始值
# for x, y in zip(xs, ys): # 将x,y以成对的形式出现
grad = np.sum(2.0 * xs * (xs * w - ys)) # 根据公式计算求梯度
return grad / len(xs) # 计算梯度均值
print("Predict (before training)", 4, forward(4)) # 训练前直接预测
cost_list = []
epoach_list = []
for epoach in range(100): # 定义训练的轮数
cost_val = cost(x_data, y_data) # 计算损失
grad_val = gradiet(x_data, y_data) # 求梯度
w -= 0.01 * grad_val # 更新权重
cost_list.append(cost_val) # 损失存储
epoach_list.append(epoach) # 轮数存储
print("Epoch:", epoach, "w = ", w, "loss = ", cost_val) # 打印轮数、权重、损失
print("Predict (after training)", 4, forward(4)) # 训练后预测
plt.plot(epoach_list, cost_list) # 绘图:权重和MSE损失图
plt.grid()
plt.ylabel('Cost') # 绘图:y坐标标签
plt.xlabel('Epoch') # 绘图:x坐标标签
plt.show() # 绘图:显示图
此时得到的结果如下
这时得出的结果与视频中的结果基本一致。
在实际代码运行中,发现相同的代码却得不到视频中的结果,通过代码调试,检测出在计算过程中部分代码没有得到预期结果。因此,调整了部分代码,获得预期结果。其原因可能与PyTorch版本有关。
参考资料“刘二大人”-《PyTorch深度学习实践》完结合集-B站教学视频笔记-P3(点击直达)
声明以上内容仅为个人学习笔记,仅供学习交流使用,不可用于其他用途!



