pytorch学习笔记2

深度学习的流程

1.首先导入必要的包,如os 、numpy……

  一、有些包是python解释器默认自带的,有些则需要通过pip安装(安装方法可自行查教程),所有包安装后要通过import引入再用。

  二、os(operating system)—— 一个有关系统操作的包

以下是os的一些常用方法: 

i 文件和目录操作相关

- os.getcwd():用于获取当前工作目录的绝对路径。例如,在你运行Python脚本时,它会告诉你脚本所在的目录位置。

- os.chdir(path):改变当前工作目录到指定的路径。比如 os.chdir("new_folder") 会将当前目录切换到名为“new_folder”的目录中。

- os.listdir(path):返回指定路径下的所有文件和目录名称列表。如果不指定路径,就返回当前工作目录下的文件和目录列表。

- os.mkdir(path):创建一个新的目录。注意,如果目录已经存在,会抛出异常。例如 os.mkdir("test_dir") 会创建一个名为“test_dir”的目录。

- os.makedirs(path):和 os.mkdir() 类似,但可以创建多层目录。比如 os.makedirs("parent/child") 会创建“parent”目录和它下面的“child”目录。

- os.rmdir(path):删除一个空目录。如果目录非空,则无法删除并会报错。

- os.remove(path):用于删除指定路径的文件。

- os.path.join(path1, path2,...):将多个路径组合成一个有效的路径。在跨平台开发时很有用,因为不同操作系统的路径分隔符不同,该方法会自动使用正确的分隔符。例如 os.path.join("folder", "file.txt") 会返回一个有效的路径字符串。

- os.path.exists(path):检查指定路径的文件或目录是否存在,返回布尔值。

- os.path.isdir(path):判断指定路径是否是目录,返回布尔值。

- os.path.isfile(path):判断指定路径是否是文件,返回布尔值。

j环境变量相关

- os.environ:返回一个包含系统环境变量的字典。可以通过字典的方式访问和修改环境变量。例如 os.environ['PATH'] 可以获取系统的PATH环境变量的值。

k进程相关

- os.system(command):在子进程中执行操作系统命令,返回命令的退出状态码。例如 os.system("ping www.example.com") 会执行ping命令。不过这种方法在功能上相对有限,对于复杂的进程交互可能不太适用。

  三、什么是环境变量,有什么用?

  环境变量是在操作系统或软件环境中用于存储配置信息的变量。

  当你在 os 包中设置新的环境变量,可以像系统自带的环境变量一样,为程序运行提供必要的配置细节(去哪里找文件、需要调用多少配置……)。

2.配置训练环境和超参数

 

 #这四个超参数分别表示:每次读入数据量、所用线程数、学习率(步长)、训练轮数

3.数据读入(Dataset)和加载(DataLoader)

 

 一、torchvision

    torchvision 是PyTorch的一个重要的计算机视觉库。

它提供了许多用于处理图像和视频数据的工具。其中包括大量的数据集,如MNIST(手写数字图像集)、CIFAR - 10(包含10个不同类别的小图像数据集)和ImageNet(大规模的图像识别数据集)等,这些数据集可以方便地用于模型的训练和测试。

    在数据处理方面, torchvision.transforms 模块提供了各种图像变换操作,像将图像调整大小( Resize )、裁剪( RandomCrop )、转换为张量( ToTensor )以及标准化( Normalize )等,这些操作有助于对图像进行预处理,使其符合模型训练的要求。

    对于模型架构, torchvision.models 中有许多经典的预训练的计算机视觉模型,例如AlexNet、VGG、ResNet等。这些预训练模型可以用于迁移学习,即利用模型在大规模数据集上已经学到的特征,在新的、可能数据量较小的任务上进行微调,从而快速构建高效的视觉模型。

二、设置数据变换:

#具体标签作用可看读取数据集那一步

三、读取数据集(制作Dataset)的方式:

j读取内置的数据集:

#如果想换成别的数据集,将“FashionMNIST”换成想用的数据集名即可。

k读取csv格式(表格)的数据集:            

class FMDataset(Dataset): 这行代码表示定义了一个名为FMDataset的类,它继承自Dataset类。在PyTorch中,Dataset是一个抽象类,用于表示数据集。通过继承Dataset类并实现其方法(如__init__、__len__和__getitem__),我们可以创建自己的数据集类,以便在训练神经网络时使用。(当一个类继承自另一个类时,它可以拥有另一个类的功能和使用方法)

