《深度学习入门之Pytorch》读书笔记
如有错误还请不吝指出
第三章
3.1 Pytorch基础
-
3.1.1 张量 Tensor 表示的是多维的矩阵 不同数据类型:
- 32位浮点型 torch.FloatTensor (默认数据类型)
- 64位浮点型 torch.DoubleTensor
- 16位整型 torch.ShortTensor
- 32位整型 torch.IntTensor
- 64位整型 torch.LongTensor
3.1.2 Variable(变量)
这是一个神经网络计算图中特有的概念,Variable提供了自动求导机制。Variable 和 Tensor 本质上没有区别,但是 Variable会被放入一个计算图中,进行前向传播、反向传播和自动求导。
Variabl 在 torch.autograd.Variable 中, 如果 a 是一个张量,使用 Variable(a) 可将其变为 Variable.
Variable 中有三个重要组成性质:data, grad, grad_fn. 通过 data 可以取出 Variable 中的 tensor 数值,grad_fn 得到这个 Variable 的操作. grad 是 Variable 反向传播的梯度.
from torch.autograd import Variable
import torch
# create Variable
x = Variable(torch.Tensor([1]), requires_grad=True)
w = Variable(torch.Tensor([2]), requires_grad=True)
b = Variable(torch.Tensor([3]), requires_grad=True)
# Build a computational graph
y = w * x + b # y = 2*x + 3
# Compute the gradients
y.backward() # same as y.backward(torch.FloatTensor([1]))
print(x.grad) # 2
print(w.grad) # 1
print(b.grad) # 1
构建 Variable 需要传递一个参数 requires_grad=True 这个参数表示是否要对这个变量求导, 默认是 False.
y.backward()
就是自动求导, 自动求导不需要明确写明哪个函数对哪个函数求导,直接通过这行代码对所有需要梯度的变量求导.
下面是对矩阵求导
# 对矩阵求导
x = torch.randn(3)
x = Variable(x, requires_grad=True)
# tensor([ 1.5244, -1.0083, -0.4375])
y = x*2
# tensor([ 3.0487, -2.0165, -0.8750])
y.backward(torch.FloatTensor([1, 0.1, 0.01]))
print(x.grad)
# tensor([ 2.0000, 0.2000, 0.0200])
3.1.3 Dataset(数据集)
任何机器学习在处理之前都要及逆行数据读取和预处理.
torch.utils.data.Dataset 是代表这一数据的抽象类, 只需定义_len_ 和 _getitem_ 这两个函数就可以继承并重写这个抽象类
from torch.utils.data import Dataset
import pandas as pd
class myDataset(Dataset):
def __init__(self, csv_file, txt_file, root_dir, other_file):
self.csv_data = pd.read_csv(csv_file)
with open(txt_file, 't') as f:
data_list = f.readlines()
self.txt_data = data_list
self.root_dir = root_dir
def __len__(self):
return len(self.csv_data)
def __getitem__(self, idx):
data = (self.csv_data[idx], self.txt_data[idx])
return data
通过上面的方式, 可以定义我们需要的数据集, 可以通过迭代的方法获得每一个数据. Pytorch 提供了更简单的方法来实现取 batch, shuffle 或者多线程去读取数据. torch.utils.data.DataLoader 来定义一个迭代器.
dataiter = DataLoader(myDataset, batch_size=2, shuffle=True, collate_fn=default_collate)
其中 shuffle 是打乱或者洗牌的意思. collate_fn 表示如何取样本.
在 torchvision 包中还有更高级的数据读取类 ImageFolder
dset = ImageFolder(root='root_path', transform=None, loader=default_loader)
dset.ImageFolder(root="root folder path", [transform, target_transform]) #官方文档
root 需要是根目录, 在这个目录下有几个文件夹,每个文件夹表示一个类别. target_transform 是图片增强. loader 是图片读取的方法, 因为我们要读取的是名字,所以通过 loader 将图片转换成我们需要的图片类型进入神经网络
3.1.4 nn.Module(模组)
在 Pytorch 中编写神经网络,所有的层结构和损失结构都来自 torch.nn , 所有模型构建都是从基类 nn.Module 继承的, 下面是模板
from torch.nn import Module
from torch import nn
class net_name(nn.Module):
def __init__(self, other_arguments):
super(net_name, self).__init__()
self.conv1 = nn.Conv2d(in_channels, out_channels, kernel_size)
# other network layer
def forward(self, x):
x = self.conv1(x)
return x
这样建立了一个计算图, 这个结构可以复用多次, 每次调用相当于计算图定义时的相同参数做一次前向传播, 我们不用自己编写反向传播.
定义完模型, 来定义损失函数, 常见的损失函数都定义在 nn 中. 这样我们就能求得输出和真是目标之间的损失函数.
criterion = nn.CrossEntropyLoss()
loss = criterion(output, target)
-
3.1.5 torch.optim(优化)
-
1.一阶优化算法: 使用各个参数的梯度值来更新参数, 最常用的是帝都下降
θ=θ−η×