使用pytorch搭建简单CNN

下载安装

pytorch官网上给出了通过pip,conda安装的命令,由于国内网络的原因,pip需要镜像。有CUDA版本和CPU版本的。安装anaconda可以方便地使用许多独立的python环境,在pycharm里可以直接切换使用的conda环境。直接使用conda安装pytorch不需要翻墙,会下载torch和torchvison,torchvision主要是跟图像有关的库,有训练的数据集和训练好的模型等。

使用CNN训练

定义几个全局变量,epoch是训练的次数,因为我用的cpu训练很慢就设为1了,batch_size是分批训练,每批的数据个数,lr是学习率,这里使用的是MNIST数据,如果之前没有下载过,就把这个设成True,如果已经下载过就设成False。

EPOCH = 1            
BATCH_SIZE = 50
LR = 0.001
DOWNLOAD_MNIST = False

train是使用数据集的training data,然后将其转换为tensor(CWH)的形式,如果下载过就不用下载了。

train_data = torchvision.datasets.MNIST(
    root='./mnist/',
    train=True,                                     
    transform=torchvision.transforms.ToTensor(),
    download=DOWNLOAD_MNIST,
)

有60000个训练数据,是28*28像素的灰度图。
在这里插入图片描述

把数据放到dataloader里,以便进行批训练,shuffle参数是是否打乱顺序。

train_loader = Data.DataLoader(dataset=train_data, batch_size=BATCH_SIZE, shuffle=True)

搭建神经网络,首先是一个卷积层,接一个ReLU激活函数,接一个池化层,卷积层将维度提升到了16维,padding是(kernel_size-1)/2这样保持图片大小不变,因此一开始是12828卷积之后是162828,池化之后是161414。之后再连接的卷积层有32个filter,padding还是2,因此变为321414,池化之后变为3277。最后输出层要把它拉直作为一个线性的变量去求。

class CNN(nn.Module):
    def __init__(self):
        super(CNN, self).__init__()
        self.conv1 = nn.Sequential(         
            nn.Conv2d(
                in_channels=1,              
                out_channels=16,            
                kernel_size=5,              
                stride=1,                   
                padding=2,                  
            ),                              
            nn.ReLU(),                      
            nn.MaxPool2d(kernel_size=2),    
        )
        self.conv2 = nn.Sequential(         
            nn.Conv2d(16, 32, 5, 1, 2),     
            nn.ReLU(),                      
            nn.MaxPool2d(2),                
        )
        self.out = nn.Linear(32 * 7 * 7
### 使用PyTorch构建卷积神经网络(CNN)进行图像分类的最佳实践 #### 1. 数据准备 在使用PyTorch构建CNN模型之前,数据集的准备工作至关重要。通常需要对原始图像进行预处理操作,如调整尺寸、归一化以及增强数据以提高模型的鲁棒性和准确性[^2]。 ```python import torch from torchvision import datasets, transforms transform = transforms.Compose([ transforms.Resize((64, 64)), # 调整图像大小 transforms.ToTensor(), # 将图像转换为张量 transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) # 归一化 ]) train_dataset = datasets.ImageFolder(root='path_to_train_data', transform=transform) test_dataset = datasets.ImageFolder(root='path_to_test_data', transform=transform) train_loader = torch.utils.data.DataLoader(dataset=train_dataset, batch_size=32, shuffle=True) test_loader = torch.utils.data.DataLoader(dataset=test_dataset, batch_size=32, shuffle=False) ``` #### 2. 定义CNN模型结构 定义一个简单CNN模型用于图像分类任务。该模型可以包括多个卷积层、池化层和全连接层[^1]。 ```python import torch.nn as nn import torch.nn.functional as F class CNNModel(nn.Module): def __init__(self): super(CNNModel, self).__init__() # 卷积层 self.conv1 = nn.Conv2d(in_channels=3, out_channels=16, kernel_size=3, padding=1) self.conv2 = nn.Conv2d(in_channels=16, out_channels=32, kernel_size=3, padding=1) self.pool = nn.MaxPool2d(kernel_size=2, stride=2) # 全连接层 self.fc1 = nn.Linear(32 * 16 * 16, 128) # 假设输入图片经过两次池化后变为 (32, 16, 16) self.fc2 = nn.Linear(128, 2) # 输出类别数为2(猫/狗) 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) # 展平 x = F.relu(self.fc1(x)) x = self.fc2(x) return x model = CNNModel() ``` #### 3. 设置损失函数与优化器 为了训练模型,需设置合适的损失函数和优化算法。对于二分类问题,常用的损失函数是交叉熵损失;Adam是一种高效的梯度下降优化方法。 ```python criterion = nn.CrossEntropyLoss() # 损失函数 optimizer = torch.optim.Adam(model.parameters(), lr=0.001) # 优化器 ``` #### 4. 训练过程 通过迭代数据加载器中的批次数据完成模型训练。每次前向传播计算预测值并评估误差,随后反向传播更新权重参数[^3]。 ```python num_epochs = 10 for epoch in range(num_epochs): model.train() running_loss = 0.0 for images, labels in train_loader: optimizer.zero_grad() outputs = model(images) loss = criterion(outputs, labels) loss.backward() optimizer.step() running_loss += loss.item() print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {running_loss/len(train_loader):.4f}') ``` #### 5. 测试与验证 利用测试集评估模型性能,记录准确率或其他评价指标作为最终结果的一部分。 ```python correct = 0 total = 0 model.eval() with torch.no_grad(): for images, labels in test_loader: outputs = model(images) _, predicted = torch.max(outputs.data, 1) total += labels.size(0) correct += (predicted == labels).sum().item() print(f'Test Accuracy of the Model on Test Images: {(100 * correct / total):.2f}%') ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值