【实战1】手写字识别 Pytoch(更新中)
1 数据集
引用
import torch
from torch import nn ##nn创建神经网络
from torch.utils.data import DataLoader #DataLoader加载数据
from torchvision import datasets #datasets加载数据集
from torchvision.transforms import ToTensor #ToTensor将数据转换为张量
下载数据集
# 下载数据
training_data = datasets.MNIST(root="data",train=True,download=True,transform=ToTensor()
)testing_data = datasets.MNIST(root="data",train=False,download=True,transform=ToTensor()
)
导入数据
# 加载数据
batch_size = 64
train_dataloader = DataLoader(training_data, batch_size=batch_size)
test_dataloader = DataLoader(testing_data, batch_size=batch_size)# 打印第一个批次的数据形状
for X, y in train_dataloader:print(f"Shape of X [N, C, H, W]: {X.shape}")print(f"Shape of y: {y.shape} {y.dtype}")break
使用keras构建神经网络的方法
构建神经网络
定义神经网络类,继承自nn.Moudule
Pytorch使用nn.Sequentail对象创建神经网络
神经网络必须实现前向传播forward()方法
使用nn.Flatten对象将图片转成列列向量【对比Kares ,pytorch是面向对象的思路】
nn.to方法可以让模型运行在不同的硬件上
device = ("cuda"if torch.cuda.is_available()else "mps"if torch.backends.mps.is_available() else "cpu")# 打印设备信息
print(f"Using {device} device")# 构建神经网络 2层 输入28*28,第一层128个神经元,激活函数relu,第二层10个神经元
class NeunalNetwork(nn.Module):def __init__(self):super().__init__()self.nmodel = nn.Sequential(nn.Linear(28*28, 128), # 输入层到隐藏层 nn.ReLU(), # 激活函数nn.Linear(128, 10) # 隐藏层到输出层)def forward(self, x):x = nn.Flatten(1)(x) # 将输入展平output = self.nmodel(x) #对模型训练return outputmodel = NeunalNetwork().to(device)
print(model)