pytorch神经网络入门代码

python 复制代码
import torch
import torch.nn as nn
import torch.optim as optim
import torchvision
import torchvision.transforms as transforms

# 定义神经网络结构
class SimpleNN(nn.Module):
    def __init__(self, input_size, hidden_size, num_classes):
        super(SimpleNN, self).__init__()
        self.fc1 = nn.Linear(input_size, hidden_size)
        self.relu = nn.ReLU()
        self.fc2 = nn.Linear(hidden_size, num_classes)

    def forward(self, x):
        out = self.fc1(x)
        out = self.relu(out)
        out = self.fc2(out)
        return out

# 设置超参数
input_size = 784  # MNIST数据集的输入大小是28x28=784
hidden_size = 784
num_classes = 10


learning_rate = 0.01
num_epochs = 10

# 加载MNIST数据集
train_dataset = torchvision.datasets.MNIST(root='./data', train=True, transform=transforms.ToTensor(), download=True)
test_dataset = torchvision.datasets.MNIST(root='./data', train=False, transform=transforms.ToTensor())

# 数据加载器
train_loader = torch.utils.data.DataLoader(dataset=train_dataset, batch_size=100, shuffle=True)
test_loader = torch.utils.data.DataLoader(dataset=test_dataset, batch_size=100, shuffle=False)

# 实例化模型
model = SimpleNN(input_size, hidden_size, num_classes)

# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=learning_rate)

# 训练模型
total_step = len(train_loader)
for epoch in range(num_epochs):
    for i, (images, labels) in enumerate(train_loader):
        # 将输入数据转换为一维向量
        images = images.reshape(-1, 28*28)

        # 前向传播
        outputs = model(images)
        loss = criterion(outputs, labels)

        # 反向传播和优化
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        if (i+1) % 100 == 0:
            print ('Epoch [{}/{}], Step [{}/{}], Loss: {:.4f}'
                   .format(epoch+1, num_epochs, i+1, total_step, loss.item()))

# 测试模型
with torch.no_grad():
    correct = 0
    total = 0
    for images, labels in test_loader:
        images = images.reshape(-1, 28*28)
        outputs = model(images)
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()

    print('Accuracy of the network on the 10000 test images: {} %'.format(100 * correct / total))

# 获取模型参数
params = model.parameters()

# 打印每个参数的名称和值
for name, param in model.named_parameters():
    print(f'Parameter name: {name}')
    print(f'Parameter value: {param}')

以下代码测试正确率为:99.37%

复制代码
import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms

# 定义适合MNIST数据集的CNN模型
class MNISTCNN(nn.Module):
    def __init__(self):
        super(MNISTCNN, self).__init__()
        
        # 卷积块 1
        self.conv_block1 = nn.Sequential(
            nn.Conv2d(in_channels=1, out_channels=32, kernel_size=3, padding=1),
            nn.ReLU(),
            nn.MaxPool2d(kernel_size=2)
        )
        
        # 卷积块 2
        self.conv_block2 = nn.Sequential(
            nn.Conv2d(in_channels=32, out_channels=64, kernel_size=3, padding=1),
            nn.ReLU(),
            nn.MaxPool2d(kernel_size=2)
        )

        # 全连接层
        self.fc_layer = nn.Sequential(
            nn.Linear(64 * 7 * 7, 512),  # 假设经过前面的卷积和池化后特征图大小为7x7
            nn.ReLU(),
            nn.Dropout(p=0.5),
            nn.Linear(512, 10)  # MNIST有10个类别
        )

    def forward(self, x):
        x = self.conv_block1(x)
        x = self.conv_block2(x)

        # 将卷积层输出展平为一维向量
        x = x.view(x.size(0), -1)

        # 通过全连接层
        x = self.fc_layer(x)

        return x

# 创建模型实例
model = MNISTCNN()

# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)

# 加载MNIST数据集并预处理
transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,))])
train_dataset = datasets.MNIST(root='./data', train=True, download=True, transform=transform)
test_dataset = datasets.MNIST(root='./data', train=False, download=True, transform=transform)

# 使用DataLoader加载批量数据
batch_size = 64
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=batch_size, shuffle=False)

# 开始训练
num_epochs = 10
for epoch in range(num_epochs):
    for inputs, labels in train_loader:
        # 前向传播
        outputs = model(inputs)
        loss = criterion(outputs, labels)

        # 反向传播和优化
        optimizer.zero_grad()  # 清空梯度缓存
        loss.backward()  # 计算梯度
        optimizer.step()  # 更新参数

    # 每个epoch结束时打印损失
    print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}')

# 测试模型
model.eval()  # 将模型切换到评估模式(禁用Dropout和BatchNorm等)
with torch.no_grad():
    correct = 0
    total = 0
    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: {100 * correct / total}%')
相关推荐
科技小E11 分钟前
EasyRTC嵌入式音视频通信SDK打造带屏IPC全场景实时通信解决方案
人工智能·音视频
ayiya_Oese17 分钟前
[模型部署] 3. 性能优化
人工智能·python·深度学习·神经网络·机器学习·性能优化
仙人掌_lz19 分钟前
机器学习与人工智能:NLP分词与文本相似度分析
人工智能·机器学习·自然语言处理
jndingxin38 分钟前
OpenCV CUDA模块中矩阵操作------归一化与变换操作
人工智能·opencv
ZStack开发者社区44 分钟前
云轴科技ZStack官网上线Support AI,智能助手助力高效技术支持
人工智能·科技
每天都要写算法(努力版)1 小时前
【神经网络与深度学习】通俗易懂的介绍非凸优化问题、梯度消失、梯度爆炸、模型的收敛、模型的发散
人工智能·深度学习·神经网络
Blossom.1181 小时前
Web3.0:互联网的去中心化未来
人工智能·驱动开发·深度学习·web3·去中心化·区块链·交互
kyle~1 小时前
计算机视觉---目标检测(Object Detecting)概览
人工智能·目标检测·计算机视觉
hao_wujing1 小时前
YOLOv8在单目向下多车辆目标检测中的应用
人工智能·yolo·目标检测
王学政21 小时前
LlamaIndex 第九篇 Indexing索引
人工智能·python