PyTorch 深度学习实践 第2讲

线性模型


损失函数(Trainging Loss(Error)

l o s s = ( y ^ − y ) 2 = ( x ∗ ω − y ) 2 \begin{aligned}loss=(\hat{y}-y)^2=(x*\omega-y)^2\end{aligned} loss=(y^y)2=(xωy)2
其中 y ^ \hat{y} y^为预测值, y y y为实际值, ω \omega ω为权重


平均平方误差(Mean Square Error)

c o s t = 1 N ∑ n = 1 N ( y ^ n − y n ) 2 \begin{aligned}cost&=\frac{1}{N}\sum_{n=1}^N(\hat{y}_n-y_n)^2\end{aligned} cost=N1n=1N(y^nyn)2
简称MSE


课中代码实现

import matplotlib.pyplot as plt
import numpy as np

#数据集
x_data = [1.0, 2.0, 3.0]
y_data = [2.0, 4.0, 6.0]


#模型(前馈)
def forward(x):
    return x * w


#损失函数
def loss(x, y):
    y_pred = forward(x)
    return (y_pred - y) * (y_pred - y)


#保存权重和损失值
w_list = []
mse_list = []

for w in np.arange(0.0, 4.1, 0.1):  #从0.0到4.0,步长为0.1
    print('w=', w)
    l_sum = 0
    for x_val, y_val in zip(x_data, y_data):
        y_pred_val = forward(x_val)
        loss_val = loss(x_val, y_val)
        l_sum += loss_val
        print('\t', x_val, y_val, y_pred_val, loss_val)
    print(' MSE=', l_sum / 3)
    w_list.append(w)
    mse_list.append(l_sum / 3)

plt.plot(w_list, mse_list)
plt.ylabel('Loss')
plt.grid(alpha=0.4)
plt.show()

结果图

提及的可视化工具

  • visdom
  • mp.meshgride()绘制3D图

课后作业

当模型变为
y ^ = x ∗ ω + b \hat{y}=x*\omega+b y^=xω+b
时,求出loss和MSE,并绘图

课后作业代码实现

import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D

#数据集
x_data = np.array([1.0, 2.0, 3.0])
y_data = np.array([6.0, 8.0, 10.0])

#设置字体
font = {'family': 'Microsoft YaHei', 'weight': 'bold', 'size': 10}


#模型
def forward(x):
    return x * w + b


#损失函数
def loss(x, y):
    y_pred = forward(x)
    return (y_pred - y) ** 2


#绘图
fig = plt.figure(figsize=(12, 8))
ax = Axes3D(fig, auto_add_to_figure=False)
fig.add_axes(ax)

#建立空列表,存放w和mse值
w_list = []
mse_list = []

for w in np.arange(0.0, 4.1, 0.1):
    for b in np.arange(0.0, 8.1, 0.1):
        print('w = ', w, ', b = ', b)
        l_sum = 0  #损失值之和
        loss_val = 0  #当前损失值
        for x_val, y_val in zip(x_data, y_data):  #将x、y通过zip()映射成(x,y)
            y_pred_val = forward(x_val)  #y的预测值
            loss_val = loss(x_val, y_val)  #计算当前损失值
            l_sum += loss_val  #累计损失值
            print('\t', x_val, y_val, y_pred_val, loss_val)  #打印当前的x值,y值,y的预测值以及当前的损失值
        print('MSE = ', l_sum / 3)  #打印MSE值
        w_list.append([w, b])  #将w,b追加到w_list中
        mse_list.append(l_sum / 3)  #将mse添加到mse_list中

w, b = np.meshgrid(np.arange(0.0, 4.1, 0.1), np.arange(0.0, 8.1, 0.1))  #将w,b组成网格,即拓展w,b维度,w拓展列,b拓展行

l_sum = 0  #先初始化l_sum,避免被前面的值影响

for x_val, y_val in zip(x_data, y_data):  #还是先把x,y通过zip()映射成(x,y)
    loss_val = loss(x_val,
                    y_val)  #此时loss函数中用到的forward()函数中的w、b由于用了meshgride(),已经成了一个Numpy数组了,所有这时候求到的loss_val也是一个Numpy数组
    l_sum += loss_val  #同上理,这时候l_sum求得的也是一个Numpy数组

mse = l_sum / 3
#将l_sum里面的每一个列表中的每一个元素都除3,再赋给mse,因此mse也是一个Numpy数组,且维度和w,b一致

sc = ax.plot_surface(w, b, mse,  # x,y,z二维矩阵(坐标矩阵xv,yv,zv)
                     rstride=1,  # retride(row)指定行的跨度
                     cstride=1,  # retride(column)指定列的跨度
                     cmap='BrBG_r')  # 设置颜色映射

#绘制等高线(投影)
ax.contourf(w, b, mse, offset=-2, cmap='BrBG_r')

ax.text2D(0, 0, 'y_hat=w*x+b')
plt.xlabel('w')
plt.ylabel('b')
ax.set_zlabel('mse')

#绘制图例
#用参数aspect和shrink控制
#aspect还是宽与长的比值
#shrink是等比例缩放系数
#extend用来控制上下两个尖尖
plt.colorbar(sc,extend='both',shrink=0.5,aspect=20)

plt.show()

运行结果
参考课程——B站刘二大人

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值