【学习记录】Pytorch CNN model

【想法】

  • 没有模型,可以参数初始化
  • 在这里插入图片描述
  • 模型+模型 model

【资料卡】

【pycharm】

  • 注释 ctrl+/ (如果突然用不了这个快捷键 抽风?一会儿好像又好了
  • 全局搜索 Ctrl + Shift + F

【神经网络模型】

深度学习之PyTorch实战(2)——神经网络模型搭建和参数优化

!文章入门强烈推荐👍,写的非常详细。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • torch.nn.Linear类用于定义模型的线性层,即完成前面提到的不同的层之间的线性变换。
  • torch.nn.ReLU类属于非线性激活分类。
  • 【损失函数的具体用法】。。。
  • 模型训练。引入了优化算法,所以通过直接调用optimzer.zero_grad来完成对模型参数梯度的归零;并且在以上代码中增加了optimzer.step,它的主要功能是使用计算得到的梯度值对各个节点的参数进行梯度更新。
  • torch.optim:模型参数的优化
  • torch.autograd:自动梯度
  • model forward: 也就是说 ,当把定义的网络模型 model 当做函数调用的时候就自动调用定义的网络模型 forward方法。 可以看到,当执行 model(x) 的时候,底层自动调用 forward 方法计算结果。
  • pytorch中 x = x.view(x.size(0), -1) 的理解: view() 函数的功能跟 reshape类似,用来转换size大小。x = x.view(batchsize, -1) 中的 batchsize 指转换后有几行,而 -1 指在不告诉函数有多少列的情况下,根据原tensor数据和batchsize自动分配列数。
  • 全连接层 卷积层

全连接层

全局平均池化层

https://zhuanlan.zhihu.com/p/46235425

  • 在卷积神经网络的初期,卷积层通过池化层(一般是 最大池化)后总是要一个或n个全连接层,最后在softmax分类。其特征就是全连接层的参数超多,使模型本身变得非常臃肿。
  • global average poolilng。既然全连接网络可以使feature map的维度减少,进而输入到softmax,但是又会造成过拟合,是不是可以用pooling来代替全连接。
    答案是肯定的,Network in Network工作使用GAP来取代了最后的全连接层,直接实现了降维,更重要的是极大地减少了网络的参数(CNN网络中占比最大的参数其实后面的全连接层)。
    在这里插入图片描述
    GAP的真正意义是:对整个网路在结构上做正则化防止过拟合。其直接剔除了全连接层中黑箱的特征,直接赋予了每个channel实际的内别意义。实践证明其效果还是比较可观的,同时GAP可以实现任意图像大小的输入。但是值得我们注意的是,使用gap可能会造成收敛速度减慢。
  • 论文:Network In Network
  • 关于使用GAP或者全局池化的好处,卷积神经网络在图像分类中,把卷积层作为特征提取,全链接层+softmax作为归回分类,这样方式会导致在全连接层输入神经元太多容易导致过拟合,所以Hinton等人提出了Dropout概念,提高网络泛化能力防止了过拟合发生。但是GAP是另外方式避免全连接层的处理,直接通过全局池化+softmax进行分类,它的优点是更加符合卷积层最后的处理,另外一个优点是GAP不会产生额外的参数,相比全连接层的处理方式,降低整个计算量,此外全局池化还部分保留来输入图像的空间结构信息,所以全局池化在有些时候会是一个特别有用的选择。
  • avg_pool2d 代码原理

【模型训练相关】


优化器SGD

随机梯度下降(stochastic gradient descent)

optimizer = optim.SGD(net.parameters(), lr=0.01, weight_decay=1e-6, momentum=0.9, nesterov=True)

nn.sequential

Pytorch 容器之 nn.Sequential
nn.Sequential 是一个有序的容器,神经网络模块将按照在传入构造器的顺序依次被添加到计算图中执行,同时以神经网络模块为元素的有序字典也可以作为传入参数。
在初始化函数 init 中,首先是 if 条件判断,如果传入的参数为 1 个,并且类型为 OrderedDict,通过字典索引的方式将子模块添加到 self._module 中,否则,通过 for 循环遍历参数,将所有的子模块添加到 self._module 中。


nn.Conv2dl

pytorch之torch.nn.Conv2d()函数详解
【PyTorch学习笔记】17:2D卷积,nn.Conv2d和F.conv2d
nn.Conv2d:对由多个输入平面组成的输入信号进行二维卷积
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

【模型融合】


nn.ReLU(inplace=True)

将输入小于0的值幅值为0,输入大于0的值不变。
inplace=true 选择是否将得到的值计算得到的值覆盖之前的值。节省内存。


nn.MaxPool2d(kernel_size=2, stride=2),

在由多个输入通道组成的输入信号上应用2D max池。
【学习笔记】torch.nn.MaxPool2d参数解释
在这里插入图片描述


np.linspace()

np.linspace主要用来创建等差数列。

numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None, axis=0)

开始值,结束值,样本数。

【导入模型】


model.train()/eval()

model.train()和model.eval()的区别主要在于Batch Normalization和Dropout两层。

区别
训练集在train下运行,验证集和测试集都在eval下运行


with torch.no_grad()

pytorch中with torch.no_grad():
在这里插入图片描述
在这里插入图片描述
好像可以减少内存开销?


