3.多层感知机的简洁实现-代码详解

代码

import torch  # 导入 torch 模块
from torch import nn  # 导入nn模块,很重要
from d2l import torch as d2l # 为了后续画图,报错请运行此代码(!pip install -U d2l)

net = nn.Sequential(
		   nn.Flatten(),# 展平一个连续范围的维度,输出类型为Tensor
		   nn.Linear(784,256), # 全连接层,相当于 Y = aX + b ;输入 维度 784 输出 维度 256
		   nn.ReLU(), # 激活函数 ReLU
		   nn.Linear(256,10))# 全连接层,相当于 Y = aX + b ;输入 维度 256 输出 维度 10

def init_weights(m): # 初始化 每个全连接层的权重 weight
	if type(m) == nn.linear: # 判断是否为连接层
		nn.init.normal_(m.weight,std=0.01)# 从正态分布N~(0,0.01)中随机抽取填充 m.weight

net.apply(net.weight)	# 网络层 初始化 网络权重

batch_size,lr,num_epochs = 256,0.1,10 # 设置大小,学习率,迭代次数

loss = nn.CrossEntropyLoss() # 设置 损失函数为交叉熵损失函数

trainer = torch.optim.SGD(net.parameters(),lr=lr)# 实例化优化器->随机梯度下降SGD

train_iter,test_iter = d2l.load_data_fishion_mnist(batch_size) # 读取数据并将图片转换成数据集dataloader

d2l.train_ch3(net,train_iter,test_iter,loss,num_epochs,trainer) # 训练数据,并可视化数据

2. 结果

在这里插入图片描述

3. 模块备注

3.1 nn.Flatten()

  • 作用
    将原来的数据打平为 1 x N 维度的张量,一般在图像处理中放在前面。常常用在卷积中和sequential一起
>>> input = torch.randn(32, 1, 5, 5)
>>> m = nn.Sequential(
>>>     nn.Conv2d(1, 32, 5, 1, 1),
>>>     nn.Flatten()
>>> )
>>> output = m(input)
>>> output.size()
torch.Size([32, 288])

3.2 nn.Linear()

  • 对传入的数据进行线性变换 Y = a X + b;可以与Sequential配合使用
import torch
from torch import nn
from d2l import torch as d2l
m = nn.Linear(20,30)
inputs = torch.randn(128,20)
outputs = m(inputs)
outputs.shape
torch.Size([128, 30])

3.3 nn.ReLU()

  • 作用:
    作为常见的激活函数使用,就是一个取正函数,max(0,x),在搭建神经网络时常用
    图像如下:
    在这里插入图片描述

3.4 nn.init.normal_()

  • 作用
    用正态分布的值填充输入张量。
torch.nn.init.normal_(tensor, mean=0.0, std=1.0)
import torch 
from torch import nn
from d2l import torch as d2l
x = torch.empty(2,5)
torch.nn.init.normal_(x)

3.5 torch.randn()

  • 作用:从一个均值为mean=0,方差 std=1的正太分布中随机抽取值来填充张量。
    O u t ( i ) ∼ N ( 0 , 1 ) Out_{(i)}\sim N(0,1) Out(i)N(0,1)
  • 举例:
    1.1 生成 10行1列的张量,由N(0,1)正太分布填充
x = torch.randn(10)
x

1.2 结果

tensor([-0.6998, -2.0576, -0.1138, -0.8772, -0.7845,  1.1672, -0.0739, -0.2323,
        -1.0137,  1.5810])

2.1 生成 2行4列的张量,由N(0,1)正太分布填充

y = torch.rand((2,4))
y
tensor([[0.8804, 0.2207, 0.3399, 0.7783],
        [0.1000, 0.8257, 0.2324, 0.5062]])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值