NN第一个网络训练模型

本文的主要目的是针对初学者,完成第一个网络模型训练的操作示意,在此基础上,后学者可以按照套路训练不同的模型。 代码如下:

import torch
import torch.nn as nn
from torch.nn import Sequential, Conv2d, MaxPool2d, Linear, Flatten


# 定义网络
class MyCifar10(nn.Module):
    def __init__(self):
        super(MyCifar10, self).__init__()
        self.model = Sequential(
            Conv2d(3, 32, 5, padding=2),
            MaxPool2d(2),
            Conv2d(32, 32, kernel_size=5, padding=2),
            MaxPool2d(2),
            Conv2d(32, 64, kernel_size=5, padding=2),
            MaxPool2d(2),
            Flatten(),
            # 64*4*4
            Linear(64 * 4 * 4, 64),
            Linear(64, 10)
        )

    def forward(self, x):
        return self.model(x)

# 测试网络
if __name__ == '__main__':
    model = MyCifar10()
    input = torch.ones(64, 3, 32, 32)
    output = model(input)
    print(output.shape)
import torch
import torchvision
from torch.nn import Sequential, Conv2d, MaxPool2d, Linear, Flatten
from torch.utils.data import DataLoader

import torch.nn as nn
from torch.utils.tensorboard import SummaryWriter

from MyCifar10Model import MyCifar10

# 用cifar10的测试和训练集数据
train_data = torchvision.datasets.CIFAR10("cifar10", train=True, transform=torchvision.transforms.ToTensor(),
                                          download=True)
test_data = torchvision.datasets.CIFAR10("cifar10", train=False, transform=torchvision.transforms.ToTensor(),
                                         download=True)

train_dataloader = DataLoader(train_data, batch_size=64)
test_dataloader = DataLoader(test_data, batch_size=64)

# create net model
model = MyCifar10()

# define loss func
loss_fn = nn.CrossEntropyLoss()

# optimizer
learn_rate = 1e-2
optimizer = torch.optim.SGD(model.parameters(), learn_rate)

epochs = 2
train_step = 0
test_step = 0

# 画图
writer = SummaryWriter("log7")

# 只针对一些特殊的层起作用
model.train()
for i in range(epochs):
    print(">>>>>>>>>>>>>>>>第{}轮训练开始".format(i+1))

    for data in train_dataloader:
        imgs, targets = data
        outputs = model(imgs)

        #  优化器
        loss = loss_fn(outputs, targets)
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        train_step +=1
        if train_step % 100 == 0:
            print("----------训练次数{}, loss:{}".format(train_step, loss.item()))
            writer.add_scalar("train_loss", loss.item(), train_step)

    # 测试
    # eval也只是针对特殊的层起作用
    model.eval()
    total_loss = 0
    total_accuracy = 0
    with torch.no_grad():
        for data in test_dataloader:
            imgs, targets = data
            outputs = model(imgs)
            loss = loss_fn(outputs, targets)
            total_loss += loss.item()
            accuracy = (outputs.argmax(1) == targets).sum()
            total_accuracy += accuracy
    print("测试集上的loss:{}".format(total_loss))
    writer.add_scalar("test_loss", total_loss, test_step)
    writer.add_scalar("accuracy", total_accuracy, test_step)
    test_step +=1

    # 保存每一轮训练的模型
    torch.save(model, "modules/my_model_{}".format(i))

writer.close()

参考:完整的模型训练套路(三)_哔哩哔哩_bilibili

ResNet18是一种深度残差网络(Residual Network),由Kaiming He等人在2015年提出的,它在ImageNet大规模视觉识别挑战赛上取得了很好的效果,并成为许多计算机视觉任务的基础模型之一。ResNet18的主要特点是引入了残差块(Residual Block),这种结构允许网络更深,避免了梯度消失的问题。 网络结构大致分为以下几个部分: 1. **输入层**:通常接收的是224x224大小的RGB图像。 2. **基础残差块(Basic Blocks)**:ResNet18由一系列的基础残差块组成,每个块包含两个3x3卷积层,其中第一个卷积层后面会有一个跳跃连接,使得信息可以绕过一些层直接到达下一层。 3. **瓶颈残差块(Bottleneck Blocks)**:虽然ResNet18大部分都是基本块,但在某些情况下可能会有瓶颈块,用于处理更大的网络。然而,ResNet18核心部分还是基于基本块。 4. **全局平均池化层(Global Average Pooling)**:最后一个残差块后面是一个全局平均池化层,将特征图转换成一维向量。 5. **全连接层(Classification Head)**:最后是一层或多层全连接层,用于分类任务,如1000个类别的ImageNet分类。 对于Python中的PyTorch库,你可以使用`torchvision.models.resnet18()`函数加载预训练的ResNet18模型,示例如下: ```python import torch from torchvision import models # 加载预训练模型 model = models.resnet18(pretrained=True) # 如果需要的话,可以选择只冻结前几层 for param in model.parameters(): param.requires_grad = False # 修改最后一层(通常是fc层)以便适应特定的下游任务 num_classes = your_task_num_classes model.fc = torch.nn.Linear(model.fc.in_features, num_classes) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值