处理多位特征的输入以及多个非线性层

老师给的糖尿病数据集 使用了不同的优化器优化
出现过拟合问题 效果不好并记录一下

强调步骤 记于脑中
1.数据处理
2.模型构造
3.选择 loss 和 optimizer
4.训练数据
处理多位特征的输入以及多个非线性层_第1张图片

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张图片
正确率的图像
在这里插入图片描述
2.Adam 优化得到的loss 图 迭代5000次
处理多位特征的输入以及多个非线性层_第3张图片

正确率

在这里插入图片描述

大家可以尝试其它优化器

这次尝试也知道很多问题 超参数的选取是个体力活 不只是学习率、层数
还有 使用tanh 、sigmoid等等各种函数 这些都是我们在建立模型时候需要考虑的问题 。 享优得到一个很好的训练模型架构 是需要很大的功夫

下面是有关 老师 讲述的详细大神笔记
大神笔记

你可能感兴趣的:(python入门,刘二大人,神经网络,python,深度学习,机器学习,pytorch)