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函数官方文档。