• pytorch 搭建神经网络最简版


    数据集为,糖尿病患者各项指标以及是否换糖尿病。

    diabetes.csv 训练集
    diabetes_test.csv 测试集
    1. import torch
    2. import torch.nn.functional as F
    3. import numpy as np
    4. import matplotlib.pyplot as plt
    5. import numpy as np
    6. # 注意这里必须写成两维的矩阵
    7. xy = np.loadtxt('diabetes.csv', delimiter=',', dtype=np.float32)
    8. x_data = torch.from_numpy(xy[:, :-1])
    9. y_data = torch.from_numpy(xy[:, [-1]])
    10. class Model(torch.nn.Module):
    11. def __init__(self):
    12. super().__init__()
    13. self.linear1 = torch.nn.Linear(8, 6)
    14. self.linear2 = torch.nn.Linear(6, 4)
    15. self.linear3 = torch.nn.Linear(4, 2)
    16. self.linear4 = torch.nn.Linear(2, 1)
    17. self.sigmoid = torch.nn.Sigmoid()
    18. self.activate = torch.nn.ReLU()
    19. # __call__() 中会调用这个函数!
    20. def forward(self, x):
    21. # x = self.activate(self.linear1(x))
    22. # x = self.activate(self.linear2(x))
    23. # x = self.activate(self.linear3(x))
    24. x = self.sigmoid(self.linear1(x))
    25. x = self.sigmoid(self.linear2(x))
    26. x = self.sigmoid(self.linear3(x))
    27. x = self.sigmoid(self.linear4(x))
    28. return x
    29. # model为可调用的! 实现了 __call__()
    30. model = Model()
    31. # 指定损失函数
    32. # criterion = torch.nn.MSELoss(size_average=Flase) # True
    33. # criterion = torch.nn.MSELoss(reduction='sum') # sum:求和 mean:求平均
    34. criterion = torch.nn.BCELoss(size_average=True) # 二分类交叉熵损失函数
    35. # -- 指定优化器(其实就是有关梯度下降的算法,负责),这里将优化器和model进行了关联
    36. # optimizer = torch.optim.SGD(model.parameters(), lr=0.1)
    37. optimizer = torch.optim.Adam(model.parameters(), lr=0.01) # 这个用这个很准啊,其他得根本不行啊
    38. # optimizer = torch.optim.Rprop(model.parameters(), lr=0.01)
    39. for epoch in range(5000):
    40. y_pred = model(x_data) # 直接把整个测试数据都放入了
    41. loss = criterion(y_pred, y_data)
    42. print(epoch, loss.item())
    43. optimizer.zero_grad() # 会自动找到所有的w和b进行清零!优化器的作用 (为啥这个放到loss.backward()后面清零就不行了呢?)
    44. loss.backward()
    45. optimizer.step() # 会自动找到所有的w和b进行更新,优化器的作用!
    46. # 测试
    47. xy = np.loadtxt('diabetes_test.csv', delimiter=',', dtype=np.float32)
    48. x_data = torch.from_numpy(xy[:, :-1])
    49. y_data = torch.from_numpy(xy[:, -1])
    50. x_test = torch.Tensor(x_data)
    51. y_test = model(x_test) # 预测
    52. print('y_pred = ', y_test.data)
    53. # 对比预测结果和真实结果
    54. for index, i in enumerate(y_test.data.numpy()):
    55. if i[0] > 0.5:
    56. print(1, int(y_data[index].item()))
    57. else:
    58. print(0, int(y_data[index].item()))

    从代码看出,从一开始数据特征维度为8维,通过一层层的降维最终输出一维数据(输入虽然是多维,但是输出是一维一个概率值,仍然是个二分类问题)

    如: Linear(8, 6)  表示输入特征是8维,输出特征6维。此时考虑的维度是列(未知数个数)。不考虑行的维度的,因为行的维度表示的是样本的个数,而对于pythroch的函数,样本个数是无所谓的,一个也行,一堆也罢,它只关心列的维度。

    最终代码构建的模型如下:(我代码里是多构建了一层,大家也可以多尝试)

    这里注意,虽然这里叫Linear Layer,但是其实,它里面是套了一个激活函数的,所以其实是非线性的,如果是线性的也就不叫神经网络 

     其他的激活函数也可以多试试:

    欢迎大家将自己的设置发到评论区。看看大家预测的效果如何。

    目前还没有对数据进行小批量处理,后续加上。 


    参考资料:

    《PyTorch深度学习实践》完结合集_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1Y7411d7Ys?p=8&vd_source=eb730c561c03cdaf7ce5f40354ca252c

    数据集资源:

    博客:pytorch搭建神经网络最简版配套资源-数据集文档类资源-CSDN文库

  • 相关阅读:
    SwiftUI 4 新功能大全之 Toggle与 Mixed Toggle 多个绑定组件
    CSS——利用HTML+CSS书写移动端页面的相关知识点
    Find My资讯|AirTag 正在帮更多人找到丢失的行李,Find My用处越来越大
    把Mybatis Generator生成的代码加上想要的注释
    【微信小程序开发】页面导航与传参
    [Python画图][科研可视化]小提琴图变形代码实现
    Flink学习4 - 富函数 + 数据重分区操作 + sink 操作(kafka、redis、jdbc)
    AOP原理分析《五》- 增强器的获取细节补充
    苹果macOS电脑版 植物大战僵尸游戏
    HBase 在统一内容平台业务的优化实践
  • 原文地址:https://blog.csdn.net/songhuangong123/article/details/125451218