线性模型:或
随机选取权重w后评估该模型的效果,通过穷举法选出最佳的w
评估模型:损失函数:
计算损失函数的平均值,最终使平均损失最小
例题:,使用线性模型做出预测。
代码如下:
# 穷举法
import numpy as np
import matplotlib.pyplot as plt # 绘图包
x_data = [1.0, 2.0, 3.0] # 数据集保存,x和y需分开,x为输入,y为输出
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 = [] # 准备两个空列表用来保存w和list的值
mse_list = []
for w in np.arange(0.0, 4.1, 0.1): # w在0到4中间取值,每间隔0.1取值
print('w=', 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.xlabel('w') # 纵坐标
plt.show()
以上代码首先定义了线性模型和损失函数,从0到4中等间隔选取w,对每个w计算对应的损失函数平均值,平均值最小的即对应最合适的w。
课后习题:将线性模型从换为,使用穷举法解决并可视化为三维图像
# 使用模型y=wx+b,并绘制三维图形
import numpy as np
import matplotlib.pyplot as plt # 绘图包
x_data = [1.0, 2.0, 3.0] # 数据集保存,x和y需分开,x为输入,y为输出
y_data = [3.0, 5.0, 7.0]
def forward(x): # 线性模型(前馈)
return x * W + B
def loss(x, y): # 损失函数
y_pred = forward(x)
return (y_pred - y) * (y_pred - y)
w = np.arange(0.0, 4.1, 0.1)
b = np.arange(0.0, 2.1, 0.1)
[W, B] = np.meshgrid(w, b) # 将w,b变为二维矩阵,将w和b变为二维矩阵后就不需要使用for循环来修改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)
# 此部分代码与例题完全相同,即使用forward函数计算x对应的y,用loss函数计算损失函数,MSE为平均损失函数
# 绘图:二维时使用plt.plot绘图,三维则使用matplotlib绘图
fig = plt.figure()
ax = fig.add_subplot(projection='3d')
# 引入3d绘图
ax.plot_surface(W, B, l_sum / 3) # 引入W,B,l_sum/3三个绘图参数
plt.show()
# 引入matplotlib中的三维曲面图
例题和课后习题的区别在于:使用的线性模型,前者是,后者是。前者只有一个参数,故绘制二维图,只存在一个参数的范围选择,故使用for循环完成对参数的训练;后者含有两个参数,故绘制三维图,存在两个参数的范围选择,故使用np.meshgrid构建二维矩阵完成对参数的训练。
两者用到的绘图函数分别是:plot函数绘制二维图像,matplotlib绘制三维曲面图。
来源:b站刘二大人《PyTorch深度学习实践》
参考文章:PyTorch深度学习——线性模型(B站刘二大人P2作业)_学习CV的研一小白的博客-CSDN博客