手机网站会员识别功能,官网网站系统,wordpress字体替换,网页设计模板html代码表格代码以及视频讲解
本文所涉及所有资源均在传知代码平台可获取
从零开始构建你的第一个神经网络
在本教程中#xff0c;我们将使用PyTorch框架从零开始构建一个简单的卷积神经网络#xff08;CNN#xff09;#xff0c;用于图片二分类任务。CNN 是一种深度学习模型#…代码以及视频讲解
本文所涉及所有资源均在传知代码平台可获取
从零开始构建你的第一个神经网络
在本教程中我们将使用PyTorch框架从零开始构建一个简单的卷积神经网络CNN用于图片二分类任务。CNN 是一种深度学习模型特别适用于图像数据。本文将详细介绍如何一步步搭建一个包含4-5层的CNN并训练它来分类图像。
1.准备工作
在开始之前需要一些必要的库本教程中使用的库的版本如下
packageversionpython3.8.0torch1.13.0scikit-learn1.1.3numpy1.20.1matplotlib3.3.4
本软件包均是在anaconda虚拟环境中安装的。如果还没该虚拟环境还需要创建一下才可以。准备工作完成后就可以开始正式的神经网络搭建了。
2.数据集准备
在本教程中我们使用1元与100元人民币两个类别。其数据集存放格式如下图所示
一共分为三个部分train、test和val即训练验证和测试。“1”和“100”文件夹下面就是数据集图片。下面就来对数据集进行处理
首先导入必要的包和进行数据的预处理
#导入包
import torch
import torchvision
import torchvision.transforms as transforms
#数据预处理
transform transforms.Compose([transforms.Resize((64, 64)),transforms.ToTensor(),transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
])加载数据集
train_data_path 02-01-data-RMB_data/train # 数据集存放的相对路径
trainset datasets.ImageFolder(roottrain_data_path, transformtransform)
trainloader DataLoader(trainset, batch_size4, shuffleTrue)val_data_path 02-01-data-RMB_data/val
valset datasets.ImageFolder(rootval_data_path, transformtransform)
valloader DataLoader(valset, batch_size4, shuffleFalse)classes trainset.classes # 获取类别名这里为“1”和“100”我们可以使用torchvision.datasets.ImageFolder来加载这些数据。ImageFolder会根据目录名自动将图像归类。
3.定义卷积神经网络结构并实例化模型
接下来我们将定义一个简单的卷积神经网络。该网络将包含两个卷积层每层后接池化层和两个全连接层。
# 定义卷积神经网络
class SimpleCNN(nn.Module):def __init__(self, num_classes):super(SimpleCNN, self).__init__()self.conv1 nn.Conv2d(3, 16, 3, padding1) #彩色图片输入通道为3RGB输出为16self.pool nn.MaxPool2d(2, 2)self.conv2 nn.Conv2d(16, 32, 3, padding1)self.fc1 nn.Linear(32 * 16 * 16, 120)self.fc2 nn.Linear(120, num_classes)def forward(self, x):x self.pool(F.relu(self.conv1(x)))x self.pool(F.relu(self.conv2(x)))x x.view(-1, 32 * 16 * 16) #展平操作成为1维x F.relu(self.fc1(x))x self.fc2(x)return x# 实例化模型
num_classes len(classes)
net SimpleCNN(num_classes).to(device)上述网络结构中nn.Conv2d(3, 16, 3, padding1) 表明彩色图片输入通道为3RGB输出为16这里16可以自己定义但是要与下一卷积层的输入通道数相同。16后面的3为卷积核大小即为3*3卷积。
4.训练和验证模型
4.1.配置训练参数
在开始训练之前我们需要定义损失函数和优化器。这里我们将使用交叉熵损失函数和随机梯度下降SGD优化器。 这里不同的损失函数和不同的优化器也会影响模型最终的效果。比如可以使用Adam、AdamW等优化器。
# 定义损失函数和优化器
criterion nn.CrossEntropyLoss()
optimizer optim.SGD(net.parameters(), lr0.001, momentum0.9)4.2 模型训练与验证
# 存储训练损失和验证损失
train_losses []
val_losses []# 训练模型并记录损失和准确率
for epoch in range(10):net.train()running_loss 0.0correct 0total 0for i, data in enumerate(trainloader, 0):inputs, labels data# 将输入和标签移动到GPUinputs, labels inputs.to(device), labels.to(device)optimizer.zero_grad()outputs net(inputs)loss criterion(outputs, labels)loss.backward()optimizer.step()running_loss loss.item()_, predicted torch.max(outputs.data, 1)total labels.size(0)correct (predicted labels).sum().item()train_loss running_loss / len(trainloader)train_accuracy 100 * correct / totaltrain_losses.append(train_loss)# 验证模型net.eval()val_loss 0.0correct 0total 0with torch.no_grad():for data in valloader:images, labels data# 将输入和标签移动到GPUinputs, labels inputs.to(device), labels.to(device)outputs net(images)loss criterion(outputs, labels)val_loss loss.item()_, predicted torch.max(outputs.data, 1)total labels.size(0)correct (predicted labels).sum().item()val_loss val_loss / len(valloader)val_accuracy 100 * correct / totalval_losses.append(val_loss)print(fEpoch [{epoch 1}/10], Train Loss: {train_loss:.4f}, Train Accuracy: {train_accuracy:.2f}%, Val Loss: {val_loss:.4f}, Val Accuracy: {val_accuracy:.2f}%)print(Finished Training)
#保存模型在本地
model_save_path simple_cnn.pth
torch.save(net.state_dict(), model_save_path)
print(fModel saved to {model_save_path})在这里我们将训练模型10个epoch并在每个epoch结束后输出损失和准确率可以看到每一个epoch上的结果。 训练过程如下图
5.性能评估与模型测试
5.1 性能评估 绘制loss曲线 # 绘制损失曲线
plt.figure()
plt.plot(train_losses, labelTrain Loss)
plt.plot(val_losses, labelValidation Loss)
plt.xlabel(Epoch)
plt.ylabel(Loss)
plt.title(Loss Curve)
plt.legend()
plt.show() 查看结果 绘制混淆矩阵 # 混淆矩阵
net.eval()
all_preds []
all_labels []
with torch.no_grad():for data in valloader:images, labels dataoutputs net(images)_, predicted torch.max(outputs.data, 1)all_preds.extend(predicted.cpu().numpy())all_labels.extend(labels.cpu().numpy())# 生成混淆矩阵
cm confusion_matrix(all_labels, all_preds)
disp ConfusionMatrixDisplay(confusion_matrixcm, display_labelsclasses)# 绘制混淆矩阵
plt.figure()
disp.plot(cmapplt.cm.Blues)
plt.title(Confusion Matrix)
plt.show()在val文件夹中1和100的数量都是19所以做到了100%的准确率。
5.2 模型测试
在第四步中我们将训练好的模型进行了保存那么这里我们将模型加载出来对test数据集进行测试看看模型效果如何。这里我们需要加载训练好的模型进行测试。
# 加载模型权重
model_path simple_cnn.pth
net.load_state_dict(torch.load(model_path))# 将模型移动到设备上
net.to(device)# 设置模型为评估模式
net.eval()# 加载测试集
test_data_path 02-01-data-RMB_data/test
testset datasets.ImageFolder(roottest_data_path, transformtransform)
testloader DataLoader(testset, batch_size4, shuffleFalse)# 预测并输出结果
all_preds []
all_labels []
with torch.no_grad():for data in testloader:images, labels data# 将数据移动到GPUimages, labels images.to(device), labels.to(device)outputs net(images)_, predicted torch.max(outputs.data, 1)all_preds.extend(predicted.cpu().numpy())all_labels.extend(labels.cpu().numpy())# 你可以在这里处理预测结果比如输出预测值或计算准确率
correct sum(1 for x, y in zip(all_preds, all_labels) if x y)
total len(all_labels)
accuracy correct / total * 100print(fTest Accuracy: {accuracy:.2f}%)完整代码和数据集在附件中可以自行查看。 6.总结
在本教程中我们从零开始构建了一个简单的卷积神经网络并用它来完成图片的二分类任务。我们介绍了如何定义网络结构如何训练和评估模型并讨论了进一步优化模型的方法。
接下来你可以尝试扩展网络的深度或宽度使用更大的数据集或者使用迁移学习等技术来提升模型的性能。祝你学习愉快
源码下载