在FMDataset类中,__init__方法用于初始化对象,它接收一个DataFrame对象df和一个可选的转换函数transform作为参数。self.images和self.labels分别用于存储图像数据和标签数据。__len__方法返回数据集中的样本数量,而__getitem__方法则根据索引idx返回对应的图像和标签。在__getitem__方法中,图像数据被重新整形为(28, 28, 1)的形状(对应于Fashion MNIST数据集中的图像尺寸),并进行了归一化处理。如果提供了转换函数transform,则会对图像应用该转换。最后,图像和标签都被转换为PyTorch张量并返回。

# P1是csv的格式形式图,第一列是label(标签),第二列往后是plxel(像素点)

# iloc是pandas的一个操作

#倒数3、4行是用pandas的一个函数从指定文件夹读取数据

#最后两行是对原始数据进行上面一系列操作,制作成我们需要的dataset

#通过 self,你可以访问类中定义的实例变量(属性)。如这里用可以使用self.df来访问DataFrame、使用self.transform来对数据进行转换

四、这里的归一化处理是什么?

在图像处理中,归一化处理通常用于像素值的调整。例如,将图像的像素值范围从[0, 255]归一化到[0, 1],可以更好地进行图像增强、图像分割和目标检测等任务。此外,对于图像数据,还可以采用基于矩的图像归一化技术,该技术通过一系列变换将图像转换为具有不变特性的标准形式,从而抵抗几何变换的攻击。有助于提高机器学习算法的性能和准确性

五、定义Dataloader

# shuffle 是指是否打乱

#drop_last 是指是否丢掉最后不足一个bacth_size(每一次读取的数据量)的数据

六、验证数据集构建是否成功(例如可通过一些可视化操作):

4.模型构建

代码解释:class是在定义一个类,Net类是一个继承自nn.Module的自定义神经网络类。在PyTorch中,nn.Module是所有神经网络模块的基类,提供了模型构建所需的基本功能。

初始化方法(__init__)

在Net类的初始化方法中,首先调用了父类nn.Module的初始化方法,这是通过super(Net, self).__init__()实现的。这是构建PyTorch模型时的标准做法,它确保了父类被正确初始化。

接下来,定义了一个名为self.conv的nn.Sequential对象。nn.Sequential是一个容器,用于按顺序堆叠多个层。在这个例子中,

self.conv包含了以下层

  1. 第一个卷积层:nn.Conv2d(1, 32, 5)。这表示一个二维卷积层,输入通道数为1(例如,灰度图像),输出通道数为32,卷积核大小为5x5。
  2. ReLU激活函数:nn.ReLU()。这跟在第一个卷积层后面,用于引入非线性。
  3. 第一个最大池化层:nn.MaxPool2d(2, stride=2)。这表示一个二维最大池化层,池化核大小为2x2,步长为2。
  4. Dropout层:nn.Dropout(0.3)。这用于在训练过程中随机丢弃30%的神经元输出,以减少过拟合。
  5. 第二个卷积层:nn.Conv2d(32, 64, 5)。这表示另一个二维卷积层,输入通道数为32(前一个卷积层的输出通道数),输出通道数为64,卷积核大小为5x5。
  6. 另一个ReLU激活函数:再次引入非线性。
  7. 第二个最大池化层:与第一个最大池化层相同。
  8. 另一个Dropout层:与第一个Dropout层相同。

全连接层self.fc

第一个全连接层的输入特征数为6444。这个层将输入特征转换为512个特征。接着是ReLU激活函数,然后是另一个全连接层,将512个特征转换为10个输出特征(例如,用于10类分类任务)。

向前传播方法forward:

forward方法定义了数据通过网络的前向传播路径。输入数据x首先通过卷积层和池化层的序列self.conv,然后通过view方法将输出展平为一个二维张量,以便可以传递给全连接层。接着,数据通过全连接层的序列self.fc,最后返回输出结果。

一、nn.Sequential

在PyTorch框架中,nn.Sequential是一个用于按顺序容器化一系列模块的类。这些模块可以是卷积层(nn.Conv2d)、激活函数(如nn.ReLU)、池化层(如nn.MaxPool2d)、全连接层(nn.Linear)等。当你将多个这样的层放入一个nn.Sequential对象中时,它们会按照你添加的顺序被自动执行。

二、nn.ReLU()

ReLU函数是深度学习中一种非常流行的非线性激活函数,它能够将所有的负值置为0,而正值则保持不变。这种操作引入了非线性因素,使得神经网络能够学习和模拟更复杂的函数关系。在PyTorch的torch.nn模块中,nn.ReLU()是一个类,用于在神经网络中创建一个ReLU激活层。(上图也体现了nn.ReLU()的用法)

