线性模型
深度学习过程
- DataSet:准备数据集
- Model:进行模型的设计/选择
- Training:训练确定权重
- inferring:应用
基本概念
监督学习:通过训练已知数据集结果的模型进行训练,然后用训练好的模型来预测未知测试集的结果达到某一功能的过程。
过拟合:由于模型过于复杂,模型学习能力过强,因此模型会去学习数据中隐含的噪声,导致模型学习不到数据集的真正分布。导致的结果是模型在训练集上的准确率很高,但在测试集上的准确率却很低。
泛化:说白了就是在未见过的测试数据上也能进行预测。
将训练集再进行划分,一份用来训练,另一份用来评估(成为开发集),之后再做测试,可以提高泛化能力。
线性模型的案例
首先选择一个模型y = wx + b ==简化==> y = wx,对于参数一般开始是随机选择一个随机数。
比较随机权重得到的y与实际的y的平方差,计算损失,取w使得损失最小。
一个样本的损失和一个训练集上的平均平方误差MSE
该案例(y = w * x)代码实现
import numpy as np
import matplotlib.pyplot as plt
x_data = [1.0, 2.0, 3.0, 4.0]
y_data = [2.0, 4.0, 6.0, 8.0]
def forward(x):
return x * w
def loss(x, y):
y_pre = forward(x)
return (y_pre - y) * (y_pre - y)
w_list = []
mse_list = []
for w in np.arange(0.0, 4.1, 0.1):
l_sum = 0
print('w = ', w)
for x_val, y_val in zip(x_data, y_data):
y_pre_data = forward(x_val)
loss_data = loss(x_val, y_val)
l_sum += loss_data
print('\t', x_val, y_val, y_pre_data, loss_data)
print('MSE = ', l_sum / len(y_data))
w_list.append(w)
mse_list.append(l_sum/len(y_data))
plt.plot(w_list, mse_list)
plt.ylabel("loss")
plt.xlabel("w")
plt.show()
输出的画布:
可见当w = 2.0 时,损失最小,模型最精确
将来在测试时真实的坐标是Epoch,需要人工观察一下收敛的伦次
作业:实现线性模型(y = wx + b)并输出loss的3D图像
import numpy as np
import matplotlib.pyplot as plt
# 定义数据集
x_data = [1.0, 2.0, 3.0]
y_data = [1.9, 3.9, 5.9]
# 生成矩阵坐标
W, B = np.arange(0.0, 4.1, 0.1), np.arange(-2.0, 2.1, 0.1)
w, b = np.meshgrid(W, B)
# print(w)
# print('----------')
# print(b)
# 定义模型:y = x * w - b
def forward(x):
return x * w + b
# 损失函数
def loss(y_pre, y):
return (y_pre - y) ** 2
l_sum = 0 # 计算损失之和
for x_val, y_val in zip(x_data, y_data):
y_pre = forward(x_val)
loss_val = loss(y_pre, y_val)
l_sum += loss_val
mse = l_sum / len(x_data)
# 定义figure
fig = plt.figure()
# 画3D图
ax = plt.axes(projection='3d')
surf = ax.plot_surface(w, b, mse,
rstride=1, # 指定行的跨度
cstride=1, # 指定列的跨度
cmap='rainbow') # 设置颜色映射
# 设置z轴
ax.set_zlim(0, 40)
# 设置图标
ax.set_xlabel('w')
ax.set_ylabel('b')
ax.set_zlabel('Loss')
# ax.text(0.2, 2, 43, 'Cost Value', color='black')
ax.set_title("Cost Value")
# 增加颜色条
# fig.colorbar(surf, shrink=0.5, aspect=5)
fig.show()
plt.pause(0)