pytorch学习视频——B站视频链接:《PyTorch深度学习实践》完结合集哔哩哔哩bilibili
以线性模型为例,对神经网络的学习过程说明
准备数据集,训练集和测试集
选择模型,初始化线性模型,初始化权重为一个随机数random guess
选择评估模型——损失函数,针对一个样本的损失
计算出每个样本的损失,算出平均损失(MSE平均平方误差)
最小化误差,不断调整权重w的值(也就是会用到后面的梯度下降法,可以使得损失减少得最快)
主要包括两个源码文件(视频中的练习和作业),内容包括线性模型的训练和三维作图,主要用到zip函数,meshgrid函数三维作图。
源代码:
1. linear_model.py 手敲源码
2.作业 linear_job
import numpy as np
import matplotlib.pyplot as plt
x_data = [1.0, 2.0, 3.0]
y_data = [2.0, 4.0, 6.0]
# 模型函数 y= w*x
def foward(x):
return x * w
# 损失函数
def loss(x, y):
y_pred = foward(x)
return (y_pred-y) * (y_pred - y)
# 定义两个列表存放权重和误差 用来画图
w_list = []
mse_list = []
# 给权重W赋予不同的值(0-4)
for w in np.arange(0.0, 4.0, 0.1):
print('w', w)
loss_sum = 0
# 根据输入的两个列表(x_data,y_data)来求出预测值和误差
for x_val, y_val in zip(x_data, y_data): # zip函数是
y_pred_val = foward(x_val)
loss_val = loss(x_val, y_val)
# 误差求和
loss_sum += loss_val
print('\t', x_val, y_val, y_pred_val, loss_val)
# 平均误差
loss_mean = loss_sum / 3
print('MSE', loss_mean)
w_list.append(w)
mse_list.append(loss_mean)
# 作图
plt.plot(w_list, mse_list)
plt.xlabel('w')
plt.ylabel('Loss')
plt.show()
结果:
代码说明:
zip函数:Python zip() 函数 | 菜鸟教程 (runoob.com)
zip2 = zip(l2, l3)
zip( )将列表中的元素打包成一个个元组 ,然后返回由这些元组组成的列表
zip1 = zip(*l1)
zip(*list),分解列表中的元组
linear_job.py
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
x_data = [1.0, 2.0, 3.0]
y_data = [3.0, 5.0, 7.0]
# 模型函数 y= w*x+b
def foward(x):
return x * w + b
# 损失函数
def loss(x, y):
y_pred = foward(x)
return (y_pred-y) * (y_pred - y)
loss_list = []
# 整个过程是先取w的值,再对每一个w取不同的b,计算每一轮的损失
# 给权重W赋予不同的值(0-4)
for w in np.arange(0.0, 4.1, 0.1):
# 存放单独一个w对应所有b的误差,是一个行向量
mse_vec = []
for b in np.arange(0.0, 2.1, 0.1 ):
loss_sum = 0
# 根据输入的两个列表(x_data,y_data)来求出预测值和误差
for x_val, y_val in zip(x_data, y_data):
y_pred_val = foward(x_val)
loss_val = loss(x_val, y_val)
# 误差求和
loss_sum += loss_val
# 平均误差
loss_mean = loss_sum / 3
mse_vec.append(loss_mean)
# 算完一整个误差行向量后,将此向量存入loss_list中,最后形状是(41, 21)
loss_list.append(mse_vec)
fig = plt.figure()
ax = Axes3D(fig)
# X,Y,Z都是二维矩阵,X和Y直接通过meshgrid函数生成,形状为(41, 21)
# X是41行np.arange(0.0, 2.1, 0.1),Y的每一行的数相同,分别对应X的
# 每一行生成对应的坐标,一共有41行,不同的行的数都不相同
X,Y = np.meshgrid(np.arange(0.0, 2.1, 0.1), np.arange(0.0, 4.1, 0.1))
Z = np.asarray(loss_list)
print(X.shape, Y.shape, Z.shape)
print(X)
print("-------------")
print(Y)
ax.plot_surface(X, Y, Z)
plt.show()
np.meshgrid()理解:3分钟理解np.meshgrid()_littlehaes的博客-CSDN博客_np.meshgrid()
结果:
代码说明:
把meshgrid()函数理解清楚就差不多了,参考博客:numpy.meshgrid()理解_lllxxq141592654的博客-CSDN博客
其它可以参考注释。
以上代码已经在pycharm上经过测试,应该没有问题。
(刚开始pytorch,以上仅作为参考哦,若有错误请指出)
——未完待续……