pytorch 深度学习实践 第二讲 线性模型

pytorch学习视频——B站视频链接:《PyTorch深度学习实践》完结合集哔哩哔哩bilibili


第二讲 线性模型

  • 以线性模型为例,对神经网络的学习过程说明

    • 准备数据集,训练集和测试集

    • 选择模型,初始化线性模型y = wx + b,初始化权重w为一个随机数random guess

    • 选择评估模型——损失函数loss,针对一个样本的损失

    • 计算出每个样本的损失,算出平均损失(MSE平均平方误差)

    • 最小化误差,不断调整权重w的值(也就是会用到后面的梯度下降法,可以使得损失减少得最快)

主要包括两个源码文件(视频中的练习和作业),内容包括线性模型的训练和三维作图,主要用到zip函数,meshgrid函数三维作图。

源代码:
1. linear_model.py 手敲源码
2.作业 linear_job

1. linear_model.py 手敲源码:

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()
 
  

结果:

pytorch 深度学习实践 第二讲 线性模型_第1张图片

代码说明:

zip函数:Python zip() 函数 | 菜鸟教程 (runoob.com)

zip2 = zip(l2, l3)

zip( )将列表中的元素打包成一个个元组 ,然后返回由这些元组组成的列表

zip1 = zip(*l1)

zip(*list),分解列表中的元组

2. 作业——三维图形

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()

结果:

pytorch 深度学习实践 第二讲 线性模型_第2张图片

代码说明:

把meshgrid()函数理解清楚就差不多了,参考博客:numpy.meshgrid()理解_lllxxq141592654的博客-CSDN博客

其它可以参考注释。

以上代码已经在pycharm上经过测试,应该没有问题。

(刚开始pytorch,以上仅作为参考哦,若有错误请指出)

——未完待续……

你可能感兴趣的:(pytorch学习,python,python,pytorch,zip,numpy)