神经网络分类任务

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

刚开始学,后续再看

相关推荐
千宇宙航33 分钟前
闲庭信步使用SV搭建图像测试平台:第三十一课——基于神经网络的手写数字识别
图像处理·人工智能·深度学习·神经网络·计算机视觉·fpga开发
IT古董36 分钟前
【第二章:机器学习与神经网络概述】04.回归算法理论与实践 -(4)模型评价与调整(Model Evaluation & Tuning)
神经网络·机器学习·回归
澪-sl13 小时前
基于CNN的人脸关键点检测
人工智能·深度学习·神经网络·计算机视觉·cnn·视觉检测·卷积神经网络
摸爬滚打李上进13 小时前
重生学AI第十六集:线性层nn.Linear
人工智能·pytorch·python·神经网络·机器学习
羊小猪~~16 小时前
【NLP入门系列五】中文文本分类案例
人工智能·深度学习·考研·机器学习·自然语言处理·分类·数据挖掘
锅挤17 小时前
深度学习5(深层神经网络 + 参数和超参数)
人工智能·深度学习·神经网络
网安INF17 小时前
深层神经网络:原理与传播机制详解
人工智能·深度学习·神经网络·机器学习
19891 天前
【零基础学AI】第21讲:TensorFlow基础 - 神经网络搭建入门
人工智能·python·神经网络·算法·机器学习·tensorflow
Blossom.1181 天前
机器学习在智能建筑中的应用:能源管理与环境优化
人工智能·python·深度学习·神经网络·机器学习·机器人·sklearn
IT古董2 天前
【第二章:机器学习与神经网络概述】04.回归算法理论与实践 -(3)决策树回归模型(Decision Tree Regression)
神经网络·机器学习·回归