pytorch实现前馈神经网络实验(torch实现)
手动实现请参考:https://blog.csdn.net/qq_37534947/article/details/109394648
二:“利用torch.nn实现前馈神经网络解决回归、二分类、多分类任务”实验
注: 因为相比于手动实验其主要是在模型的构建中利用了torch.nn模块,其他的部分都是一样的,这里我主要介绍如何利用torch模块构建的模型。
2.1“利用torch.nn实现前馈神经网络解决回归”实验
实验过程:
2.1.1 利用torch.nn构建模型以及初始化参数
1. #实现FlattenLayer层
2. class FlattenLayer(torch.nn.Module):
3. def __init__(self):
4. super(FlattenLayer, self).__init__()
5. def forward(self, x):
6. return x.view(x.shape[0],-1)
7.
8. #模型定义和参数初始化
9. num_hiddens,num_outputs = 256,1
10. net = nn.Sequential(
11. FlattenLayer(),
12. nn.Linear(num_inputs,num_hiddens),
13. nn.ReLU(),
14. nn.Linear(num_hiddens,num_outputs)
15. )
16.
17. for params in net.parameters():
18. init.normal_(params,mean=0,std=0.01)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
注:这里我使用的是torch.nn.Sequential()来快速构建前馈神经网络,没有使用torch.nn.Moudle,因为对于此模型比较简单,所以使用前者来构建的话相比于后者更简洁和方便,可以从定义中看到其网络主要分为输入层、隐藏层、ReLU激活函数、输出层,并且每层的神经元个数都是和手动实现的一样的;另外,对于参数的初始化主要也是用的是torch.nn.init模块,其初始值同样属于均值为零,标准差为0.01。
2.1.2 定义损失函数和优化器
1. lr = 0.01
2. #损失函数和优化器
3. loss = torch.nn.MSELoss()
4. optimizer = torch.optim.SGD(net.parameters(),lr)
- 1
- 2
- 3
- 4
注:同理,因为属于回归问题,这里使用的是最小化均方误差,另外对于优化器,也是使用的是小批量梯度梯度下降,只是这里使用的是torch模块中。
2.1.3定义训练模型
注:这里和4之前手动的定义训练模型是一样的,因为在定义函数的时候,我们直接考虑了手动实现和利用torch模块实现,所以只是在训练时传的参数有所区分即可,这里就不加赘述。
2.2“手动实现前馈神经网络解决二分类”实验
注:同理,因为相比于手动实验其主要是在模型的构建中利用了torch.nn模块,其他的部分都是一样的,这里我主要介绍如何利用torch模块构建的模型。
实验过程:
2.2.1利用torch.nn构建模型以及初始化参数
1. #实现FlattenLayer层
2. class FlattenLayer(torch.nn.Module):
3. def __init__(self):
4. super(FlattenLayer, self).__init__()
5. def forward(self, x):
6. return x.view(x.shape[0],-1)
7.
8. #模型定义和参数初始化
9. num_hiddens,num_outputs = 256,1
10. net = nn.Sequential(
11. FlattenLayer(),
12. nn.Linear(num_inputs,num_hiddens),
13. nn.ReLU(),
14. nn.Linear(num_hiddens,num_outputs)
15. )
16.
17. for params in net.parameters():
18. init.normal_(params,mean=0,std=0.01)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
注:同理,这里我使用的是torch.nn.Sequential()来快速构建前馈神经网络,没有使用torch.nn.Moudle,因为对于此模型比较简单,所以使用前者来构建的话相比于后者更简洁和方便,可以从定义中看到其网络主要分为输入层、隐藏层、ReLU激活函数、输出层,并且每层的神经元个数都是和手动实现的一样的;另外,对于参数的初始化主要也是用的是torch.nn.init模块,其初始值同样属于均值为零,标准差为0.01。
2.2.2 定义损失函数和优化器
1. lr = 0.01
2. #定义交叉熵损失函数
3. loss = torch.nn.BCEWithLogitsLoss()
4. optimizer = torch.optim.SGD(net.parameters(),lr)
- 1
- 2
- 3
- 4
注:同理,因为属于二分类问题,这里使用的是交叉熵损失误差,另外对于优化器,也是使用的是小批量梯度梯度下降,只是这里使用的是torch模块中的。
2.2.3 定义训练模型函数
注:这里和手动的定义模型函数是一样的,因为在定义函数的时候,我们直接考虑了手动实现和利用torch模块实现,所以只是在训练时传的参数有所区分即可,这里就不加赘述。
2.3“手动实现前馈神经网络解决多分类”实验
注:同理,因为相比于手动实验其主要是在模型的构建中利用了torch.nn模块,其他的部分都是一样的,这里我主要介绍如何利用torch模块构建的模型.
实验过程:
2.3.1 利用torch.nn构建模型以及初始化参数
19. #实现FlattenLayer层
20. class FlattenLayer(torch.nn.Module):
21. def __init__(self):
22. super(FlattenLayer, self).__init__()
23. def forward(self, x):
24. return x.view(x.shape[0],-1)
25.
26. #模型定义和参数初始化
27. num_inputs,num_hiddens,num_outputs = 784,256,10
28. net = nn.Sequential(
29. FlattenLayer(),
30. nn.Linear(num_inputs,num_hiddens),
31. nn.ReLU(),
32. nn.Linear(num_hiddens,num_outputs)
33. )
34.
35. for params in net.parameters():
36. init.normal_(params,mean=0,std=0.01)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
注:同理,这里我使用的是torch.nn.Sequential()来快速构建前馈神经网络,没有使用torch.nn.Moudle,可以从定义中看到其网络主要分为输入层、隐藏层、ReLU激活函数、输出层,并且每层的神经元个数都是和手动实现的一样的,分别是784,256,10;另外,对于参数的初始化主要也是用的是torch.nn.init模块,其初始值同样属于均值为零,标准差为0.01。
2.3.2 定义损失函数和优化器
5. lr = 0.01
6. #定义交叉熵损失函数
7. loss = torch.nn. CrossEntropyLoss ()
8. optimizer = torch.optim.SGD(net.parameters(),lr)
- 1
- 2
- 3
- 4
注:同理,因为属于多分类问题,这里使用的是交叉熵损失误差,另外对于优化器,也是使用的是小批量梯度梯度下降,只是这里使用的是torch模块中的。
2.3.3定义训练模型函数
注:这里和手动的定义模型函数是一样的,因为在定义函数的时候,我们直接考虑了手动实现和利用torch模块实现,所以只是在训练时传的参数有所区分即可,这里就不加赘述。
torch实现代码下载:
https://download.csdn.net/download/qq_37534947/13081252
文章来源: blog.csdn.net,作者:Studying_swz,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/qq_37534947/article/details/109402126
- 点赞
- 收藏
- 关注作者
评论(0)