import torch
import torchvision
from torch import nn
from torch.nn import Linear
from torch.utils.data import DataLoader

dataset = torchvision.datasets.CIFAR10(
    root="./data",
    train=False,
    transform=torchvision.transforms.ToTensor(),
    download=True
)
dataloader = DataLoader(dataset, batch_size=64, drop_last=True)


class Tudui(nn.Module):
    def __init__(self):
        super(Tudui, self).__init__()
        # 每个样本展平后是 3*32*32 = 3072
        self.linear1 = Linear(3072, 10)

    def forward(self, input):
        output = self.linear1(input)
        return output


tudui = Tudui()

for data in dataloader:
    imgs, targets = data
    print(f"输入形状: {imgs.shape}")  # [64, 3, 32, 32]

    # flatten 把每个样本展平成一维
    output = torch.flatten(imgs, start_dim=1)  # 从第1维开始展平
    print(f"flatten 后: {output.shape}")  # [64, 3072]

    output = tudui(output)
    print(f"线性层输出: {output.shape}")  # [64, 10]
    break

1.dataloader = DataLoader(dataset, batch_size=64, drop_last=True),

drop_last=True:10000张测试集图片64个一组,剩下的最后一组不到64的,不要
2

class Tudui(nn.Module):
    def __init__(self):
        super(Tudui, self).__init__()
        # 方式2的写法:每个样本展平后是 3*32*32 = 3072
        self.linear1 = Linear(3072, 10)

每张图片有32*32个像素,每个像素由三维的RGB数构成,例为【255,255,255】,所以每张图片的数字表示会有3072个数来表示,

 self.linear1 = Linear(3072, 10)意为,通过线性层把所有的数据信息,归为10类,为什么是10?

因为CIFAR-10 有 10 个类别:飞机、汽车、鸟、猫、鹿、狗、青蛙、马、船、卡车。

3.

for data in dataloader:
    imgs, targets = data
    print(f"输入形状: {imgs.shape}")  # [64, 3, 32, 32]
    output = torch.flatten(imgs, start_dim=1)  # 从第1维开始展平
    print(f"flatten 后: {output.shape}")  # [64, 3072]
    output = tudui(output)
    print(f"线性层输出: {output.shape}")  # [64, 10]
    break

这里imgs不是一张图,是dataloader打包的64张图,所以imgs.shape是[64, 3, 32, 32]

output = torch.flatten(imgs, start_dim=1) ,从第1维开始展平,把1,2,3维的3,32,32乘到一起成为[64, 3072],再通过tudui网络输出,3072输入进去,10输出来

Logo

免费领 150 小时云算力,进群参与显卡、AI PC 幸运抽奖

更多推荐