Pytorch学习笔记3——转换和模型构建

Pytorch学习笔记3——TRANSFORMS AND Build Model

Pytorch Learning Notes

Reference:
Pytorch官方文档——BUILD MODEL
Pytorch官方文档——TRANSFORMS

以上是Pytorch官方的文档,本文主要对其进行翻译整理,并加入一些自己的理解,仅作日后复习查阅所用。

1.TRANSFORMS

该过程主要是处理数据和label使其适合训练和后续处理。所有TorchVision datasets有两个参数:

  • transform:处理特征(我的理解就是数据本身)。例如对图片便对图片padding、翻转等

  • target_transform:处理label。

torchvision.transforms module提供了很多常用的变换。

大多数Transformation接受PIL图片和Tensor图片,也存在只接受PIL或Tensor 的转换,可以将PIL转换为Tensor或将Tensor转换为PIL。

  • Tensor Image:一个(C,H,W)形状的Tensor,C是channel数,H和W为图像高和宽。一个batch的Tensor Image是一个(B,C,H,W),B为一个Batch内的图像数。浮点型的Tensor Image值在[0,1),整形的Tensor Image值在[0, MAX_DTYPE]间。

2.Build Model

本例中,将构建一个神经网络对FashionMNIST数据集的图像进行图像分类

import os
import torch
from torch import nn
from torch.utils.data import DataLoader
from torchvision import datasets, transforms

#定义训练所用的设备
device = 'cuda' if torch.cuda.is_available() else 'cpu'

#定义网络
class NeuralNetwork(nn.Module):
    def __init__(self):
        super(NeuralNetwork, self).__init__()
        self.flatten = nn.Flatten()
        self.linear_relu_stack = nn.Sequential(
            nn.Linear(28*28, 512),
            nn.ReLU(),
            nn.Linear(512, 512),
            nn.ReLU(),
            nn.Linear(512, 10),
        )

    def forward(self, x):
        x = self.flatten(x)
        logits = self.linear_relu_stack(x)
        return logits

#将网络移到device上
model = NeuralNetwork().to(device)

X = torch.rand(1, 28, 28, device=device)
logits = model(X)
pred_probab = nn.Softmax(dim=1)(logits)
y_pred = pred_probab.argmax(1)
print(f"Predicted class: {y_pred}")

#可用parameters()和named_parameters()函数提取网络参数
for name, param in model.named_parameters():
    print(f"Layer: {name} | Size: {param.size()} | Values : {param[:2]} \n")

Out:
Layer: linear_relu_stack.0.weight | Size: torch.Size([512, 784]) | Values : tensor([[ 0.0176,  0.0028,  0.0319,  ...,  0.0148,  0.0253,  0.0227],
        [ 0.0275, -0.0318,  0.0174,  ...,  0.0067, -0.0115,  0.0309]],
       device='cuda:0', grad_fn=<SliceBackward0>)

Layer: linear_relu_stack.0.bias | Size: torch.Size([512]) | Values : tensor([-0.0053, -0.0255], device='cuda:0', grad_fn=<SliceBackward0>)

Layer: linear_relu_stack.2.weight | Size: torch.Size([512, 512]) | Values : tensor([[-0.0381,  0.0210,  0.0047,  ..., -0.0162, -0.0285, -0.0096],
        [-0.0289,  0.0323, -0.0021,  ..., -0.0341, -0.0364,  0.0283]],
       device='cuda:0', grad_fn=<SliceBackward0>)

Layer: linear_relu_stack.2.bias | Size: torch.Size([512]) | Values : tensor([-0.0296,  0.0061], device='cuda:0', grad_fn=<SliceBackward0>)

Layer: linear_relu_stack.4.weight | Size: torch.Size([10, 512]) | Values : tensor([[ 0.0157,  0.0258, -0.0115,  ...,  0.0066, -0.0346, -0.0301],
        [-0.0074,  0.0064, -0.0017,  ..., -0.0388,  0.0246, -0.0120]],
       device='cuda:0', grad_fn=<SliceBackward0>)

Layer: linear_relu_stack.4.bias | Size: torch.Size([10]) | Values : tensor([-0.0009, -0.0196], device='cuda:0', grad_fn=<SliceBackward0>)

  • nn.Flatten(input,start_dim,end_dim):start_dim参数表示要展平的第一个维度(zero-indexed),end_dim参数表示要展平的最后一个维度,默认从start_dim=1开始展平。展平即合并,例如2*28*5从坐标为1的维度展平输出维度为2*140。

  • nn.Linear(in_dim,out_dim,bias):将输入从输入维度线性映射到输出维度上去,再加上偏置bias。Linear函数 官方文档

  • nn.ReLU():激活函数,为网络添加非线性从而增加网络的表达能力。

  • nn.Sequential():是一个有序的module容器。数据按照定义的顺序通过所定义的模块。

  • nn.Softmax():见Softmax函数官方文档

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值