load_state_dict

torch.load_state_dict()函数就是用于将预训练的参数权重加载到新的模型之中
在这里插入图片描述

debug

1.TypeError: ‘CNN2d_classifier_xiao’ object is not subscriptable
——索引对象不支持索引
2.在这里插入图片描述
3. Can’t get attribute ‘cnn2d_xiao_merge’ on <module ‘main

【优化模型】

优化模型参数

优化在这里插入图片描述
在这里插入图片描述


指定训练层

pytorch载入预训练模型后,实现训练指定层

【数据特征提取】


功能快捷键

撤销:Ctrl/Command + Z
重做:Ctrl/Command + Y
加粗:Ctrl/Command + B
斜体:Ctrl/Command + I
标题:Ctrl/Command + Shift + H
无序列表:Ctrl/Command + Shift + U
有序列表:Ctrl/Command + Shift + O
检查列表:Ctrl/Command + Shift + C
插入代码:Ctrl/Command + Shift + K
插入链接:Ctrl/Command + Shift + L
插入图片:Ctrl/Command + Shift + G
查找:Ctrl/Command + F
替换:Ctrl/Command + G

生成一个适合你的列表

  • 项目
    • 项目
      • 项目
  1. 项目1
  2. 项目2
  3. 项目3
  • 计划任务
  • 完成任务

创建一个表格

一个简单的表格是这么创建的:

项目Value
电脑$1600
手机$12
导管$1

设定内容居中、居左、居右

使用:---------:居中
使用:----------居左
使用----------:居右

第一列第二列第三列
第一列文本居中第二列文本居右第三列文本居左

SmartyPants

SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:

TYPEASCIIHTML
Single backticks'Isn't this fun?'‘Isn’t this fun?’
Quotes"Isn't this fun?"“Isn’t this fun?”
Dashes-- is en-dash, --- is em-dash– is en-dash, — is em-dash

创建一个自定义列表

Markdown
Text-to-HTML conversion tool
Authors
John
Luke

新的甘特图功能,丰富你的文章

Mon 06 Mon 13 Mon 20 已完成 进行中 计划一 计划二 现有任务 Adding GANTT diagram functionality to mermaid
  • 关于 甘特图 语法,参考 这儿,

FLowchart流程图

我们依旧会支持flowchart的流程图:

Created with Raphaël 2.3.0 开始 我的操作 确认? 结束 yes no
  • 关于 Flowchart流程图 语法,参考 这儿.

PyTorch是一个流行的深度学习框架,它提供了许多用于构建卷积神经网络(CNN)的工具和函数。以下是使用PyTorch构建CNN的一些基本步骤: 1.导入必要的库和模块: ```python import torch import torch.nn as nn import torch.optim as optim import torchvision.datasets as dsets import torchvision.transforms as transforms ``` 2.定义超参数: ```python batch_size = 100 num_epochs = 10 learning_rate = 0.001 ``` 3.加载数据集并进行预处理: ```python train_dataset = dsets.MNIST(root='./data', train=True, transform=transforms.ToTensor(), download=True) test_dataset = dsets.MNIST(root='./data', train=False, transform=transforms.ToTensor()) train_loader = torch.utils.data.DataLoader(dataset=train_dataset, batch_size=batch_size, shuffle=True) test_loader = torch.utils.data.DataLoader(dataset=test_dataset, batch_size=batch_size, shuffle=False) ``` 4.定义CNN模型: ```python class CNN(nn.Module): def __init__(self): super(CNN, self).__init__() self.layer1 = nn.Sequential( nn.Conv2d(1, 32, kernel_size=3, stride=1, padding=1), nn.ReLU(), nn.MaxPool2d(kernel_size=2, stride=2)) self.layer2 = nn.Sequential( nn.Conv2d(32, 64, kernel_size=3, stride=1, padding=1), nn.ReLU(), nn.MaxPool2d(kernel_size=2, stride=2)) self.fc = nn.Linear(7 * 7 * 64, 10) def forward(self, x): out = self.layer1(x) out = self.layer2(out) out = out.reshape(out.size(0), -1) out = self.fc(out) return out model = CNN() ``` 5.定义损失函数和优化器: ```python criterion = nn.CrossEntropyLoss() optimizer = optim.Adam(model.parameters(), lr=learning_rate) ``` 6.训练模型: ```python total_step = len(train_loader) for epoch in range(num_epochs): for i, (images, labels) in enumerate(train_loader): outputs = model(images) loss = criterion(outputs, labels) optimizer.zero_grad() loss.backward() optimizer.step() if (i+1) % 100 == 0: print('Epoch [{}/{}], Step [{}/{}], Loss: {:.4f}' .format(epoch+1, num_epochs, i+1, total_step, loss.item())) ``` 7.测试模型: ```python with torch.no_grad(): correct = 0 total = 0 for images, labels in test_loader: outputs = model(images) _, predicted = torch.max(outputs.data, 1) total += labels.size(0) correct += (predicted == labels).sum().item() print('Test Accuracy of the model on the 10000 test images: {} %'.format(100 * correct / total)) ``` 这就是使用PyTorch构建CNN的基本步骤。当然,这只是一个简单的例子,您可以根据自己的需求进行修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值