-
Pytorch定义网络结构识别手写数字,可以对网络中的参数w和b进行手动定义的(参考上一节)
-
也可以直接用
nn.Linear
定义层的方式来定义 -
更加方便的方式是直接继承
nn.Module
来定义自己的网络结构。
1. nn.Linear方式
import torch
import torch.nn as nn
import torch.nn.functional as F
# 模拟 一张 28*28 的图片摊平
x = torch.randn(1, 784) #shape=[1,784]
# 定义三个全连接层
layer1 = nn.Linear(784, 200) # (in, out)
layer2 = nn.Linear(200, 200)
layer3 = nn.Linear(200, 10)
x = layer1(x) # shape=[1,200]
x = F.relu(x, inplace=True) # inplace=True在原对象基础上修改,可以节省内存
print(x.shape)
x = layer2(x) # shape=[1,200]
x = F.relu(x, inplace=True)
x = layer3(x) # shape=[1,10]
x = F.relu(x, inplace=True)
2. 继承nn.Module方式
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
from torchvision import datasets, transforms
#超参数
batch_size=200
learning_rate=0.01
epochs=10
#获取训练数据
train_loader = torch.utils.data.DataLoader(
datasets.MNIST('../data', train=True, download=True, #train=True则得到的是训练集
transform=transforms.Compose([ #transform进行数据预处理
transforms.ToTensor(), #转成Tensor类型的数据
transforms.Normalize((0.1307,), (0.3081,)) #进行数据标准化(减去均值除以方差)
])),
batch_size=batch_size, shuffle=True) #按batch_size分出一个batch维度在最前面,shuffle=True打乱顺序
#获取测试数据
test_loader = torch.utils.data.DataLoader(
datasets.MNIST('../data', train=False, transform=transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.1307,), (0.3081,))
])),
batch_size=batch_size, shuffle=True)
class MLP(nn.Module):
def __init__(self):
super(MLP, self).__init__()
# 定义网络的每一层,nn.ReLU可以换成其他激活函数,比如nn.LeakyReLU()
self.model = nn.Sequential(