神经网络分类任务

复制代码
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 层来防止过拟合。

刚开始学,后续再看

相关推荐
叫我:松哥1 小时前
基于卷积神经网络的静态手势语识别算法,在测试集上的识别准确率达到97.5%
人工智能·python·深度学习·神经网络·算法·cnn
ZHW_AI课题组1 小时前
基于KNN的帕尔默企鹅种类预测分类
人工智能·机器学习·分类·数据挖掘
2401_885665192 小时前
从零搭建卷积神经网络:基于PyTorch实现MNIST手写数字分类
pytorch·python·神经网络·算法·机器学习·分类·cnn
DXM05212 小时前
第10期| 卷积神经网络CNN通俗详解:AI遥感的底层核心
人工智能·python·神经网络·机器学习·arcgis·cnn·文心一言
装不满的克莱因瓶2 小时前
掌握空间注意力 STN 模型结构——让神经网络学会自动“看准位置”
人工智能·python·深度学习·神经网络·机器学习·ai
2401_885665192 小时前
从神经元到BP反向传播,零基础吃透神经网络底层原理
人工智能·python·深度学习·神经网络·opencv
南檐巷上学3 小时前
基于改进型CNN神经网络的车牌定位识别系统(Matlab)
人工智能·神经网络·matlab·cnn·车牌识别·vgg
闻道且行之3 小时前
Hair Segmentation:MediaPipe 头发分割模块 CMake 独立编译
c++·人工智能·深度学习·神经网络·opencv·计算机视觉
疯狂打码的少年3 小时前
【程序语言与编译】文法的分类(0-3型,乔姆斯基体系)
人工智能·笔记·分类·数据挖掘
Promise微笑3 小时前
气体露点仪测量技术:露点仪原理、分类、选型与应用前沿
人工智能·分类·数据挖掘