PyTorch主要组成模块+FashionMNIST基础实战

Datawhale202210——《深入浅出PyTorch》(3、4)



前言

通过FashionMNIST时装分类项目来深度了解DL任务在PyTorch上的实现。


一、深度学习任务的总体流程与具体说明

DL/ML任务的总体流程

1.数据预处理
(数据格式的统一、必要的数据变换、划分训练集和测试集……)
2.模型设计
(设定损失函数和优化方法、对应的超参数设置……)
3.损失函数和优化方案设计
(损失函数和优化器要能够保证反向传播能够在用户自行定义模型结构上实现)
4.前向传播
5.反向传播
6.更新参数

PyTorch实现流程

1.导入数据包

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, DataLoader

(如果发现jupyter notebook中有包没有下载,可以直接从Anaconda Prompt(anaconda3)相应的环境中下载,重新编译内核就可以使用)

2.设置超参数

os.environ['CUDA_VISIBLE_DEVICES']='0'
#超参数的设置
batch_size=256
num_workers=4#线程数
lr=le-4#学习率
epochs=20#训练的轮数

3.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() else "cpu")

(后续使用方案二)

4.数据读入及数据集处理
1)PyTorch常见数据读取方式(Dataset+DataLoader)
主要涉及以下三个函数:

  • init: 用于向类中传入外部参数,同时定义样本集
  • getitem: 用于逐个读取样本集合中的元素,可以进行一定的变换,并将返回训练/验证所需的数据
  • len: 用于返回数据集的样本数
    (这里以cifar10数据集为例演示)
import torch
from torchvision import datasets
train_data = datasets.ImageFolder(train_path, transform=data_transform)
val_data = datasets.ImageFolder(val_path, transform=data_transform)

2)自己定义的数据集(后续专门出一期写)
(这里的例子是图片存放在一个文件夹,另外有一个csv文件给出了图片名称对应的标签,这种情况需要自己定义Dataset类)

class MyDataset(Dataset):
    def __init__(self, data_dir, info_csv, image_list, transform=None):
        """
        Args:
            data_dir: path to image directory.
            info_csv: path to the csv file containing image indexes
                with corresponding labels.
            image_list: path to the txt file contains image names to training/validation set
            transform: optional transform to be applied on a sample.
        """
        label_info = pd.read_csv(info_csv)
        image_file = open(image_list).readlines()
        self.data_dir = data_dir
        self.image_file = image_file
        self.label_info = label_info
        self.transform = transform

    def __getitem__(self, index):
        """
        Args:
            index: the index of item
        Returns:
            image and its labels
        """
        image_name = self.image_file[index].strip('\n')
        raw_label = self.label_info.loc[self.label_info['Image_index'] == image_name]
        label = raw_label.iloc[:,0]
        image_name = os.path.join(self.data_dir, image_name)
        image = Image.open(image_name).convert('RGB')
        if self.transform is not None:
            image = self.transform(image)
        return image, label

    def __len__(self):
        return len(self.image_file)

5.模型初始化(torch.nn.init()使用和分析)
1)官方文档介绍https://pytorch.org/docs/stable/nn.init.html
2)使用方法

  • torch.nn.init进行初始化
  • isinstance判断模型属于类型
  • initialize_weights()模型初始化后进行封装
import torch
import torch.nn as nn

conv = nn.Conv2d(1,3,3)
linear = nn.Linear(10,1)

isinstance(conv,nn.Conv2d)
isinstance(linear,nn.Conv2d)
def initialize_weights(self):
	for m in self.modules():
		# 判断是否属于Conv2d
		if isinstance(m, nn.Conv2d):
			torch.nn.init.xavier_normal_(m.weight.data)
			# 判断是否有偏置
			if m.bias is not None:
				torch.nn.init.constant_(m.bias.data,0.3)
		elif isinstance(m, nn.Linear):
			torch.nn.init.normal_(m.weight.data, 0.1)
			if m.bias is not None:
				torch.nn.init.zeros_(m.bias.data)
		elif isinstance(m, nn.BatchNorm2d):
			m.weight.data.fill_(1) 		 
			m.bias.data.zeros_()	

6.损失函数
1)本质作用:计算预测值和真实值的差距的一类型函数
2)使用位置:在前向传播和反向传播之间,有点承上启下的感觉,承上指:接収模型的预测值,启下指:计算预测值和真实值的差值,为下面反向传播提供输入数据。
7.训练与评估
1)设置状态
2)读取数据
3)放置数据到GPU上
8.PyTorch优化器(torch.optim)
1)何为优化器:优化器是根据网络反向传播的梯度信息来更新网络的参数,以起到降低loss函数计算值,使得模型输出更加接近真实标签。
2)基类Optimizer的三个属性:

  • defaults:存储优化器的超参数

  • state:参数的缓存

  • param_groups:管理参数组
    实现的另外方法:

  • zero_grad():清空所管理参数的梯度

  • step():执行一步梯度更新

  • add_param_group():添加参数组

  • load_state_dict():加载状态参数字典

  • state_dict():获取优化器当前状态信息字典

二、FasionMNIST基础实战

问题总结

1.DataLoader worker (pid(s) 9528, 8320) exited unexpectedly
在这里插入图片描述在这里插入图片描述
问题分析:
Windows系统默认只给C盘分配了内存空间,如果把Python或支撑环境的其他文件放在除C盘的其他盘里就会出现如此报错,提示内存不够用。
解决方案:
需要通过高级系统设置给对应的盘开内存,详见参考文档。
(修改num_workers治标不治本)

三、参考文档

来自Datawhale的投喂

在线教程链接:
https://datawhalechina.github.io/thorough-pytorch/

Github在线教程:
https://github.com/datawhalechina/thorough-pytorch

Gitee在线教程:
https://gitee.com/datawhalechina/thorough-pytorch

b站视频:
https://www.bilibili.com/video/BV1L44y1472Z
(欢迎大家一键三连+关注!)

来自广大网友的投喂

PyTorch常用数据包及功能https://blog.csdn.net/qq_39941918/article/details/88835842
磁盘内存不够用引发的问题(页面文件太小等同源)
https://www.cnblogs.com/20183544-wangzhengshuai/p/14814459.html
损失函数全面介绍
传送门


总结

1.非常清晰详细的完整实践流程,亲测小白友好。
2.纵然教程已经足够详尽,但仍然还会有一些细节的问题需要进一步理解,希望尽力各个击破。
3.理论与实践深度节后,学一点实现一点,这是之前不曾有的习惯。
4.向所有Datawhale的小伙伴致谢,特别感谢组内的Dennis博士、奇奇。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值