PyTorch基础训练流程:使用PyTorch建立深度学习模型一般有以下几个步骤:
在以下笔记中,会先简单介绍每个步骤的基础内容,然后搭配案例,使用FashionMNIST数据集,通过PyTorch代码实现每一个步骤,最终搭建并训练出一个分类器。
pytorch项目怎么跑?
基本配置
在基础配置中一般需要完成以下三点配置:
导入Python常用包
GPU配置
统一设置超参数
# 导入Python常用包
import os
import numpy as np
import pandas as pd
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import Dataset
# 配置GPU
device = torch.device("cuda:1" if torch.cuda.is_available() else "cpu")
# 配置其他超参数
batch_size = 256 # 一个训练batch的大小
num_workers = 1 # 同时工作的cpu线程
lr = 1e-4 # 学习率
epochs = 20 # 训练epochs数
注意,在以下代码中,我们将不会使用GPU计算。
数据读入
数据读入会使用PyTorch的两个类:
Dataset
DataLoader
首先,我们使用Dataset来构建子类,在这个子类中,我们需要定义三个函数:
__init__
__len__
__getitem__
现在我们来看实例。由于FashionMNIST数据集存储在csv文件中,我们需要先对其做一些transformation。
# 设置数据变换
from torchvision import transforms
image_size = 28
# 将一连串想要对数据进行的变换打包,以便在之后数据读取时直接使用
data_transform = transforms.Compose([
transforms.ToPILImage(), # convert a tensor or ndarray to PIL image(python image library)
transforms.Resize(image_size), # resize imput image into given size
transforms.ToTensor() # convert a PIL image or ndarray into tensor
])
首先将这些csv中的表格数据转换为Python能识别的PILImage格式,再将它们的size改成我们需要的大小,最后将所有数据转变成模型能识别的tensor格式。
接下来我们就可以开始为这个数据集创造Dataset子类了
# 数据读取方法二: 读入csv格式的数据,自行构建Dataset类
class FMDataset(Dataset):
# __init__的作用就是1.传入外部参数(transform) 2.定义数据中的samples,labels
def __init__(self, df, transform=None):
self.df = df # 数据集
self.transform = transform # transformation
self.image = df.iloc[:,1:].values.astype(np.uint8) # 定义数据集中哪些是training set
self.label = df.iloc[:,0].values # 定义数据集中哪些是testing set
#__len__记录并返回dataset中的samples数
def __len__(self):
return len(self.image)
# __getitem__返回指定index的特定sample。在这里包括图像和他的label
def __getitem__(self, idx):
image = self.image[idx].reshape(28,28,1) # 将该sample保存在变量中并设置他的shape以便之后输入模型
label = int(self.label[idx]) # 将该sample的label保存在变量中
# 确定要不要对数据进行transform操作
if self.transform is not None:
image = self.transform(image)
else:
image = torch.tensor(image/255, dtype=torch.float) #如果不transform也得将数据转变成tensor的形式,这里/255是为了将数据的每个pixel大小控制在0-1之间,符合模型要求
label = torch.tensor(label, dtype=torch.long)
return image, label
# 导入数据
import pandas
import io
# 注意,这里使用的是colab,其他环境运行可能需要微调
train_df = pd.read_csv(io.BytesIO(uploaded['fashion-mnist_train.csv']))
test_df = pd.read_csv(io.BytesIO(uploaded['fashion-mnist_test.csv']))
train_data = FMDataset(train_df, data_transform)
test_data = FMDataset(test_df, data_transform)
在搭建好Dataset后,我们就可以使用DataLoader类来将Dataset变成iterable
# 构建DataLoader类,目的是为了之后训练和测试时加载数据。DataLoader是一个iterable!用next(iter())来返回下一个batch
# 属性介绍
# Dataset: 之前定义好的Dataset
# Batch_size:# sample to load in each batch
# shuffle:根据index load data时要不要打乱顺序使每次load的都不一样
# num_workers: load数据进程数,数越高,速度越快
# drop_last: 当load到最后一个batch,batch的数量不满足batch_size时,drop掉这个batch
train_loader = DataLoader(train_data, batch_size=batch_size, shuffle=True, num_workers=num_workers, drop_last=True)
test_loader = DataLoader(test_data, batch_size=batch_size, shuffle=False, num_workers=num_workers)
通过next(iter(train_loader))我们可以得到一个batch的数据。下面的代码以及可视化我们可以更直观地感受我们可以如何通过DataLoader获取数据。
# 可视化查看sample
import matplotlib.pyplot as plt
image, label = next(iter(train_loader)) # 这里输出的是train_loader中的一个batch。train_loader是一个iterable object,通过iter()得到iterator,用next()可以访问这个iterator的下一个元素
print(image.shape, label.shape)
plt.imshow(image[0][0], cmap='gray') # 展示这个batch中的第0张图。后面那个[0]怎么理解???
模型构建
通过继承PyTorchnn模块中的Module类来定义我们想要的模型。 在构造模型时,我们一般对Module的两个函数进行重载:
__init__
forward
模型初始化
损失函数与优化器
训练
评估
免费分享一些我整理的人工智能学习资料给大家,整理了很久,非常全面。包括一些AI常用框架实战视频、图像识别、OpenCV、NLQ、机器学习、pytorch、计算机视觉、深度学习与神经网络等视频、课件源码、国内外知名精华资源、AI热门论文、行业报告等。
为了更好的系统学习AI,推荐大家收藏一份。
下面是部分截图,文末附免费下载方式。
一、人工智能必读书籍
二、人工智能免费视频课程和项目
三、人工智能论文合集
四、人工智能行业报告
学好人工智能,要多看书,多动手,多实践,要想提高自己的水平,一定要学会沉下心来慢慢的系统学习,最终才能有所收获。