利用torch.nn实现前馈神经网络解决 多分类 任务使用至少三种不同的激活函数
2022-03-08 17:46
911 查看
1 导入包
import torch import numpy as np import torch.nn as nn from torch.utils.data import TensorDataset,DataLoader import torchvision from IPython import display from torchvision import transforms
2 加载数据
mnist_train = torchvision.datasets.MNIST(root='./datasets/',download = True,train = True,transform = transforms.ToTensor()) mnist_test = torchvision.datasets.MNIST(root='./datasets/',download = True,train = False,transform = transforms.ToTensor()) batch_size = 256 train_iter = DataLoader(dataset = mnist_train,shuffle = True,batch_size = batch_size) test_iter = DataLoader(dataset = mnist_test,shuffle = True,batch_size = batch_size)
3 定义平铺层
class FlattenLayer(torch.nn.Module): def __init__(self): super(FlattenLayer, self).__init__() def forward(self, x): return x.view(x.shape[0],784)
4 模型选择
num_input,num_hidden1,num_hidden2,num_output = 28*28,512,256,10 def choose_model(model_type): if model_type =='ReLU': activation = nn.ReLU() elif model_type =='ELU': activation = nn.ELU() else: activation = nn.Sigmoid() model = nn.Sequential() model.add_module("flatten",FlattenLayer()) model.add_module("linear1",nn.Linear(num_input,num_hidden1)) model.add_module("activation",activation) model.add_module("linear2",nn.Linear(num_hidden1,num_hidden2)) model.add_module("activation",activation) model.add_module("linear3",nn.Linear(num_hidden2,num_output)) return model model = choose_model('ReLU') print(model)
5 参数初始化
# for param in model.parameters(): # nn.init.normal_(param,mean=0,std=0.001) for m in model.modules(): if isinstance(m, nn.Linear): nn.init.xavier_uniform_(m.weight) nn.init.constant_(m.bias, 0.1)
6 定义训练函数
def train(net,train_iter,test_iter,loss,num_epochs): train_ls,test_ls,train_acc,test_acc = [],[],[],[] for epoch in range(num_epochs): train_ls_sum,train_acc_sum,n = 0,0,0 for x,y in train_iter: y_pred = net(x) l = loss(y_pred,y) optimizer.zero_grad() l.backward() optimizer.step() train_ls_sum +=l.item() train_acc_sum += (y_pred.argmax(dim = 1)==y).sum().item() n += y_pred.shape[0] train_ls.append(train_ls_sum) train_acc.append(train_acc_sum/n) test_ls_sum,test_acc_sum,n = 0,0,0 for x,y in test_iter: y_pred = net(x) l = loss(y_pred,y) test_ls_sum +=l.item() test_acc_sum += (y_pred.argmax(dim = 1)==y).sum().item() n += y_pred.shape[0] test_ls.append(test_ls_sum) test_acc.append(test_acc_sum/n) print('epoch %d, train_loss %.6f,test_loss %f, train_acc %.6f,test_acc %f' %(epoch+1, train_ls[epoch],test_ls[epoch], train_acc[epoch],test_acc[epoch])) return train_ls,test_ls,train_acc,test_acc_sum
7 定义损失函数和优化器
#训练次数和学习率 num_epochs = 20 lr = 0.01 loss = nn.CrossEntropyLoss() optimizer = torch.optim.SGD(model.parameters(),lr=lr)
8 模型训练
train_loss,test_loss,train_acc,test_acc = train(model,train_iter,test_iter,loss,num_epochs)
相关文章推荐
- Atitit 三种并发编程模型 艾龙 attilax总结 1. 并发系统可以使用不同的并发模型去实现。 1 2. 并行工作者 并行工作者模型。进来的任务分配给不同的工作者 银行模式 2 2.1.
- 感知机相关;利用tensorflow等工具定义简单的几层网络(激活函数sigmoid),递归使用链式法则来实现反向传播。
- 使用pytorch快速搭建神经网络实现二分类任务(包含示例)
- C++第六周任务5:解决用一个项目多个文件的方式实现,其中两个类的声明放在一个.h文件中,每个类的成员函数分别放一个文件,main()函数用一个文件。体会这样安排的优点。
- VB使用Bitblt等函数,源图片不完全显示导致不能实现功能的解决办法
- 【COCOS2DX-LUA 脚本开发之六】利用Lua强转函数解决使用CCNode报错或无法正常使用以及简单介绍 quick-cocos2d-x 与 OpenQuick 两款Lua免费开源框架
- [置顶] spring mvc 利用maven实现不同环境使用不同配置文件
- 利用Lua强转函数解决使用CCNode报错或无法正常使用以及简单介绍 quick-cocos2d-x 与 OpenQuick 两款Lua免费开源框架
- 利用maven的filter和profile实现不同环境使用不同的配制
- 利用pytorch 做一个简单的神经网络实现sklearn库中莺尾花的分类
- Android 学习笔记之AndBase框架学习(四) 使用封装好的函数实现单,多线程任务
- 利用函数递归实现无限分类
- 如何基于TensorFlow使用LSTM和CNN实现时序分类任务
- 利用指针解决有关方法函数中数字,数组,以及字符串的调用(方法函数中不同类型参量的调用)
- 使用std::function来实现不同类的函数回调
- ant 的ftp任务使用,实现自动备份等,解决中文问题
- 【COCOS2DX-LUA 脚本开发之六】利用Lua强转函数解决使用CCNode报错或无法正常使用以及简单介绍 quick-cocos2d-x 与 OpenQuick 两款Lua免费开源框架
- 将任务4的解决用一个项目多个文件的方式实现,其中两个类的声明放在一个.h文件中,每个类的成员函数分别放一个文件,main()函数用一个文件。
- 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了;面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为(转)
- 利用RunTime实现iOS不同版本下使用不同的图片