神经网络搭建案例
本章通过讲解神经网络搭建案例,演示一个建议的神经网络是如何搭建的
导包
import torch
import torch.nn as nn
from torchsummary import summary # 计算模型参数,查看模型结构
一、搭建神经网络,即:自定义继承:nn.Module
1.代码讲解
1.1 基础结构辨析
class ModelDemo(nn.Module): 定义一个类,这个类继承于nn.Module
nn.Module也是一个类,这里作为父类调用,我们定义的类是建立在这个父类基础之上的
super() 定位当前类的父类;父类 nn.Module 本身有一个初始化函数 init,用来初始化它内部管理参数、网络层的底层结构;因此super().__init__()手动执行一遍父类的初始化流程。
1.2 搭建神经网络与初始化
之后开始搭建神经网络,定义了linear1、linear2、output(这三个都是对象,对象里面有数据,也有方法),并对其进行初始化
1.3 前向传播
x = torch.sigmoid(self.linear1(x)):
self.linear1(x)会进行加权求和;虽然linear1是一个对象,但它继承了执行 nn.Module 父类里的 call 内部逻辑,向这个对象传入参数,就可以执行内部封装好的加权求和公式。
加权求和之后,就会进行sigmoid激活函数,然后继续传入下一个隐藏层
1.4 返回预测值
这个类中的函数会返回最后经过神经网络迭代后的x
2. 代码模块
class ModelDemo(nn.Module):
# todo: 1.1 在init魔法方法中,完成初始化:父类成员,及 神经网络搭建
def __init__(self):
# 1.1 初始化父类成员.(把父类本该自带的基础配置、存储容器、工具功能全部实例化到你的模型对象上;)
super().__init__()
# 1.2 搭建神经网络 ——>隐藏层 + 输入层
# 隐藏层1:输入特征3,输出特征3
self.linear1 = nn.Linear(3,3)
# 隐藏层2:输入特征3,输出特征2
self.linear2 = nn.Linear(3,2)
# 输出层:输入特征2,输出特征2
self.output = nn.Linear(2,2)
# 1.3 对隐藏层进行参数初始化.
# 隐藏层1
nn.init.xavier_normal_(self.linear1.weight)
nn.init.zeros_(self.linear1.bias)
# 隐藏层2
nn.init.kaiming_normal_(self.linear2.weight)
nn.init.zeros_(self.linear2.bias)
# todo: 1.2 前向传播: 输入层——>隐藏层——>输出层
def forward(self, x): #这里的forward是固定的,不能随便改
# 1.1 第一层 隐藏层计算:加权求和 + 激活函数(sigmoid)
# 分解版写法
# x = self.linear1(x) # 加权求和,对输入的x执行之前所定义好的nn.Linear(3,3)模型;也就是拿已经建好的网络层,对输入数据做一次线性变换;
# x= torch.sigmoid(x) # 激活函数
# 合并版写法
x = torch.sigmoid(self.linear1(x))
# 1.2 第2层:隐藏层计算:加权求和 + 激活函数(ReLu)
x = torch.relu(self.linear2(x))
# 1.3 第3层 输出层计算:加权求和 + 激活函数(Softmax)
# dim = -1,表示按行计算,一条样本一条样本的处理
x = torch.softmax(self.output(x), dim=-1)
# 1.4 返回预测值
return x
二、模型训练
1.代码详解
1.1 创建模型对象
我们之前定义了一个类ModelDemo,这是类,相当于一张设计图纸、一个模板,只有结构规则,没有具体数据,不能直接干活。
ModelDemo():对着这张图纸,生产一个实实在在的实体。
my_model =:把生产出来的这个实体,起名叫 my_model。
最终结论:my_model = 实例 / 对象。
1.2 调用神经网络模型 ——>进行模型训练
output = my_model(data):my_model是用类创造出来的一个对象,这个对象继承了父类nn.Module,直接向对象传入参数会自动执行forward方法(nn.Module定义好的);但如果是自己写的,就需要先用.来指定方法传入参数
1.3 计算和查看模型参数
torchsummary.summary 会模拟一次前向传播,顺着 my_model(data) 这条链路走一遍网络,逐层记录每一层:输入输出形状、参数数量、可训练参数量,最后打印整张网络结构总览。
2.代码模块
def train():
# 1.创建模型对象.
my_model = ModelDemo()
# print(f'my_model:{my_model}')
# 2. 创建数据集样本,随机生成
data = torch.randn(size=(5,3))
print(f'data: {data},shape: {data.shape},data.requires_grad:{data.requires_grad}') # 默认False
# 3. 调用神经网络模型 ——>进行模型训练
output = my_model(data) # 底层自动调用了 forward方法() 前向传播
print(f'output:{output}')
print(f'output.shape:{output.shape},output.requires_grad:{output.requires_grad}')
# 4. 计算和查看模型参数
print('========计算模型参数=========')
# 参1:(神经网络模型对象),参2:输入数据维度(5行3列)
summary(my_model, input_size=(5,3))
print('========查看模型参数=========')
for name,param in my_model.named_parameters():
print(f'name:{name},param:{param}')
print('\n')
三、测试
if __name__ == '__main__':
train()

浙公网安备 33010602011771号