《深度学习入门之Pytorch》读书笔记

这篇博客是《深度学习入门之PyTorch》的读书笔记,主要涵盖PyTorch的基础知识,包括Variable的自动求导机制,数据集的创建与处理,nn.Module模块的构建,以及模型的保存和加载。同时,讨论了线性模型、分类问题,特别是多层全连接神经网络在MNIST手写数字分类任务的应用。
摘要由CSDN通过智能技术生成

《深度学习入门之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.一阶优化算法: 使用各个参数的梯度值来更新参数, 最常用的是帝都下降
         θ=θη×
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值