torch

关于RNN (循环神经网络)相邻采样为什么在每次迭代之前都需要将参数detach

三世轮回 提交于 2020-08-10 12:27:13
关于RNN (循环神经网络)相邻采样为什么在每次迭代之前都需要将参数detach 这个问题出自《动手学深度学习pytorch》中RNN 第六章6.4节内容,如下图所示: 当时看到这个注释,我是一脸懵逼,(难道就不能解释清楚一点嘛,让我独自思考了那么长时间,差评!!!)我主要有以下疑惑: 每次小批量反向传播之后,由于torch是动态计算图,本质上该次的计算图已经销毁,与下次小批量迭代的构建的计算没有任何关联,detach不是多此一举嘛? 按照注释所说的,难道下次小批量构建的计算图由于初始隐藏状态引用于上次小批量迭代最后的时间步长的隐藏状态,这样计算图存在分支关联,方向传播会经过以前所有批量迭代构建的计算图,导致内存和计算资源开销大? 带着这两个疑惑,我开始面向百度编程(网上的博客真的是千篇一律啊,10篇当中9篇一样,哎世风日下,我也是服了,文章转来转去有意思嘛,自己收藏着看看不好嘛,非得全篇复制还转载,真的***)百度之后,我发现了以下解释(没一个有用的) 胡说八道型 这讲的啥?按你这么说,state是叶子节点了(估计不知道从哪抄的错误博客,害人匪浅啊),既然state都是叶子节点了,那还跟上一次批量的计算图有毛关系,反向传播个屁?叶子节点的定义:一棵树当中没有子结点(即度为0)的结点称为叶子结点。除了第一次小批量的初始隐藏状态是叶子节点外,其他批量的隐藏状态都经过隐藏层的计算

【pytorch-ssd目标检测】训练自己创建的数据集

百般思念 提交于 2020-08-10 09:30:04
制作类似pascal voc格式的目标检测数据集: https://www.cnblogs.com/xiximayou/p/12546061.html 代码来源:https://github.com/amdegroot/ssd.pytorch 拷贝下来的代码好多坑要踩。。。 我将其上传到谷歌colab上,当前目录结构如下: 需要说明的是,虽然我们只有2类,但是,要加上背景一类,所以总共我们有3类。 首先我们要读取自己的数据集 在config.py中 # config.py import os.path # gets home dir cross platform # HOME = os.path.expanduser("~") HOME = os.path.expanduser("/content/drive/My Drive/pytorch_ssd/") # for making bounding boxes pretty COLORS = ((255, 0, 0, 128), (0, 255, 0, 128), (0, 0, 255, 128 ), (0, 255, 255, 128), (255, 0, 255, 128), (255, 255, 0, 128 )) MEANS = (104, 117, 123 ) mask = { 'num_classes': 3, 'lr

【2020暑假学习】第三次作业:卷积神经网络 part2

久未见 提交于 2020-08-10 09:25:49
问题总结 当模型准确率已经较高时,如何判断自己的改动是否提升了性能。因为可能每一次准确率变化都不太大,而且每次训练的模型最后准确率也会有波动,多运行几次取准确率平均值做比较吗? 在想要提高性能的改进过程中,有很多改变可能都对性能的提升有些许的帮助。这个过程是一种一种方法的尝试,不断累积提升了性能的改变吗。比如先改了batch_size,找到了一个合适的大小,然后就固定使用这个大小,再调整优化器损失函数之类的?在调整的时候总有一种虽然当前的尝试没有提高性能,但说不定和别的组合在一起可能会变好的想法,简直要进行排列组合。 代码练习 MobileNet V1 如何判断nn.Conv2d(3, 3)是做的图一运算而不是图二? 通过Conv2d函数中的groups参数区别。groups取值范围为1 - in_channels。groups=1时做图二运算,groups=3时做图一运算。 若groups=x,则将输入通道分为x份,输出通道分为x份,对应每份分别做全卷积。 举例:nn.Conv2d(in_channels=6, out_channels=6, kernel_size=1, groups=3) 卷积核大小为torch.Size([6, 2, 1, 1]) 参考: 卷积层中的 group 参数理解 pytorch的conv2d函数groups分组卷积使用及理解 MobileNet

