神经网络分类任务

复制代码
import torch
%matplotlib inline
from pathlib import Path
import requests

import torchvision
mnist_dataset = torchvision.datasets.MNIST(root='./data', download=True)

下载mnist数据集

但不知道数据集里面是什么打印

复制代码
import torchvision
import torchvision.transforms as transforms
import matplotlib.pyplot as plt

# 下载并加载 MNIST 数据集
transform = transforms.Compose([transforms.ToTensor()])  # 将图像转换为张量
mnist_dataset = torchvision.datasets.MNIST(root='./data', download=True, transform=transform)

# 获取一个数据样本
image, label = mnist_dataset[0]  # 获取第一个样本

# 打印图像和标签
print(f"Label: {label}")
plt.imshow(image.squeeze(), cmap='gray')  # 显示图像
plt.title(f"Label: {label}")
plt.show()
复制代码
image.shape#图片的大小
复制代码
torch.Size([1, 28, 28])
复制代码
train_data = torch.stack([mnist_dataset[i][0] for i in range(64)])  # 图像数据
train_labels = torch.tensor([mnist_dataset[i][1] for i in range(64)])  # 标签数据

# 定义模型参数
num_inputs = 28 * 28  # 输入特征数量(28x28图像)
num_outputs = 10  # 输出类别数量(0-9)

# 初始化权重和偏置
weights = torch.randn(num_inputs, num_outputs, requires_grad=True)  # 随机初始化权重
bias = torch.zeros(num_outputs, requires_grad=True)  # 初始化偏置为0

# 定义模型
def model(xb):
    return xb.view(xb.size(0), -1).mm(weights) + bias  # 将输入展平为二维张量后进行线性变换

# 定义损失函数
loss_func = F.cross_entropy

# 训练模型
num_epochs = 10  # 训练轮数
for epoch in range(num_epochs):
    # 前向传播
    preds = model(train_data)  # 模型预测
    loss = loss_func(preds, train_labels)  # 计算损失

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

    # 打印损失
    print(f"Epoch {epoch+1}/{num_epochs}, Loss: {loss.item():.4f}")

print("Training complete.")

这是单层

复制代码
from torch import nn
import torch.nn.functional as F

class Mnist_NN(nn.Module):
    def __init__(self):
        super(Mnist_NN, self).__init__()  # 调用父类的构造函数
        self.hidden1 = nn.Linear(784, 128)  # 第一层:输入 784,输出 128
        self.hidden2 = nn.Linear(128, 256)  # 第二层:输入 128,输出 256
        self.out = nn.Linear(256, 10)       # 输出层:输入 256,输出 10
        self.dropout = nn.Dropout(0.5)      # Dropout 层,丢弃概率为 0.5

    def forward(self, x):
        x = F.relu(self.hidden1(x))         # 第一层 + ReLU 激活
        x = self.dropout(x)                 # 应用 Dropout
        x = F.relu(self.hidden2(x))         # 第二层 + ReLU 激活
        x = self.dropout(x)                 # 应用 Dropout
        x = self.out(x)                     # 输出层
        return x

# 初始化模型
model = Mnist_NN()

# 定义损失函数和优化器
loss_func = F.cross_entropy
optimizer = torch.optim.SGD(model.parameters(), lr=0.1)  # 使用模型的所有参数

# 训练模型
num_epochs = 10  # 训练轮数
for epoch in range(num_epochs):
    # 前向传播
    preds = model(train_data.view(-1, 784))  # 将输入展平为 [batch_size, 784]
    loss = loss_func(preds, train_labels)    # 计算损失

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

    # 打印损失
    print(f"Epoch {epoch + 1}/{num_epochs}, Loss: {loss.item():.4f}")

print("Training complete.")
  • 这是一个多层神经网络,包含两个隐藏层和一个输出层。

  • 每个隐藏层后面都接了一个 ReLU 激活函数,增加了模型的非线性能力。

  • 使用了 Dropout 层来防止过拟合。

刚开始学,后续再看

相关推荐
有Li23 分钟前
EvoMDT:用于多癌种结构化临床决策的自进化多智能体系统文献速递/医学智能体前沿
人工智能·学习·分类·文献·医学生
就是一顿骚操作3 小时前
生成对抗网络 GAN:生成模型的经典入门解读
人工智能·深度学习·神经网络·生成对抗网络·论文解读
REDcker5 小时前
机器人世界模型三类分类详解
分类·数据挖掘·机器人
老刘说AI1 天前
AI服务核心: 高并发原理与性能监控调优
人工智能·神经网络·langchain·llama·持续部署
matlab代码1 天前
基于CNN卷积神经网络交通标志识别系统 (GUI界面 数字图像处理)【源码48期】
人工智能·神经网络·cnn·交通标志识别
Mr.看海1 天前
【终审稿】CNN-RNN 通用分类算法及 MATLAB 实现
rnn·分类·cnn
丨白色风车丨1 天前
PyTorch 迁移学习实战:ResNet18 实现 20 类食物图像分类(完整可运行代码)
pytorch·分类·迁移学习
BOTTLE_平1 天前
AI认知篇:AI是什么 与 核心分类体系
人工智能·机器学习·分类·语音识别
天上路人2 天前
A59P双波束语音模块:神经网络降噪在远场拾音中的工程实现分析
人工智能·深度学习·神经网络·ai降噪·ai语音·麦克风·回音消除
满怀冰雪2 天前
04-Paddle Tensor 基础:形状、数据类型、广播与索引
python·深度学习·神经网络·paddle