• [技术干货] 五个PyTorch 中的处理张量的基本函数
    每个深度学习初学者都应该知道这5个Pytorch 的基本函数。作者:deephub   来源:今日头条能够以准确有效的方式构建神经网络是招聘人员在深度学习工程师中最受追捧的技能之一。PyTorch 是一个 主要用于深度学习的Python 库。 PyTorch 最基本也是最重要的部分之一是创建张量,张量是数字、向量、矩阵或任何 n 维数组。在构建神经网络时为了降低计算速度必须避免使用显式循环,我们可以使用矢量化操作来避免这种循环。在构建神经网络时,足够快地计算矩阵运算的能力至关重要。“为什么不使用 NumPy 库呢?”对于深度学习,我们需要计算模型参数的导数。 PyTorch 提供了在反向传播时跟踪导数的能力而 NumPy 则没有,这在Pytorch中被称为“Auto Grad”。PyTorch 为使用 GPU 的快速执行提供了内置支持。这在训练模型方面至关重要。由于 Numpy 缺乏将其计算转移到 GPU 的能力,因此训练模型的时间最终会变得非常大。所有使用 PyTorch 的深度学习项目都从创建张量开始。让我们看看一些必须知道的函数,它们是任何涉及构建神经网络的深度学习项目的支柱。torch.tensor()torch.sum()torch.index_select()torch.stack()torch.mm()在安装完Pytorch后,在代码中可以直接导入:# Import torch and other required modules import torch torch.tensor()首先,我们定义了一个辅助函数,describe (x),它将总结张量 x 的各种属性,例如张量的类型、张量的维度和张量的内容。# Helper function def describe(x):   print("Type: {}".format(x.type()))   print("Shape/size: {}".format(x.shape))   print("Values: \n{}".format(x) 使用 torch.Tensor 在 PyTorch 中创建张量PyTorch 允许我们使用 torch 包以多种不同的方式创建张量。 创建张量的一种方法是通过指定其维度来初始化一个随机张量describe(torch.Tensor(2, 3)) 使用 Python 列表以声明方式创建张量我们还可以使用 python 列表创建张量。 我们只需要将列表作为参数传递给函数,我们就有了它的张量形式。x = torch.Tensor([[1, 2, 3],[4, 5, 6]])  describe(x) 使用 NumPy 数组创建张量我们也可以从NumPy 数组中创建PyTorch 张量。 张量的类型是 Double Tensor 而不是默认的 Float Tensor。 这对应于 NumPy 的数据类型是float64,如下所示。import numpy as np npy = np.random.rand(2, 3) describe(torch.from_numpy(npy)) 我们不能用张量做什么?张量必须是实数或复数,不应是字符串或字符。torch.tensor([[1, 2], [3, 4, 5]])   --------------------------------------------------------------------------- ValueError                                Traceback (most recent call last) <ipython-input-5-28787d136593> in <module>       1 # Example 3 - breaking (to illustrate when it breaks) ----> 2 torch.tensor([[1, 2], [3, 4, 5]])  ValueError: expected sequence of length 2 at dim 1 (got 3) torch.tensor() 构成了任何 PyTorch 项目的核心,从字面上看,因为它就是张量。torch.sum()此函数返回输入张量中所有元素的总和。describe(torch.sum(x, dim=0,keepdims=True)) 如果你了解 NumPy ,可能已经注意到,对于 2D 张量,我们将行表示为维度 0,将列表示为维度 1。torch.sum() 函数允许我们计算行和列的总和。我们还为 keepdims 传递 True 以保留结果中的维度。 通过定义 dim = 1 我们告诉函数按列折叠数组。torch.sum(npy,dim=1,keepdims=True)  --------------------------------------------------------------------------- TypeError                                 Traceback (most recent call last) <ipython-input-17-1617bf9e8a37> in <module>()       1 # Example 3 - breaking (to illustrate when it breaks) ----> 2 torch.sum(npy,dim=1,keepdims=True)  TypeError: sum() received an invalid combination of arguments - got (numpy.ndarray, keepdims=bool, dim=int), but expected one of:  * (Tensor input, *, torch.dtype dtype)       didn't match because some of the keywords were incorrect: keepdims, dim  * (Tensor input, tuple of ints dim, bool keepdim, *, torch.dtype dtype, Tensor out)  * (Tensor input, tuple of names dim, bool keepdim, *, torch.dtype dtype, Tensor out) 该函数在计算指标和损失函数时非常有用。torch.index_select()这个函数返回一个新的张量,该张量使用索引中的条目(LongTensor)沿维度 dim 对输入张量进行索引。indices = torch.LongTensor([0, 2]) describe(torch.index_select(x, dim=1, index=indices)) 我们可以将索引作为张量传递并将轴定义为 1,该函数返回一个新的张量大小 rows_of_original_tensor x length_of_indices_tensor。indices = torch.LongTensor([0, 0]) describe(torch.index_select(x, dim=0, index=indices)) 我们可以将索引作为张量传递并将轴定义为 0,该函数返回大小为columns_of_original_tensor x length_of_indices_tensor 的新张量。indices = torch.FloatTensor([0, 2]) describe(torch.index_select(x, dim=1, index=indices)) 此函数在张量的非连续索引这种复杂索引中很有用。torch.stack()这将沿新维度连接一系列张量。describe(torch.stack([x, x, x],dim = 0)) 我们可以将我们想要连接的张量作为一个张量列表传递,dim 为 0,以沿着行堆叠它。describe(torch.stack([x, x, x],dim = 1)) 我们可以将我们想要连接的张量作为一个张量列表传递,dim 为 1,以沿着列堆叠它。y = torch.tensor([3,3]) describe(torch.stack([x, y, x],dim = 1))  -------------------------------------------------------------------------- RuntimeError                              Traceback (most recent call last) <ipython-input-37-c97227f5da5c> in <module>()       1 # Example 3 - breaking (to illustrate when it breaks)       2 y = torch.tensor([3,3]) ----> 3 describe(torch.stack([x, y, x],dim = 1))  RuntimeError: stack expects each tensor to be equal size, but got [2, 3] at entry 0 and [2] at entry 1 该函数与torch.index_select()结合使用非常有用,可以压扁矩阵。torch.mm()此函数执行矩阵的矩阵乘法。mat1 =torch.randn(3,2) describe(torch.mm(x, mat1)) 只需将矩阵作为参数传递,我们就可以轻松地执行矩阵乘法,该函数将产生一个新的张量作为两个矩阵的乘积。mat1 = np.random.randn(3,2) mat1 = torch.from_numpy(mat1).to(torch.float32) describe(torch.mm(x, mat1)) 在上面的例子中,我们定义了一个 NumPy 数组然后将其转换为 float32 类型的张量。 现在我们可以成功地对张量执行矩阵乘法。 两个张量的数据类型必须匹配才能成功操作。mat1 =torch.randn(2,3) describe(torch.mm(x, mat1))  --------------------------------------------------------------------------- RuntimeError                              Traceback (most recent call last) <ipython-input-62-18e7760efd23> in <module>()       1 # Example 3 - breaking (to illustrate when it breaks)       2 mat1 =torch.randn(2,3) ----> 3 describe(torch.mm(x, mat1))  RuntimeError: mat1 and mat2 shapes cannot be multiplied (2x3 and 2x3) 为了执行成功的矩阵乘法运算,矩阵1的列和矩阵2的行必须匹配。 torch.mm() 函数遵循的是矩阵乘法的基本规则。 即使矩阵的顺序相同,它仍然不会自动与另一个矩阵的转置相乘,用户必须手动定义它。为了在反向传播时计算导数,必须能够有效地执行矩阵乘法,这就是 torch.mm () 出现的地方。总结我们对 5 个基本 PyTorch 函数的研究到此结束。 从基本的张量创建到具有特定用例的高级和鲜为人知的函数,如 torch.index_select (),PyTorch 提供了许多这样的函数,使数据科学爱好者的工作更轻松。
  • [问题求助] pytorch转caffe遇到问题
  • [资产园地] CrowdDet (目标检测/Pytorch)
    描述CrowdDet (目标检测/Pytorch)1. 概述此模型基于Detection in Crowded Scenes: One Proposal, Multiple Predictions中提出的模型结构实现,该算法会载入在CrowdHuman上的预训练模型,在用户数据集上做迁移学习。我们提供了训练代码和可用于训练的模型,用于实际场景的微调训练。训练后生成的模型可直接在ModelArts平台部署成在线服务。以识别**为目标的检测的评估手段一般用AP​, MR-2和JI(Jaccard Index)指标,详细描述可参考原论文或下表。指标描述AP​Averaged precision of detection.MR-2Log-average miss rate on false positive per image.JI​Jaccard Index.本算法其他信息如下表所示:项目说明参考论文Detection in Crowded Scenes: One Proposal, Multiple Predictions使用框架Pytorch-1.4.0 (在ModelArts上使用Pytorch-1.4.0创建训练作业,然后在训练开始之前将Pytorch升级为1.5.0)训练集CrowdHuman annotation_train.odgt + images训练总epoch数25 (from scratch)训练batch_size8卡训练,每张卡batch_size = 2训练硬件及耗时8*v100,约11小时测试集CrowdHuman annotation_val.odgt + images输入图像尺寸CrowdHuman: [3236, 4856, 3]原论文指标AP = 90.7%, MR-2 = 41.4%, JI = 82.3%​本算法指标AP = 90.6%, MR-2 = 41.3%, JI = 83.4%2. 训练2.1. 算法基本信息任务类型:(**)目标检测支持的框架引擎:PyTorch-1.4.0-python3.6(在ModelArts上使用Pytorch-1.4.0创建训练作业,然后在训练开始之前将Pytorch升级为1.5.0)算法输入:存储在OBS上的数据集,必须按照CrowdHuman数据集的格式进行储存,详情请查看下文第4节。CrowdHuman预训练模型,在CrowdHuman验证集上的AP​是90.96%。算法输出:用于Pytorch推理的pth模型,在验证集上的推理结果代码结构src|-- download/ # 算法运行时将OBS中储存的数据将加载到此目录| |-- annotation_train.odgt| |-- annotation_val.odgt| |-- images/| | |-- 1066405,100a000985ef070.jpg|-- pre-trained_weights/| |-- resnet50_fbaug.pth # 训练模型所需要的backbone起点|-- trained_model/| |-- model/| | |-- model_config.py # 模型和训练默认参数配置| | |-- network.py # 模型结构| | |-- config.json # 模型部署文件| | |-- customize_service.py # 模型部署文件| | |-- model_final.pth # 训练得到的模型,用于模型部署| | |-- model_lib/ # 开源包、模型构建、数据集加载等文件| | | |--...|-- tools/| |-- run_infer.py # 推理| |-- run_train.py # 训练模型| |-- run_test.py # 在验证集上推理并输出评价指标|-- config_env.sh # 运行前环境配置(升级Pytorch-1.5.0)|-- train.py # 算法执行文件|-- evaluation.py # 输出业界评价标准2.2. 训练参数说明名称默认值类型是否必填是否可修改描述load_weight…/trained_model/model/model_final.pthstring否是训练起始模型,eval模式下则为测试模型,可以为obs路径total_epoch1int否是训练总轮数nr_images_epoch40000int否是每一轮训练用的图片数mini_batch_size2int否是每张卡的batch_sizewamr_iter1000int否是warmup循环数momentum0.9float否是SGD优化参数base_lr1.25e-3float否是具体learning rate根据实际GPU数计算log_dump_interval1int否是log打印频率weight_decay1e-4float否是SGD优化参数random_seed7int否是随机数种子evalfalsestring否是若设为1,则只从确定的模型pth在验证集上推理并计算评价指标2.3. 训练输出文件eval参数决定是否进行训练或跳过训练直接用现有模型在CrowdHuman验证集上推理评价。eval = 0训练模型,打印日志将模型储存在本地和train_url指定的路径(创建训练作业时指定的训练出入路径)所有输出在工作目录如下所示src|-- trained_model/| |-- model/|-- ...所有输出在obs上的目录如下所示|-- train_url/| |-- model/eval = 1用指定的模型进行推理验证,若用户指定模型,必须保证load_weight是obs中模型.pth文件的绝对路径。用户指定的data_url(创建训练作业时指定的训练输入路径)中可以只包含.jpg格式的图片,也可以包含annotation_val.odgt文件,若为后者,则输出的文件中包含eval_results.txt为业界评价标准,否则只输出pred_results.json和pred_results目录。支持用户自定义OBS上的数据集路径,若需要输出评价指标,则需要包含符合格式要求的annotation_val.odgt文件,若不需要输出评价指标,可以直接将data_url指向只包含图片的OBS文件夹。所有输出在OBS的目录如下所示|-- train_url/ # 创建训练作业时指定的训练出入路径| |-- eval_dump/| | |-- pred_results.json # 模型推理结果| | |-- eval_results.txt # 相应的评价指标结果| | |-- pred_results/ # 对每个图片的推理结果| | | |-- 1066405,100a000985ef070.json| | | |-- ...3. GPU/CPU本算法仅支持GPU运行。4. 数据准备从CrowdHuman下载CrowdHuman_train01.zip, CrowdHuman_train02.zip CrowdHuman_train03.zip, CrowdHuman_val.zip, annotation_train.odgt, annotation_val.odgt文件,将所有图片解压到同一个文件夹,最终保证在data_url(创建训练作业时指定的训练输入路径)中的目录如下所示|-- data_url/ # 创建训练作业时指定的训练出入路径| |-- images/ # 所有解压得到的图片| | |-- 1066405,100a000985ef070.jpg| | |-- ...| |-- annotation_train.odgt # 训练集标注文件| |-- annotation_val.odgt # 验证集标注文件5. 案例指导本算法的详细使用方法,请查看ModelArts AI Gallery CrowdDet算法指导。交付交付方式华为云ModelArts交付区域华北-北京一、华北-北京四、华东-上海一、华南-广州、亚太-**
  • [资产园地] PointRend(图像分割/Pytorch)
    描述PointRend(图像分割/Pytorch)1.概述此模型基于PointRend: Image Segmentation as Rendering中提出的模型结构实现,该算法会载入在Cityscape上的预训练模型,在用户数据集上做迁移学习。我们提供了训练代码和可用于训练的模型,用于实际场景的微调训练。训练后生成的模型可直接在ModelArts平台部署成在线服务。图像分割的评估手段一般使用AP,详细说明请参考:https://github.com/mcordts/cityscapesScripts#evaluation本算法的其他信息如下表所示:项目说明参考论文PointRend: Image Segmentation as Rendering使用框架Pytorch1.4.0训练集Cityscapes leftImg8bit_trainvaltest.zip中的trainepoch65(通过控制maxiter*batchsize/nums of picturesbatchsize8,对应config文件夹下的yaml中IMS_PER_BATCH训练硬件及耗时1*v100,12小时测试集Cityscapes leftImg8bit_trainvaltest.zip中的test推理硬件及速度CPU,1.85s/pic输入图像尺寸1024*2048,3通道原论文APAP=35.8本算法APAP=36.2722.训练2.1算法基本信息任务类型:图像分割支持的框架引擎:PyTorch-1.4.0-python3.6算法输入:存储在OBS上的数据集,必须按照Cityscape数据集的格式进行存储,详情请查看下文第4节案例指导Cityscape预训练模型,在Cityscape上的AP是36.2728算法输出用于Pytorch推理的pth模型,CPU推理速度:1.85s/pic代码结构PointRend|-configs#配置文件,包括其他数据集|-InstanceSegmentation|-…|-SemanticSegmentation|-…|-Base-RCNN-FPN.yaml|-datasets#此文件夹为空,上传数据集时会自动同步至云端本目录|-detectron2#开源包|-…|-inputimage#空文件夹,用于运行demo.py时自动同步待预测的影像|-model#用于部署在线服务、批量服务|-customize_service.py#用于部署在线服务、批量服务|-iteration_24000_mAP_36.3.pth#最优模型参数|-config.json#配置文件|-…|-output#空文件夹,训练和评估时暂存模型结果,最后会同步至obs|-outputimage#空文件夹,运行demo.py时暂存输出影像,同步obs|-point_rend#模型其他包|-…|-pre-trained_weights#预训练参数|R-50.pkl|-config.json|-demo.py#预测整个文件夹的影像|-matches.json#预测整个文件夹影像的json结果文件|-pip-requirements.txt|-train_net.py#包括train和eval|-detectron2-0.3+cu102-cp36-cp36m-linux_x86_64.whl#detectron2包###2.2参数说明名称默认值类型是否必填是否可修改描述说明config-fileconfigs/InstanceSegmentation/pointrend_rcnn_R_50_FPN_1x_cityscapes.yamlstring是是配置文件路径,不配置时,默认路径为本算法代码内的路径eval-only0int否是训练时设置值为0,评估时设置值为1MODELWEIGHTSmodelweight/model_final.pthstring否是仅仅评估时才需要这个参数并设置值为默认值maxiter2400int否是最大迭代次数,可以控制epoch=maxiter*batchsize/影像总数batchsize8int否是批大小num-gpus1int否是gpu的数目注意:eval参数有以下两种取值:(1)0,本算法执行模型训练过程;(2)1,本算法加载load_weight参数指定的模型,然后执行模型评估过程。模型评估需要支持以下三种输入情况:2a) 创建训练作业时指定的数据存储位置data_url目录下,如果同时有图片和ground_truth,则模型评估过程输出pred_results目录和eval_result.txt文件,前者存放所有图片的预测结果,后者存放模型评估的精度指标;2b) 创建训练作业时指定的数据存储位置data_url目录下,如果只有图片,则模型评估过程输出pred_results目录,存放所有图片的预测结果;2c) 创建训练作业时指定的数据存储位置data_url目录下,如果没有图片,则模型评估过程报错;MODELWEIGHTS参数有以下两种取值:(1)固定的默认路径,默认加载本算法源码目录中的modelweight/model_final.pth继续训练,加载成功会打印日志;(2)可变的OBS路径,用户可指定OBS上的一个模型文件路径,然后本算法会加载该模型继续训练,加载成功会打印日志。##2.3. 训练输出文件当仅添加config-file并设置为configs/InstanceSegmentation/pointrend_rcnn_R_50_FPN_1x_cityscapes.yaml时为训练(此路径也支持用户的obs路径),训练完成后会输出可部署的model文件夹以及config.yaml、log.txt,文件结构如下: |-config.yaml配置文件 |-log.txt日志文件 |-model |-customize_service.py#用于部署在线服务、批量服务 |-model_final.pth#用户训练得到的模型参数 |-config.json#配置文件 |-...除config-file之外,如果添加超参数eval-only并设置为True,且添加超参数MODELWEIGHTS并设置为model/iteration_24000_mAP_36.3.pth(此路径也支持用户的obs路径)输出文件如下(pred_results和eval_result.txt都保存在指定的训练输出OBS目录下):|-eval_result.txt#评估结果,只有用户上传的数据集包括groundtruth才会有这个文件|-pred_results;预测影像文件夹 |-frankfurt_000000_000294_leftImg8bit.png |-frankfurt_000000_000576_leftImg8bit.png |-...#3. GPU/CPU推理元模型来源 选择 从训练中选择,选择训练作业及版本。注意:推理配置文件config.json中的runtime字段为pytorch1.4-python3.7,表示该模型可同时在CPU或GPU运行。#4. 案例指导本算法的详细使用方法,请查看《ModelArts AI Gallery算法PointRend使用指导》。交付交付方式华为云ModelArts交付区域华北-北京一、华北-北京四、华东-上海一、华南-广州、亚太-**
  • [资产园地] GFocal loss 目标检测-Pytorch
    描述GFocal loss- Generalized Focal Loss1.概述此模型基于Generalized Focal Loss: Learning Qualified and Distributed Bounding Boxes for Dense Object Detection中提出的模型结构实现。该算法基于任意one-stage 检测器上,调整框本身与框质量估计的表示,同时用泛化版本的GFocal Loss训练该改进的表示,无cost提升AP(约1%的提升)。本算法使用COCO2017trainval数据集进行训练和验证,测试数据集为COCO2017test-dev数据集,数据集详情参考COCOdataset官网,最终在CODALAB官网在线测试论文table4中最后一行模型的复现结果如下表所示。APAP50AP75APsmallAPmediumAPlarge0.4820.6720.5240.2930.5150.604本算法其他信息如下表所示项目说明参考论文Generalized Focal Loss: Learning Qualified and Distributed Bounding Boxes for Dense Object Detection使用框架pytorch训练集coco2017 trainval训练总epoch数24训练batch_size2*8,其中2为训练参数中的samples_per_gpu每个GPU承担的图像数量,8为GPU_num即训练用到的GPU数目训练硬件8 * Tesla V100训练耗时32h 26min测试集coco2017 test-dev推理硬件1 * Tesla V100推理速度10.1 pic/s,此为在单GPUTesla-V100下,backbone为https://github.com/open-mmlab/mmdetection/blob/master/configs/gfl/gfl_x101_32x4d_fpn_dconv_c4-c5_mstrain_2x_coco.py2.训练2.1算法基本信息任务类型:目标检测支持的框架引擎:PyTorch-1.4.0-python3.6算法输入:存储在OBS上的数据集,必须按照COCO2017数据集的格式进行存储,详情请查看下文案例指导算法输出:用于Pytorch推理的pth模型,GPU推理速度:10.1s/pic2.2代码结构src|- pre-trained_weights |- checkpoints #主干网络预训练文件夹|- trained_model |- model |- config.json |- customize_service.py |- best_model.pth|- start_alg_ctrl.py # 训练和预测启动文件|- configs # mmdetection模型配置文件 |- ... |- gfl |- ... # GFocal模型配置文件|- ... #mmdetection其他配置文件###2.3训练参数说明|参数 |类型 |是否可调整|默认值|是否必须|说明|| ------------ | ------------ | ------------ | ------------ |------------ ||train_epoch|Integer|true|1|true|数据集迭代次数||GPU_num|Integer|true|1|true|训练使用的GPU数量||samples_per_gpu|Integer|true|2|true|每个GPU承担的任务数,batchsize为其和GPU数的乘积||load_weight|String|true|trained_model/best_model.pth|true|load_weight参数有以下两种取值:(1)固定的默认路径,默认加载本算法源码目录中的trained_model/model/best_model.pth继续训练,加载成功会打印日志;(2)可变的OBS路径,用户可指定OBS上的一个模型文件路径,然后本算法会加载该模型继续训练,加载成功会打印日志。|eval|String|true|False|true|eval参数有以下两种取值:(1)False,本算法执行模型训练过程;(2)True,本算法加载load_weight参数指定的模型,然后执行模型评估过程。模型评估需要支持以下三种输入情况:2a) 创建训练作业时指定的数据存储位置data_url目录下,如果同时有图片和ground_truth,则模型评估过程输出pred_results目录和eval_result.txt文件,前者存放所有图片的预测结果,后者存放模型评估的精度指标;2b) 创建训练作业时指定的数据存储位置data_url目录下,如果只有图片,则模型评估过程输出pred_results目录,存放所有图片的预测结果;2c) 创建训练作业时指定的数据存储位置data_url目录下,如果没有图片,则模型评估过程报错;||warmup_ratio|String|true|0.001|true|初始学习率||lr|String|true|0.01|true|最终学习率|注意:如果eval为true,train_input中可以不需要train2017.zip和val2017.zip如果eval为false,train_input中可以不需要test2017.zip###2.4训练输出文件|- model |- customize_service.py |- config.json |- latest.pth # 训练所得模型 |- GFocal # mmdetection 和 GFocal配置文件3.GPU推理“元模型来源”从训练中选择,和从输出的OBS中选择均可。训练输出文件夹可直接用于导入模型部署各种服务###4.案例指导本算法的详细使用方法,请查看《ModelArts AI Gallery算法GFocal使用指导》交付交付方式华为云ModelArts交付区域华北-北京一、华北-北京四、华东-上海一、华南-广州、亚太-**
  • [技术干货] PyTorch--使用MindXDL提供的securityservice组件进行模型保护的AI框架示例
    原理:        PyTorch可以直接保存模型至BytesIO对象里,这是一个内存文件,因此可以对其进行加密后再保存到磁盘上,解密也是同样的原理,先将模型解密至内存文件中,再通过torch.load 加载模型# standard libraryimport osfrom io import BytesIO# third-party libraryimport torchimport torch.nn as nnimport torch.utils.data as Dataimport torchvision# 导入security的apifrom security.api.symmetric import encrypt_stream, decrypt_stream# Hyper ParametersEPOCH = 1 # train the training data n times, to save time, we just train 1 epochBATCH_SIZE = 50LR = 0.001 # learning rateDOWNLOAD_MNIST = Falsedata_file = "mnist.tar.gz"if os.path.exists(data_file): os.system('tar xf %s -C /tmp/' % data_file)# Mnist digits datasetif not(os.path.exists('/tmp/mnist/')) or not os.listdir('/tmp/mnist/'): # not mnist dir or mnist is empyt dir DOWNLOAD_MNIST = Truetrain_data = torchvision.datasets.MNIST( root='/tmp/mnist/', train=True, # this is training data transform=torchvision.transforms.ToTensor(), # Converts a PIL.Image or numpy.ndarray to # torch.FloatTensor of shape (C x H x W) and normalize in the range [0.0, 1.0] download=DOWNLOAD_MNIST,)# plot one exampleprint(train_data.train_data.size()) # (60000, 28, 28)print(train_data.train_labels.size()) # (60000)# Data Loader for easy mini-batch return in training, the image batch shape will be (50, 1, 28, 28)train_loader = Data.DataLoader(dataset=train_data, batch_size=BATCH_SIZE, shuffle=True)# pick 2000 samples to speed up testingtest_data = torchvision.datasets.MNIST(root='/tmp/mnist/', train=False)test_x = torch.unsqueeze(test_data.test_data, dim=1).type(torch.FloatTensor)[:2000]/255. # shape from (2000, 28, 28) to (2000, 1, 28, 28), value in range(0,1)test_y = test_data.test_labels[:2000]class CNN(nn.Module): def __init__(self): super(CNN, self).__init__() self.conv1 = nn.Sequential( # input shape (1, 28, 28) nn.Conv2d( in_channels=1, # input height out_channels=16, # n_filters kernel_size=5, # filter size stride=1, # filter movement/step padding=2, # if want same width and length of this image after Conv2d, padding=(kernel_size-1)/2 if stride=1 ), # output shape (16, 28, 28) nn.ReLU(), # activation nn.MaxPool2d(kernel_size=2), # choose max value in 2x2 area, output shape (16, 14, 14) ) self.conv2 = nn.Sequential( # input shape (16, 14, 14) nn.Conv2d(16, 32, 5, 1, 2), # output shape (32, 14, 14) nn.ReLU(), # activation nn.MaxPool2d(2), # output shape (32, 7, 7) ) self.out = nn.Linear(32 * 7 * 7, 10) # fully connected layer, output 10 classes def forward(self, x): x = self.conv1(x) x = self.conv2(x) x = x.view(x.size(0), -1) # flatten the output of conv2 to (batch_size, 32 * 7 * 7) output = self.out(x) return output, x # return x for visualizationcnn = CNN()print(cnn) # net architectureoptimizer = torch.optim.Adam(cnn.parameters(), lr=LR) # optimize all cnn parametersloss_func = nn.CrossEntropyLoss() # the target label is not one-hotted# training and testingfor epoch in range(EPOCH): for step, (b_x, b_y) in enumerate(train_loader): # gives batch data, normalize x when iterate train_loader output = cnn(b_x)[0] # cnn output loss = loss_func(output, b_y) # cross entropy loss optimizer.zero_grad() # clear gradients for this training step loss.backward() # backpropagation, compute gradients optimizer.step() # apply gradients if step % 50 == 0: test_output, last_layer = cnn(test_x) pred_y = torch.max(test_output, 1)[1].data.numpy() accuracy = float((pred_y == test_y.data.numpy()).astype(int).sum()) / float(test_y.size(0)) print('Epoch: ', epoch, '| train loss: %.4f' % loss.data.numpy(), '| test accuracy: %.2f' % accuracy)# 加密保存f_io = BytesIO()torch.save(cnn, f_io)key = 'ac4fefbfd97f85447eded75185e5c81438352465' # you can also use dew to get plain key and cipher keywith open("encrypt_model.h5", 'wb') as f: for data in encrypt_stream(key, f_io): f.write(data)# 解密推理model_file = "encrypt_model.h5"f_obj = BytesIO()for i in decrypt_stream(key, model_file): f_obj.write(i)f_obj.seek(0)new_cnn = torch.load(f_obj)test_output, _ = new_cnn(test_x[:10])pred_y = torch.max(test_output, 1)[1].data.numpy()print(pred_y, 'prediction number')print(test_y[:10].numpy(), 'real number')参考代码链接https://gitee.com/shufanasia/examples
  • [其他] 解决Pytorch Mox日志反复输出
    ModelArts训练作业算法来源选用常用框架的Pytorch引擎,在训练作业运行时Pytorch Mox日志会每个epoch都打印Mox版本,具体日志如下:INFO:root:Using MoXing-v1.13.0-de803ac9INFO:root:Using OBS-Python-SDK-3.1.2INFO:root:Using MoXing-v1.13.0-de803ac9INFO:root:Using OBS-Python-SDK-3.1.2原因分析Pytorch通过spawn模式创建了多个进程,每个进程会调用多进程方式使用Mox下载数据。此时子进程会不断销毁重建,Mox也就会不断的被导入,导致打印很多Mox的版本信息。处理方法为避免训练作业Pytorch Mox日志反复输出的问题,需要您在“启动文件”中添加如下代码,当“MOX_SILENT_MODE = “1””时,可在日志中屏蔽mox的版本信息:import osos.environ["MOX_SILENT_MODE"] = "1"
  • [API使用] pytorch代码迁移时,API的替换问题
    ## 问题pytorch在训练时采用ptimizer.zero_grad(),loss.backward(),optimizer.step()这三步流程。我发现mindspore在这里的设计跟pytorch不一样。想问一下有没有尽可能改动少的一点的修改方案?
  • [问题求助] Pytorch分布式训练|Modelart
    请问用pytorch训练时,我单卡可以跑通,但是8卡时就会报错找不到参数--init-method,并且我的初始化分布式代码也会直接打印Not using distributed mode,这是我配置的问题吗?请问pytorch如何在modelart中启用分布式训练
  • [问题求助] 基于atlas300T卡的pytorch yolov4训练问题
    【功能模块】用的工程是:modelzoo-master/modelzoo-master/built-in/PyTorch/Official/cv/image_object_detection/YOLOV4_ID0396_for_PyTorch安装的是1、训练接口匹配了coco接口2、网络结构中也修改cfgtorch 是1.8.1+ascend 【操作步骤&问题现象】pytorch 版本的yolov4 在atlas300T上跑不起来【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [问题求助] 【Atlas300T】【昇腾PyTorch】编译安装完后import torch报错
    【参考网址】https://gitee.com/ascend/pytorch/blob/2.0.3.tr5/docs/zh/PyTorch%E5%AE%89%E8%A3%85%E6%8C%87%E5%8D%97/PyTorch%E5%AE%89%E8%A3%85%E6%8C%87%E5%8D%97.md【操作步骤&问题现象】1、按照参考网址给的方法安装成功了2、配置完环境变量尝试import torch,报错,提示Failed to load PyTorch C extensions【截图信息】
  • [其他] PyTorch基本操作--AutoGrad
    该autograd包提供自动求导为上张量的所有操作。它是一个按运行定义的框架,这意味着您的反向传播是由您的代码运行方式定义的,并且每次迭代都可以不同。torch.autograd.function (函数的反向传播)torch.autograd.functional (计算图的反向传播)torch.autograd.gradcheck (数值梯度检查)torch.autograd.anomaly_mode (在自动求导时检测错误产生路径)torch.autograd.grad_mode (设置是否需要梯度)model.eval() 与 torch.no_grad()torch.autograd.profiler (提供 function 级别的统计信息)「下面使用 Autograd 进行反向传播。」如果requires_grad=True,则 Tensor 对象会跟踪它是如何创建的。x = torch.tensor([1., 2., 3.], requires_grad = True)print('x: ', x)y = torch.tensor([10., 20., 30.], requires_grad = True)print('y: ', y)z = x + y print('\nz = x + y')print('z:', z)x: tensor([1., 2., 3.], requires_grad=True)y: tensor([10., 20., 30.], requires_grad=True)z = x + yz: tensor([11., 22., 33.], grad_fn=<AddBackward0>)因为requires_grad=True,z知道它是通过增加两个张量的产生z = x + y。s = z.sum()print(s)tensor(66., grad_fn=<SumBackward0>)s是由它的数字总和创建的。当我们调用.backward(),反向传播从s开始运行。然后可以计算梯度。s.backward()print('x.grad: ', x.grad)print('y.grad: ', y.grad)x.grad: tensor([1., 1., 1.])y.grad: tensor([1., 1., 1.])下面例子是计算log(x)的导数为1 / ximport torchx = torch.tensor([0.5, 0.75], requires_grad=True)# 1 / x y = torch.log(x[0] * x[1])y.backward()x.grad # tensor([2.0000, 1.3333])
  • [其他] PyTorch基本操作
    什么是 PyTorch?PyTorch是一个基于Python的科学计算包,提供最大灵活性和速度的深度学习研究平台。张量张量类似于NumPy 的n 维数组,此外张量也可以在 GPU 上使用以加速计算。让我们构造一个简单的张量并检查输出。首先让我们看看我们如何构建一个 5×3 的未初始化矩阵:import torchx = torch.empty(5, 3)print(x)输出如下:tensor([[2.7298e+32, 4.5650e-41, 2.7298e+32], [4.5650e-41, 0.0000e+00, 0.0000e+00], [0.0000e+00, 0.0000e+00, 0.0000e+00], [0.0000e+00, 0.0000e+00, 0.0000e+00], [0.0000e+00, 0.0000e+00, 0.0000e+00]])现在让我们构造一个随机初始化的矩阵:x = torch.rand(5, 3)print(x)输出:tensor([[1.1608e-01, 9.8966e-01, 1.2705e-01], [2.8599e-01, 5.4429e-01, 3.7764e-01], [5.8646e-01, 1.0449e-02, 4.2655e-01], [2.2087e-01, 6.6702e-01, 5.1910e-01], [1.8414e-01, 2.0611e-01, 9.4652e-04]])直接从数据构造张量:x = torch.tensor([5.5, 3])print(x)输出:tensor([5.5000, 3.0000])创建一个统一的长张量。x = torch.LongTensor(3, 4)xtensor([[94006673833344, 210453397554, 206158430253, 193273528374], [ 214748364849, 210453397588, 249108103216, 223338299441], [ 210453397562, 197568495665, 206158430257, 240518168626]])「浮动张量。」x = torch.FloatTensor(3, 4)xtensor([[-3.1152e-18, 3.0670e-41, 3.5032e-44, 0.0000e+00], [ nan, 3.0670e-41, 1.7753e+28, 1.0795e+27], [ 1.0899e+27, 2.6223e+20, 1.7465e+19, 1.8888e+31]])「在范围内创建张量」torch.arange(10, dtype=torch.float)tensor([0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])「重塑张量」x = torch.arange(10, dtype=torch.float) xtensor([0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])使用 .view重塑张量。x.view(2, 5)tensor([[0., 1., 2., 3., 4.], [5., 6., 7., 8., 9.]])-1根据张量的大小自动识别维度。x.view(5, -1)tensor([[0., 1.], [2., 3.], [4., 5.], [6., 7.], [8., 9.]])「改变张量轴」改变张量轴:两种方法view和permuteview改变张量的顺序,而permute只改变轴。x1 = torch.tensor([[1., 2., 3.], [4., 5., 6.]])print("x1: \n", x1)print("\nx1.shape: \n", x1.shape)print("\nx1.view(3, -1): \n", x1.view(3 , -1))print("\nx1.permute(1, 0): \n", x1.permute(1, 0))x1: tensor([[1., 2., 3.], [4., 5., 6.]])x1.shape: torch.Size([2, 3])x1.view(3, -1): tensor([[1., 2.], [3., 4.], [5., 6.]])x1.permute(1, 0): tensor([[1., 4.], [2., 5.], [3., 6.]])张量运算在下面的示例中,我们将查看加法操作:y = torch.rand(5, 3)print(x + y)输出:tensor([[0.5429, 1.7372, 1.0293], [0.5418, 0.6088, 1.0718], [1.3894, 0.5148, 1.2892], [0.9626, 0.7522, 0.9633], [0.7547, 0.9931, 0.2709]])调整大小:如果你想调整张量的形状,你可以使用“torch.view”:x = torch.randn(4, 4)y = x.view(16)# 大小-1是从其他维度推断出来的z = x.view(-1, 8) print(x.size(), y.size(), z.size())输出:torch.Size([4, 4]) torch.Size([16]) torch.Size([2, 8])
  • [其他] PyTorch 和 NumPy的转换
    NumPy 是Python 编程语言的库,增加了对大型、多维数组和矩阵的支持,以及对这些数组进行操作的大量高级数学函数集合。将Torch中Tensor 转换为 NumPy 数组,反之亦然是轻而易举的!Torch Tensor 和 NumPy 数组将共享它们的底层内存位置 ,改变一个将改变另一个。「将 Torch 张量转换为 NumPy 数组:」a = torch.ones(5)print(a)输出:tensor([1., 1., 1., 1., 1.])b = a.numpy()print(b)输出:[1., 1., 1., 1., 1.]让我们执行求和运算并检查值的变化:a.add_(1)print(a)print(b)输出:tensor([2., 2., 2., 2., 2.])[2. 2. 2. 2. 2.]「将 NumPy 数组转换为 Torch 张量:」import numpy as noa = np.ones(5)b = torch.from_numpy(a)np.add(a, 1, out=a)print(a)print(b)输出:[2. 2. 2. 2. 2.]tensor([2., 2., 2., 2., 2.], dtype=torch.float64)
  • [训练管理] 有能在modelarts上跑的迁移到910上的pytorch训练样例吗,要有开源代码的
    有能在modelarts上跑的迁移到910上的pytorch训练样例吗,要有开源代码的,最好数据集不大的,请提供链接,谢谢
总条数:271 到第
上滑加载中