1.课堂例题——穷举可视化y=w·x关于权重w取值的情况
①对给定数据训练一个线性模型,但是不知道权重w取什么值训练效果更好
——穷举法,在一个确定的范围内,按照一定间隔对权重w进行采样并计算不同情况下的损失值
绘制出误差值和权重值之间的函数曲线,就可以判断最优权重值的取值
②绘图法在深度学习中常用来确定算法中的超参数值,如epoch;
也会利用可视化工具来检查当前模型的训练程度,来判断是否出现过拟合或欠拟合的状况
import numpy as np
import matplotlib.pyplot as plt
#实现定义好数据集的x值和y值
x_data = [1.0,2.0,3.0]
y_data = [2.0,4.0,6.0]
#定义预测函数,因为是要确定损失值随着w的变化情况
#后续会给定w的值,所以参数只有x
def forward(x):
return x*w
#定义损失函数的计算方式,仅针对一个样本而言
def loss(x,y):
y_pred = forward(x)
return (y-y_pred) * (y-y_pred)
# 程序的目的是为了比较mse和w之间的关系,所以要把其二者的结果对应放入列表中
w_list = []
mse_list = []
#根据老师说的【穷举法】思想,在一个确定的范围找到mse和w之间的关系
for w in np.arange(0.0,4.1,0.1):
print('w = ',w)
l_sum = 0#存放所有样本的损失函数值
for x_val,y_val in zip(x_data,y_data):
y_pred_val = format(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()
2.课后习题——穷举并可视化y=w·x+b关于权重对(w,b)的情况
【笔记】
①X, Y = np.meshgrid(x, y) 代表的是
将x中每一个数据和y中每一个数据组合生成很多点,
然后将这些点的x坐标放入到X中,y坐标放入Y中,
并且相应位置是对应的【np.meshgrid()函数②三维函数绘制模板:
fig = plt.figure()
ax3d = Axes3D(fig)
ax.plot_surface(x,y,z)
③shape是数组array的属性;reshape()是数组array的方法
shape属性和reshape()方法
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
from matplotlib import cm
#实现定义好数据集的x值和y值
x_data = [1.0, 2.0, 3.0]
y_data = [2.0, 4.0, 6.0]
# 定义预测函数,因为是要确定损失值随着w的变化情况
# 后续会给定w,b的值,所以参数只有x
def forward(x):
return x * w + b
# 定义损失函数的计算方式,仅针对一个样本而言
def loss(x, y):
y_pred = forward(x)
return (y_pred - y) * (y_pred - y)
# 程序的目的是为了比较mse和w之间的关系,所以要把其二者的结果对应放入列表中
w_list = np.arange(0.0, 4.1, 0.1)
b_list = np.arange(-2.0, 2.1, 0.1)
mse_list = []
# 根据老师说的【穷举法】思想,在一个确定的范围找到mse和w、b之间的关系
ww, bb = np.meshgrid(w_list, b_list)
for b in b_list:
for w in w_list:
print('w={0}, b={0}'.format(w, b))
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)
mse_list.append(l_sum / 3)
# 看不懂???
mse = np.array(mse_list).reshape(w_list.shape[0], b_list.shape[0])
#h = plt.contourf(w_list,b_list,mse)#绘制二维等高线图
fig = plt.figure()
ax3d = Axes3D(fig)
plt.ylabel('b')
plt.xlabel('w')
ax3d.plot_surface(ww, bb, mse, rstride=1, cstride=1, cmap=cm.viridis)
plt.show()
参考链接:
-https://www.bilibili.com/video/BV1Y7411d7Ys?spm_id_from=333.999.0.0&vd_source=09cede80152575b6b99996355fa8e7e3
-https://blog.csdn.net/kodoshinichi/article/details/114540275