如何构建识别的神经网络?
摘要:import torch.nn as nn class Net(nn.Module): """ 定义一个简单点的神经网络,卷积,池化,激活,全连接 嗯.....够
import torch.nn as nn
class Net(nn.Module):
"""
定义一个简单点的神经网络,卷积,池化,激活,全连接 嗯.....够简单了!
输入的话就64*64的图片吧,通道数为3,卷积核为2,padding为1吧,这样的话就是
: (3, 64, 64)
卷积核为2,padding为1,输出通道数为64,这样的话就是
: (64, 64, 64)
池化核为2,输出通道数为64,这样的话就是
: (64, 32, 32)
全连接层的话就32*32*64=65536个神经元,输出10个类别的概率
"""
def __init__(self):
super(Net, self).__init__()
self.conv1 = nn.Conv2d(in_channels=3, out_channels=64, kernel_size=2, padding=1)
self.pool = nn.MaxPool2d(kernel_size=2)
self.relu = nn.ReLU()
self.fc = nn.Linear(in_features=64*32*32, out_features=10)
self.dropout = nn.Dropout(0.5) # 随机失活,防止过拟合
# 接下来的话就是定义前向传播了!
def forward(self, x):
x = self.conv1(x)
x = self.pool(x)
x = self.relu(x)
x = x.view(-1, 64*32*32) # 这里的-1就是让Pytorch自动计算这个维度的值
x = self.fc(x)
x = self.dropout(x)
return x
"""
这里就是定义了前向传播,这里就是将输入的图片进行卷积,然后进行池化,然后进行激活,然后进行全连接,然后返回结果
"""
# 实例化模型,看看效果吧
net = Net()
print(net)
import torch
# 创建一个简单的64*64的图片张量
array = torch.rand(64, 3, 64, 64)
# 创建目标标签(假设是10分类问题)
target = torch.randint(0, 10, (64,))
# 超参数定义
echo = 100
lr = 0.001
optimizer = torch.optim.SGD(net.parameters(), lr=lr) # 优化器
"""
简单的训练过程实现
:
"""
for i in range(echo):
# 设置模型为训练模式
net.train()
output = net(array)
# 定义损失函数
criterion = nn.CrossEntropyLoss() # 损失函数
loss = criterion(output, target) # 计算损失
optimizer.zero_grad() # 梯度清零
loss.backward() # 反向传播
optimizer.step() # 更新参数
# 反向传播
print(f"第{i+1}轮训练,损失值: {loss.item():.4f}")
print("反向传播完成,梯度已计算")
# 保存模型
torch.save(net.state_dict(), 'model.pth')
# 测试
net.eval()
# 加载模型
model = Net()
model.load_state_dict(torch.load('model.pth'))
model.eval()
# 测试数据
test_array = torch.rand(1, 3, 64, 64)
with torch.no_grad():
output = model(test_array)
print(output)
print(f"当前模型预测的类别是: {torch.argmax(output, di
