PyTorch深度学习快速入门教程【小土堆】.
在神经网络中,我们通常用线性层来完成两层神经元间的线性变换。
在普通神经网络里,输入是一个二维矩阵,不需要摊平。而在卷积神经网络里,在网络的最后几层里,会把卷积层摊平放到全连接里进行计算。
注:当把一个输出张量从卷积层传递到线性层时,需要进行 flatten 操作,对一个张量进行flatten(扁平化)。
linear-layers
from torch.nn import Linear
官方解释
作用:对输入数据做线性变换:y=Ax+b。
【实例化】Linear(in_features, out_features, bias=True, device=None, dtype=None)
import torch
import torchvision
from torch import nn
from torch.nn import Linear
from torch.utils.data import DataLoader
class Model(nn.Module):
def __init__(self):
super().__init__() # 初始化父类参数
self.linear1 = Linear(196608, 10) # 创建一个实例
def forward(self, input):
output = self.linear1(input)
return output
# 创建一个实例
dataset = torchvision.datasets.CIFAR10(root="./dataset", train=False,
transform=torchvision.transforms.ToTensor())
# 创建一个实例,drop_last=True防止经过线性函数报错
dataloader = DataLoader(dataset, batch_size=64, drop_last=True)
model = Model() # 创建一个实例
for data in dataloader:
imgs, targets = data
# batch_size, 通道数, 图片尺寸
print(imgs.shape) # torch.Size([64, 3, 32, 32])
# 拉伸成向量,自动计算最后一个位置(64*3*32*32=196608)
output = torch.reshape(imgs, (1, 1, 1, -1))
print(output.shape) # torch.Size([1, 1, 1, 196608])
output = model(output)
print(output.shape) # torch.Size([1, 1, 1, 10])
输出:
torch.Size([64, 3, 32, 32])
torch.Size([1, 1, 1, 196608])
torch.Size([1, 1, 1, 10])
torch.Size([64, 3, 32, 32])
torch.Size([1, 1, 1, 196608])
torch.Size([1, 1, 1, 10])
....
....
补充:
output = torch.reshape(imgs, (1, 1, 1, -1))
# 也可以换成
output = torch.flatten(imgs)
输出变成:
torch.Size([64, 3, 32, 32])
torch.Size([196608])
torch.Size([10])
torch.Size([64, 3, 32, 32])
torch.Size([196608])
torch.Size([10])
....
....