三、nn.Module

nn.Module 是 PyTorch 框架中用于构建神经网络的基础类。

nn.Module 提供了神经网络模型所需的基本功能,比如参数的存储、前向传播的定义、参数的优化等。

主要功能

  1. 参数管理:nn.Module 会自动追踪其内部定义的参数(例如权重和偏置),这些参数在模型训练过程中会被优化。
  2. 前向传播定义:通过重写 nn.Module 的 forward 方法,用户可以定义模型的前向传播逻辑。这是构建神经网络的核心部分,决定了输入数据如何通过网络进行变换。
  3. 模块化和层次化:nn.Module 支持模块化和层次化的网络设计。这意味着你可以将网络的不同部分定义为单独的 nn.Module 子类,然后将它们组合起来构建更复杂的网络。这种设计使得网络结构更加清晰,易于维护和扩展。
  4. 设备分配:nn.Module 提供了方便的方法将模型移动到不同的设备上,比如 CPU 或 GPU。这通过调用 .to(device) 方法实现,其中 device 是一个指定目标设备的字符串或 torch.device 对象。
  5. 参数初始化:虽然 nn.Module 本身不直接提供参数初始化的方法,但 PyTorch 提供了多种初始化方法(如 torch.nn.init 中的函数),可以在定义模型后手动应用这些方法来初始化参数。
  6. 保存和加载模型:nn.Module 提供了 state_dict 方法,允许用户保存或加载模型的参数。state_dict 是一个简单的 Python 字典对象,将每一层映射到其参数张量。

注意:卷积层、池化层、Dropout层

5.损失函数(具体是什么之前的笔记里有):

一、torch.nn

torch.nn是PyTorch深度学习框架中的一个核心模块,它提供了一个框架来定义神经网络层和模型,包含了构建和训练神经网络所需的所有工具和功能。以下是torch.nn的一些主要部分:

1.nn.Module

    • 是所有神经网络模块的基类,所有自定义神经网络模型都应继承这个类。
    • 用户可以通过继承nn.Module来定义自己的神经网络,每个nn.Module都包含两个主要方法:__init__和forward。在__init__方法中定义网络的层和参数,在forward方法中定义前向传播的过程。

2.常见的层

    • torch.nn提供了许多常见的神经网络层,例如全连接层(nn.Linear)、卷积层(如nn.Conv1d、nn.Conv2d、nn.Conv3d,分别用于一维、二维和三维数据的卷积操作)、循环神经网络层(如nn.LSTM、nn.GRU)、激活函数(如nn.ReLU、nn.Sigmoid、nn.Tanh)、池化层(如nn.MaxPool1d、nn.MaxPool2d、nn.AvgPool2d,用于下采样特征图)等。
    • 此外,还有正则化层,如批量归一化(nn.BatchNorm1d、nn.BatchNorm2d等)。

3.损失函数

    • 用于衡量模型的预测结果与真实结果之间的差距,torch.nn包含了一系列损失函数,例如对数似然损失(nn.NLLLoss,配合LogSoftmax层使用于分类任务)、均方误差损失(nn.MSELoss,适用于回归任务)、交叉熵损失(nn.CrossEntropyLoss,常用于分类任务)等。

4.优化器

    • 虽然优化器本身不属于torch.nn模块,但torch.nn常与torch.optim模块配合使用,用于更新模型的参数以最小化损失函数。torch.optim提供了多种优化算法,如随机梯度下降(torch.optim.SGD)、Adam(torch.optim.Adam)等。

#有需要还可设置每一阶的权重(具体方法要用的时候查)

6.优化器

#优化器定义时需要定义学习率

7.训练与测试

一、训练

  • model: 这是要训练的模型对象,它应该是一个已经定义好的神经网络模型。
  • device: 这是指定模型和数据应该在哪种设备上运行的参数。通常,这个参数是'cpu'或'cuda'(表示GPU)。使用GPU可以加速模型的训练。
  • train_loader: 这是一个数据加载器,用于在训练过程中按批次(batch)加载数据。它通常是一个PyTorch的DataLoader对象,该对象会遍历数据集,每次返回一个批次的数据和对应的标签。
  • optimizer: 这是一个优化器对象,用于更新模型的权重以最小化损失函数。常见的优化器包括SGD、Adam等。
  • epoch: 这是训练的轮次(epoch)数,表示整个数据集将被遍历多少次。
  • model.train(): 将模型设置为训练模式。这对于某些特定的层(如Dropout和BatchNorm)是必要的,因为它们在训练和评估时的行为是不同的。
  • 循环遍历train_loader,每次迭代返回一个批次的数据data和对应的标签target。
  • data.to(device), target.to(device): 将数据和标签移动到指定的设备上。如果device是'cuda',则数据会被移动到GPU上。
  • optimizer.zero_grad(): 在每次迭代开始前,将梯度清零。这是因为在PyTorch中,梯度是累加的,而不是每次迭代都重新计算的。
  • output = model(data): 通过模型进行前向传播,得到输出。
  • loss = F.nll_loss(output, target): 计算损失。这里使用的是负对数似然损失(Negative Log Likelihood Loss),它通常用于分类问题。
  • loss.backward(): 反向传播,计算损失关于模型参数的梯度。
  • optimizer.step(): 根据计算得到的梯度,更新模型的参数。

