震惊!用PyTorch搭建神经网络竟然如此简单






震惊!用PyTorch搭建神经网络竟然如此简单

小果  生信果  2024-03-19 19:01:10

前言
小果在《Sora模型已经诞生了,你还不会PyTorch吗?抓紧时间上车,驶入机器学习的快车道介绍了机器学习的主流框架PyTorch及其优势,引用了以往的数据统计说明PyTorch的应用趋势上升,教了大家操作张量的方法,不知大家掌握得如何?本期小果继续带领大家学习机器学习框架PyTorch,这次我们要动手搭建一个简单的神经网络。
在1980年前后,机器学习开始兴起,关于机器学习的算法有很多种,比如:线性回归、逻辑回归、支持向量机和随机森林等,但此时机器学习并没有真正地广泛应用到不同行业。直到有一种新的算法应运而生,并随着硬件的发展而开始大显神通,改变了时代。这种算法就是神经网络,是机器学习的重要分支,也是当代机器学习算法中最流行且最强大的算法。近年来火爆的ChatGPT原理的核心正是神经网络模型,再一次向世人展现神经网络的无限潜力。神经网络在生物信息领域有着广阔的应用前景,比如生物医学上,可以将神经网络算法与实验方法相结合,能够大幅提高药物组合发现的可能性。
对有志从事生信行业的小伙伴而言,学会熟练使用PyTorch搭建神经网络,可以提高科研的效率,有助于早日成为生物信息学人才。
本次介绍的PyTorch训练神经网络模型的过程比较消耗时间,而机器学习领域的数据集往往非常庞大,也会增加时间的开销,对愿意研究机器学习的生信小伙伴来说,推荐使用服务器效率更高,欢迎联系小果租赁性价比居高的服务器哦!



公众号后台回复“111”

领取本篇代码、基因集或示例数据等文件

文件编号:24314

需要租赁服务器的小伙伴可以扫码添加小果,此外小果还提供生信分析,思路设计,文献复现等,有需要的小伙伴欢迎来撩~


正文
相信对神经网络有兴趣的小伙伴或多或少了解过它的基本概念,我们直接来学习搭建一个简单的神经网络。
首先,小果导入csv文件处理模块csv、torch框架的张量函数tensor和神经网络模块nn、optim优化器模块的SGD算法和matplotlib中的绘图模块pyplot。    
import csv#csv文件处理模块from torch import tensor,nn#分别导入转化张量的函数和神经网络模块from torch.optim import SGD#导入optim优化器模块的SGD算法import matplotlib.pyplot as plt#导入绘图模块  
接下来,小果引用加州大学欧文分校(UCI)信息与计算机科学学院提供的鲍鱼数据集,数据的变量基本情况如下图所示,小果将鲍鱼的整体重量作为自变量,将风干后的外壳重量作为因变量。
小果通过reader函数读取数据集,并将鲍鱼的整体重量和风干后的壳重分别保存在x_dataset和y_dataset的列表,注意要先将数据转化为浮点型,因为字符串数据不能直接转化为张量。接着,再用tensor函数将列表转化为张量。由于线性层的输入和输出通常至少是二阶张量,小果通过view方法改变为二阶维度是1的张量,分别保留在x和y中。
#1.数据集预处理x_dataset,y_dataset=[],[]    with open('data/abalone/abalone.data', newline='') as file:    dataset = csv.reader(file, delimiter=',')    for row in dataset:        x_dataset.append(float(row[4]))        y_dataset.append(float(row[-2]))           x=tensor(x_dataset).view(-1,1)y=tensor(y_dataset).view(-1,1)
为简单起见,小果搭建了单层神经网络,它只有线性层,可以通过nn模块的Linear类实现的,小果将输入和输出都置为1,在forward方法里调用,注意__init__方法和forword方法会在神经网络实例化后被自动调用。
#2.定义模型class MyLinear(nn.Module):    def __init__(self):        super(MyLinear,self).__init__()        self.linear=nn.Linear(1,1)               def forward(self,x):        out=self.linear(x)        return out
瞧,一个单层神经网络就搭建完成了,是不是特别简单呢?
搭建好神经网络后,小果将神经网络模型、优化器和损失函数实例化,这里SGD优化器的参数是权重、偏置和学习率,权重和偏置通过parameters()方法随机生成,学习率lr设置为0.001,损失函数的计算方式选择了均方误差MSE。
#3.模型、优化器、loss实例化my_linear=MyLinear()optimizer=SGD(my_linear.parameters(),lr=0.001)loss_fn=nn.MSELoss(),
小果用随机梯度下降法对神经网络进行训练,次数是5000。在每次训练时,将x输入神经网络计算预测值,再将预测值和y输入损失函数计算损失loss,并把优化器梯度置为0,进行反向传播计算各参数的梯度,最后更新优化器的参数,重复迭代。在训练过程中,模型每训练100轮,输出当前损失、权重和偏置。    
#4.循环,进行梯度下降,更新参数for i in range(5000):    y_predict=my_linear(x)    loss=loss_fn(y_predict,y)    optimizer.zero_grad()#梯度置为0    loss.backward()#反向传播    optimizer.step()#参数更新    if i%100==0:        params=list(my_linear.parameters())        print(f'loss={loss.item()} w、b={params[0].item(),params[1].item()}')
训练结束后,我们来看看训练神经网络中的部分损失变化情况,不难看出损失越来越小,下降趋势在逐渐减缓,说明收敛速度快,训练效果还不错。
我们再来看看训练后的模型对数据的拟合程度。
小果用pyplot模块绘制图表,先配置图表的字体和坐标轴,用title函数设置标题,用xlabel函数和ylabel函数分别设置x轴和y轴的名称,然后用scatter函数和plot函数分别绘制实际数据的散点图和模型预测数据的折线图,注意这两个函数的输入必须是一阶numpy类型,这里detach函数用去除张量的梯度,最后用savefig函数保存图片,通过show函数展示图片。    
#4.查看模型训练结果plt.rcParams['font.sans-serif']=['SimHei']#黑体,显示中文plt.rcParams['axes.unicode_minus'] = False#运行配置参数总的轴(axes)正常显示正负号plt.title('线性回归模型')plt.xlabel('整体重量')plt.ylabel('壳重')plt.scatter(x.numpy().reshape(-1),y.numpy().reshape(-1))plt.plot(x.numpy().reshape(-1),y_predict.detach().numpy().reshape(-1),c='r')plt.savefig('output/result.png')plt.show()
怎么样?是不是很惊讶呢?单层神经网络训练的结果竟然能拟合实际数据的整体趋势!So easy!
训练结果稍差的小伙伴不必灰心,你可以多运行几次,或者增加训练次数,相信你也能最终得到你想要的效果。还没搭建神经网络的小伙伴赶快动手试试吧~    
如果各位小伙伴们觉得自己运行机器学习的代码太麻烦,那就快来使用我们的云生信小工具吧,你可以找到你想要的机器学习算法,非常方便,记住!要使用我们的云生信链呀!
附上链接:http://www.biocloudservice.com/home.html
 

小果还提供思路设计、定制生信分析、文献思路复现;有需要的小伙伴欢迎直接扫码咨询小果,竭诚为您的科研助力!


定制生信分析

服务器租赁

扫码咨询小果


往期回顾

01

1024G存储的生信服务器,两人成团,1人免单!

02

单个数据库用腻了?多数据库“组合拳”带你打开免疫浸润新思路!

03

孟德尔随机化的准备工作,GWAS数据的网站下载方法

04

跟着小果学复现-手把手带你拿下IF=46.9Nature 级别的主成分分析(PCA)图!!