如何构建识别的神经网络?

摘要: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
阅读全文