#注意将梯度清零:在连续求导的过程中,梯度是会不断累加的,算每一阶的梯度时都需要将上一阶的梯度清零。optimizer.zero_grad( )

二、测试

  1. 模型设置为评估模式:model.eval()将模型设置为评估模式。这是因为在某些模型中(如包含Dropout和BatchNorm层的模型),训练和评估时的行为是不同的。在评估模式下,Dropout层会被禁用,BatchNorm层会使用整个数据集的统计信息而不是当前batch的统计信息。
  2. 初始化变量
    • val_loss=0:初始化验证损失为0。这个变量将用于累加每个batch的损失值。
    • gt_labels=[]和pred_labels=[]:创建两个空列表,用于存储实际标签(ground truth labels)和预测标签。
  3. 禁用梯度计算:with torch.no_grad():在评估模型时,我们不需要计算梯度,因此可以使用torch.no_grad()来禁用梯度计算,这有助于减少内存消耗并加速计算。
  4. 遍历测试数据集:for data, label in test_loader:循环遍历测试数据加载器test_loader中的每个数据样本。在每个迭代中,data和label分别表示输入数据和对应的标签。
  5. 数据转换:data, label = data.cuda(), label.cuda()将数据和标签转移到CUDA设备上(如果可用),以便在GPU上进行计算。
  6. 模型前向传播:output = model(data)通过模型进行前向传播,得到输出。
  7. 获取预测标签:preds = torch.argmax(output, 1)使用torch.argmax函数沿着指定维度(这里是1,表示对每个样本的输出向量取最大值所在的索引)获取预测标签。
  8. 存储标签:将实际标签和预测标签分别存储到gt_labels和pred_labels列表中。注意,这里在将标签添加到列表之前,先将它们转移到CPU上并转换为NumPy数组。
  9. 计算损失:loss = criterion(output, label)使用指定的损失函数(criterion)计算损失值。这个损失函数应该在代码的其他部分被定义。
  10. 累加损失值:val_loss += loss.item() * data.size(0)将当前batch的损失值累加到val_loss变量中。这里data.size(0)表示当前batch中的样本数。
  11. 计算平均损失:val_loss = val_loss / len(test_loader.dataset)计算整个测试数据集上的平均损失。
  12. 计算准确率:首先,使用np.concatenate函数将gt_labels和pred_labels列表中的NumPy数组连接起来(注意,这里似乎有一个小错误,pled_labels应该是pred_labels的笔误)。然后,计算准确率,即实际标签和预测标签相等的样本数占总样本数的比例。

#计算准确率,评估模型

#注意torch.no_grad()

一些其他问题:

jDrop层可以避免过拟合,什么是过拟合?

过拟合(Overfitting)是机器学习中的一个常见问题,它指的是模型在训练数据上表现得过于优秀,以至于它学习到了训练数据中的噪声和细节,而这些噪声和细节并不适用于新的、未见过的数据。简单来说,过拟合的模型在训练集上性能很好,但在测试集或实际应用中的性能却很差。

k卷积层是什么,有什么功能?

卷积层(Convolutional Layer)是卷积神经网络(Convolutional Neural Network, CNN)的核心组成部分。

  • 定义:卷积层由多个卷积单元组成,每个卷积单元通过卷积运算对输入数据进行特征提取。
  • 功能:提取输入数据(如图像)的局部特征,如边缘、纹理、角点等,并逐层抽象为更高级的特征表示。
  • 卷积层广泛应用于图像处理与识别、自然语言处理(如文本分类、句子表征等任务)以及时序数据处理(如金融数据、传感器数据分析)等领域。

l池化层:

通常跟随在卷积层之后,用于降低数据维度、减小计算量,同时提高模型的鲁棒性。常见的池化方式有最大池化和平均池化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值