老师给的糖尿病数据集 使用了不同的优化器优化
出现过拟合问题 效果不好并记录一下
强调步骤 记于脑中
1.数据处理
2.模型构造
3.选择 loss 和 optimizer
4.训练数据
import torch
import numpy as np
import matplotlib.pyplot as plt
# 1.数据准备
xy = np.loadtxt('diabetes.csv.gz', delimiter=',', dtype=np.float32) # 数据的加载 用逗号做分割,设定数据类型
x_data = torch.from_numpy(xy[0:730, :-1])
y_data = torch.from_numpy(xy[0:730, [-1]]) # 这里我取了前730组数据为训练集
x_test = torch.from_numpy(xy[730:759, :-1]) # 后29组不参与训练 为测试集合
y_test = torch.from_numpy(xy[730:759, [-1]]) # 没有使用分割函数 不是很随机性质
# 2.模型构造
class LogisticRegressionModule(torch.nn.Module): # 构造类
def __init__(self):
super(LogisticRegressionModule, self).__init__() # 我称之为每个必写的东西
self.linear1 = torch.nn.Linear(8, 6) # 使用Linear模块
self.linear2 = torch.nn.Linear(6, 4)
self.linear3 = torch.nn.Linear(4, 1)
# 我这里使用了 sigmoid 和 tanh 两个模块
self.sigmoid = torch.nn.Sigmoid()
self.tanh = torch.nn.Tanh()
def forward(self, x):
# 这个怎么叫都可以 可以是 __call__(self, x) 也可以用 forward(self, x) 覆盖,只是一个名字我们用个在神经网络可能就是
# forward我们就是把它的功能写进去就vans
x = self.tanh(self.linear1(x))
x = self.sigmoid(self.linear2(x))
x = self.sigmoid(self.linear3(x)) # y hat
return x
def predict(self, x): # 预测函数 不知道正不正确的类内函数调用
y = self.forward(x)
return 1 if y > 0.5 else 0
def score(self, x_test, y_test): # 计算正确率的 函数
right_count = 0
for i in range(len(x_test)):
result = self.predict(x_test[i])
if result == y_test[i]:
right_count += 1
return right_count / len(x_test)
# 3.实例化 Loss 优化器设置
model = LogisticRegressionModule() # 至此类的实例化完成,可以使用model( xxxxx )调用里面的属性功能
# 使用两个数据集一定要求均值来观察loss 不然不在一个量级上 无法观测过拟合现象
criterion = torch.nn.BCELoss(size_average=True)
# 使用MSELoss 计算误差,我们输出的是y_pre,y_data 会自动进行相关运算,其实也是继承自上面定义的类中的属性
optimizer = torch.optim.RMSprop(model.parameters(), lr=0.01) # 不同优化器使用
epoch_list = []
loss1_list = []
loss2_list = []
# 4.训练迭代
# 开始循环 优化咯
for epoch in range(10001):
y_pre1 = model(x_data)
y_pre2 = model(x_test)
loss1 = criterion(y_pre1, y_data)
loss2 = criterion(y_pre2, y_test)
if epoch % 500 == 0: # 每500步3进行一次取点采样
print("epoch:", epoch, loss1.item(),loss2.item())
# 每次梯度下降之前都要有清零
epoch_list.append(epoch)
loss1_list.append(loss1.item())
loss2_list.append(loss2.item())
optimizer.zero_grad()
loss1.backward()
optimizer.step()
y_pre2 = model(x_test)
print("y_pre2:", y_pre2.detach().numpy()) # 这个detach 不知道呢
# 打印出优化后的数据
# print('w = ',model.linear1.weight.item())
# print('b = ',model.linear1.bias.item())
# 5.后处理可视化步骤
#观测训练集 和 测试集的分类效果
print("训练集正确率", model.score(x_data, y_data))
print("测试集正确率", model.score(x_test, y_test))
plt.plot(epoch_list, loss1_list, label='train', linewidth=1)
plt.plot(epoch_list, loss2_list, label='test', linewidth=1)
plt.ylabel("Loss")
plt.xlabel("epoch")
plt.legend()
plt.show()
这里参考 查看每一层的权重 方法
# 参数说明
# 第1层的参数:
layer1_weight = model.linear1.weight.data
layer1_bias = model.linear1.bias.data
print("layer1_weight", layer1_weight)
print("layer1_weight.shape", layer1_weight.shape)
print("layer1_bias", layer1_bias)
print("layer1_bias.shape", layer1_bias.shape)
1.使用SGD 优化得到的loss图 迭代40000次
有点离谱 最后的loss 是测试集合训练集合 loss低 和我们平时预期不一样。
正确率的图像
2.Adam 优化得到的loss 图 迭代5000次
正确率
大家可以尝试其它优化器
这次尝试也知道很多问题 超参数的选取是个体力活 不只是学习率、层数
还有 使用tanh 、sigmoid等等各种函数 这些都是我们在建立模型时候需要考虑的问题 。 享优得到一个很好的训练模型架构 是需要很大的功夫
下面是有关 老师 讲述的详细大神笔记
大神笔记