深入浅出PyTorch(算子篇)

混江龙づ霸主 提交于 2020-08-10 07:15:03
Tensor 自从张量(Tensor)计算这个概念出现后,神经网络的算法就可以看作是一系列的张量计算。所谓的张量,它原本是个数学概念,表示各种向量或者数值之间的关系。PyTorch的张量(torch.Tensor)表示的是N维矩阵与一维数组的关系。 torch.Tensor的使用方法和numpy很相似( https://pytorch.org/...tensor-tutorial-py ),两者唯一的区别在于torch.Tensor可以使用GPU来计算,这就比用CPU的numpy要快很多。 张量计算的种类有很多,比如加法、乘法、矩阵相乘、矩阵转置等,这些计算被称为算子(Operator),它们是PyTorch的核心组件。 算子的backend一般是C/C++的拓展程序,PyTorch的backend是称为"ATen"的C/C++库,ATen是"A Tensor"的缩写。 Operator PyTorch所有的Operator都定义在Declarations.cwrap和native_functions.yaml这两个文件中,前者定义了从Torch那继承来的legacy operator(aten/src/TH),后者定义的是native operator,是PyTorch的operator。 相比于用C++开发的native code,legacy

深度学习笔记(十三)YOLO V3 (PyTorch)

六眼飞鱼酱① 提交于 2020-08-10 00:35:19
上次记录了下 TensorFlow 版本 ,这次由于 剪枝 需要,尝试下 PyTorch 版本 。 源码目录总览 yolov3- ultralytics ├── cfg // 网络定义文件 │ ├── yolov3.cfg │ ├── yolov3 - spp.cfg │ ├── yolov3 - tiny.cfg ├── data // 数据配置 │ ├── samples // 示例图片,detect.py 检测的就是这里的图片 │ ├── coco.names // coco 用于检测的 80 个类别的名字 │ ├── coco_paper.names // coco 原始 91 个类别的名字 │ ├── coco2014.data // coco 2014 版本的训练测试路径配置 │ └── coco2017.data // coco 2017 版本的训练测试路径配置 ├── utils // 核心代码所在文件夹 │ ├── __init__ .py │ ├── adabound.py │ ├── datasets.py │ ├── google_utils.py │ ├── layers.py │ ├── parse_config.py │ ├── torch_utils.py │ └── utils.py ├── weights // 模型所在路径 │ ├──

在PyTorch中构建高效的自定义数据集

无人久伴 提交于 2020-08-09 19:37:20
学习Dataset类的来龙去脉,使用干净的代码结构,同时最大限度地减少在训练期间管理大量数据的麻烦。 神经网络训练在数据管理上可能很难做到“大规模”。 PyTorch 最近已经出现在我的圈子里,尽管对Keras和TensorFlow感到满意,但我还是不得不尝试一下。令人惊讶的是,我发现它非常令人耳目一新,非常讨人喜欢,尤其是PyTorch 提供了一个Pythonic API、一个更为固执己见的编程模式和一组很好的内置实用程序函数。我特别喜欢的一项功能是能够轻松地创建一个自定义的 Dataset 对象,然后可以与内置的 DataLoader 一起在训练模型时提供数据。 在本文中,我将从头开始研究PyTorch Dataset 对象,其目的是创建一个用于处理文本文件的数据集,以及探索如何为特定任务优化管道。我们首先通过一个简单示例来了解 Dataset 实用程序的基础知识,然后逐步完成实际任务。具体地说,我们想创建一个管道,从The Elder Scrolls(TES)系列中获取名称,这些名称的种族和性别属性作为一个one-hot张量。你可以在 我的网站 上找到这个数据集。 Dataset类的基础知识 Pythorch允许您自由地对“Dataset”类执行任何操作,只要您重写两个子类函数: -返回数据集大小的函数,以及 -函数的函数从给定索引的数据集中返回一个样本。

torch.nn.MaxPool2d

ぐ巨炮叔叔 提交于 2020-08-09 01:54:19
卷积操作中 pool层是比较重要的,是提取重要信息的操作,可以去掉不重要的信息,减少计算开销。 class torch.nn.MaxPool2d(kernel_size, stride=None, padding=0, dilation=1, return_indices=False, ceil_mode=False) 如果padding不是0,会在输入的每一边添加相应数目0 比如padding=1,则在每一边分别补0. 参数: kernel_size(int or tuple) - max pooling的窗口大小, stride(int or tuple, optional) - max pooling的窗口移动的步长。默认值是kernel_size padding(int or tuple, optional) - 输入的每一条边补充0的层数 dilation(int or tuple, optional) – 一个控制窗口中元素步幅的参数 return_indices - 如果等于True,会返回输出最大值的序号,对于上采样操作会有帮助 ceil_mode - 如果等于True,计算输出信号大小的时候,会使用向上取整,代替默认的向下取整的操作 a = torch.randn(3,5,10) b = nn.Maxpool2d((5,1)) # kernel = 5 步长为1

【pytorch】改造resnet为全卷积神经网络以适应不同大小的输入

帅比萌擦擦* 提交于 2020-08-08 17:56:02
为什么resnet的输入是一定的? 因为resnet最后有一个全连接层。正是因为这个全连接层导致了输入的图像的大小必须是固定的。 输入为固定的大小有什么局限性? 原始的resnet在imagenet数据集上都会将图像缩放成224×224的大小,但这么做会有一些局限性: (1)当目标对象占据图像中的位置很小时,对图像进行缩放将导致图像中的对象进一步缩小,图像可能不会正确被分类 (2)当图像不是正方形或对象不位于图像的中心处,缩放将导致图像变形 (3)如果使用滑动窗口法去寻找目标对象,这种操作是昂贵的 如何修改resnet使其适应不同大小的输入? (1)自定义一个自己网络类,但是需要继承models.ResNet (2)将自适应平均池化替换成普通的平均池化 (3)将全连接层替换成卷积层 相关代码: import torch import torch.nn as nn from torchvision import models import torchvision.transforms as transforms from torch.hub import load_state_dict_from_url from PIL import Image import cv2 import numpy as np from matplotlib import pyplot as plt

YOLOV3——PyTorch训练TensorFlowLite部署模型转换

馋奶兔 提交于 2020-08-08 00:49:25
主要思路 将训练好的.pt文件转换为keras的.h5文件,再将.h5文件转换为.tflite文件。 步骤: 1.环境:PyTorch1.0以上(其他版本也可以,主要是适配下面的开源代码) .pt转weights 下载后在文件内添加pt_to_weights.py。 from models import * model = Darknet("cfg/yolov3-obj.cfg") #load_darknet_weights(model,"weights/latest.pt") #save_weights(model,path='weights/latest.weights',cutoff=-1) checkpoint = torch.load("weights/latest.pt", map_location='cpu') model.load_state_dict(checkpoint['model']) save_weights(model,path='weights/latest.weights',cutoff=-1) 2.环境:Tensorflow2.0,要安装keras模块 .weights转.h5 修改输入层尺寸,input_layer = Input(shape=(416, 416, 3)),后续转换为tflite需要固定输入尺寸。不然会报错: 运行 python

Windows+Pytorch+EfficientDet

南笙酒味 提交于 2020-08-07 15:02:26
win7+python3.7+cuda10.1+pytorch1.4 (1)安装anaconda【先查看py37对应的anaconda版本】 https://repo.anaconda.com/archive/ https://docs.anaconda.com/anaconda/packages/oldpkglists/ 我这里是py37,anaconda就是Anaconda3-5.3.0-Windows-x86_64.exe,默认安装即可。 (2)安装ffmpeg【torchvision会用到】 不安装,可能会提示: torchvision installation problem: avcodec-58.dll not found 1): https://ffmpeg.zeranoe.com/builds/ 下载对应版本的动态库 2):将bin文件添加到系统环境变量 (3)安装mkl版本的numpy 不安装,可能会提示: from scipy.linalg import _fblas 1):到https://www.lfd.uci.edu/~gohlke/pythonlibs/#numpy, 2):根据自己的python版本和numpy版本找到对应的文件下载对应的whl文件 3):pip install 此安装文件 我这里是:numpy-1.16.4+mkl-cp37