#主要组成模块
机器/深度学习的 整体流程
对数据预处理(格式统一和必要的数据变换)——>选择模型(设定损失函数和优化方法以及对应的超参数)——>用模型去拟合训练集数据,宁在验证集/训练集上计算模型表现;
1.基本配置
对于一个Pytorch项目,需要导入一些常用包来快速实现功能,如os、numpy等,还需要调用一些自身模块,如Torch、torch.nn等;以下为一些建议导入的包导入方式;
import os
import numpy as np
import torch.nn
import torch.nn as nn
from torch.utils.data import Dateset,DataLoader
import torch.optim as optimizer
可以统一设置的超参数,方便后续调试修改:
batch size;初始学习率(初始);训练次数(max-epochs);GPU配置;
GPU的两种常见设置方式:
方案一:使用os.environ,如果使用GPU不用设置;
os.environ['CUDA_VISIBLE_DEVICES']=‘0,1’
方案二:使用device,后续对要使用的GPU变量用.to(device)即可;
device=torch.device("cuda:1" if torch.cuda.is_available()
2.数据读入
数据读入是通过Dataset+DataLoader的方式完成,Dataset定义数据的格式和数据变换形式,DataLoader用iterative的方式不断读入批次数据;
可用定义的Dataset类来实现灵活的数据读取,定义的类需要继承Pytorch自身的Dataset类;主要包含三个函数:
_init_:用于向类中传入外部参数,同时定义样本集;
_getitem_:用于逐个读取样本集合中的元素,可以进行一定的变换,并将返回训练、验证所需数据;
_len_:返回数据集的样本数;
构建好Dataset后,可以使用DataLoader来按批次读入数据。
3.模型构建
神经网络的构造方法
Module类是nn模块里提供的一个模型构造类,是所有神经网络模块的基类,我们可以继承它来定义想要的模型;
神经网络中特殊层的构造
a.不含模型参数的层
下面构造的MyLayer类通过继承Module类自定义了一个将输入减掉均值后输出的层,并将层的计算定义在了forward函数里,这个层不含模型参数;
import torch
form torch import nn
class MyLayer(nn.Module):
def_init_(self,**kwargs):
super(MyLayer,self)._init_(**kwargs)
def forward(self ,x):
return x-x.mean()
测试,实例化该层,然后做向前计算
layer =MyLayer()
layer(torch.tensor([1,2,3,4,5],dtype=torch.float))
tensor([-2.,-1.,0.,1.,2.])
含模型参数的层
可以自定义含模型参数的自定义层,其中的模型参数可以通过训练学出;
二维卷积层
二维卷积层将输入和卷积核做互相关运算,并加上一个标量偏差来得到输出。卷积层的模型参数包括了卷积核和标量偏差。在训练模型的时候,通常先对卷积核随机初始化,然后不断迭代卷积核和偏差;
池化层
池化层每次对输入数据的一个固定形状窗口中的元素计算输出;不同于卷积层里计算输入和核的互相关性,池化层直接计算池化窗口内元素的最大值或平均值。
神经网络的典型训练过程如下:
a.定义包含一些可学习参数的神经网络;
b.在输入数据集上迭代;
c.通过网络处理输入;
d.计算loss(输出和正确的答案);
e.将梯度反向传播给网络的参数;
f.更新网络的权重,一般使用一个简单的规则:weight = weight - learning_rate *gradient
4.模型初始化
……未完