
C++
文章平均质量分 83
王飞95
毕业于中国科学技术大学,拥有20多年的开发经验。精通C++和各类多媒体架构和技术,熟悉多个领域技术规范和行业标准,尤其是多媒体领域;技术储备和知识面全面;擅长架构设计、应用性能优化和、跨平台移植以及各类难题调试和解决;领导和成功发布了数十项产品和项目,包括XBox One蓝光播放器等。在业界一直是可信赖的合作者和领导者。
展开
-
libtorch学习笔记(13)- 学习率参数调整
关于学习率学习率是机器学习中一个重要参数,对loss的收敛速度和准确性有重要的影响,在深度学习中它一般需要动态调整,在TensorFlow中有很多种学习调整的算法,在libtorch中还没有发现,好在算法不是很复杂,这里就做一些学习笔记,并用C/C++进行实现,同时也应用到ResNet的具体实现中。学习率参数在说明这些参数之前,先讲一下step的概念, 这里step就是optimizer调用一次step,或者训练完一次batch,它就增加1,相当于调整一次网络参数(权重和偏置量)。参数说明原创 2020-08-31 21:52:40 · 1395 阅读 · 0 评论 -
libtorch学习笔记(12)- 权重和偏置量的初始化
权重和偏置量在libtorch中各个神经网络模块中都有实现,比如conv2d1Conv2dImpl::Conv2dImpl( Conv2dOptions options_) : ConvNdImpl( detail::ConvNdOptions<2>( /*in_channels=*/options_.in_channels(), /*out_channels=*/options_.out_channels(),原创 2020-08-26 17:48:19 · 2298 阅读 · 0 评论 -
libtorch学习笔记(11)- 保存和加载训练结果
保存和加载训练结果libtorch/pytorch提供了很好的serialize操作,可以很容把训练结果保存起来,最初我认为训练结果包括网络拓补结构,权重和偏置量等,后来发现应该只包含权重和偏置量,这样一来就需要在这个文档中存储一些扩展值,用于下一次重构网络。保存网络权重和偏置量torch::nn:Module提供了一个方法save方法,我们构建的网络又是集成这个类,所以可以调用此方法存储网络权重和偏置量。torch::serialize::OutputArchive archive;save(a原创 2020-08-18 16:34:22 · 2941 阅读 · 2 评论 -
libtorch学习笔记(10)- 一些具体问题的解决
神经网络中碰到的问题目前主要用CPU用来进行神经网络训练,验证和测试,在以前的用LeNet来基于MNIST图像集进行训练、验证和测试,速度还行,准确率也很高,但是通过VGG的学习,发现机器有点吃不消了,一轮训练都是几个小时,所以出了一个小问题,可能几个小时就白测试了,训练出准确的网络对我来说太重要了。这是这段时间碰到的一些问题:Loss rate马上变成0原因:训练的数据无差异,无法训练刚开始一上来就碰到这个问题,后来经过排查,发现自己写的将图片转化为张量的实现有问题,导致所有的图片张量都被同一原创 2020-08-16 23:05:23 · 1460 阅读 · 2 评论 -
libtorch学习笔记(9)- 自己实现神经网络加载器
神经网络记载器(Neutral Network Loader)背景通过前面的学习熟悉了两种经典的前置神经网络,LeNet和VGG,在具体实现过程中,有不少重复代码,随着更多神经网络的引入,以及各种神经网络变种,发现代码非常难以维护,而且可读性不是很高,比如VGG网络:NetBatchNormNon-BatchNormA11A-LRN11B11C11D11E11总共有12中组合,如果按照之前的写法:VGGNet::VGG原创 2020-08-16 10:23:05 · 764 阅读 · 0 评论 -
libtorch学习笔记(8)- 自己实现图片到张量
自己实现的意义本系列笔记主要用C/C++来实现神经网络模型,所以用原生的C/C++自己动手实现图片到张量的转换,更助于了解张量的含义和用途,以及其如何组织。为了便于理解输出结果,制作了一张Red, Green和Blue的图片(10x10):Pytorch来实现假设图片放在I:\import torchimport torchvision.transforms as transformsfrom PIL import Imageimport matplotlib.pyplot as plt原创 2020-08-11 18:17:00 · 2133 阅读 · 1 评论 -
libtorch学习笔记(7)- VGG网络训练和测试
VGG网络训练和测试简单介绍VGG是卷积网络里面比较常见的网络模型,相比LeNet要复杂一些,但是还是前置反馈网络,详细学习可以参考论文VERY DEEP CONVOLUTIONAL NETWORKS FOR LARGE-SCALE IMAGE RECOGNITION,VGG网络能够提取更多的图像特征,最后输出的特诊向量信息量更丰富,所以可以进行更大规模的分类,前面介绍的LeNet5可以产生10个分类,分别对应0~9, VGG可以产生上万个分类,识别更多的类型。VGG也是Faster RCNN的基础,F原创 2020-08-10 20:44:09 · 2806 阅读 · 1 评论 -
libtorch学习笔记(6)- 识别各类简单图片中的数字
MNIST测试数据和现实当中的手写识别差别还是挺大的,一般现实中都是要识别一个图片或者一个图形对象,甚至更复杂从复杂的图形中识别其中的数字,所以本文将写一个在现实中可以真实使用的C++例子来介绍如何使用训练好的网络识别图片中的数字。原创 2020-08-02 01:06:43 · 1043 阅读 · 6 评论 -
libtorch学习笔记(5)- MNIST实战
MNIST libtorch实战练习准备工作首先下载MNIST database,http://yann.lecun.com/exdb/mnist/下载后千万不要用winrar之类的软件解压,比如t10k-images-idx3-ubyte被解压成t10k-images.idx3-ubyte,最好到Linux环境下用tar解压。假设解压到I:\MNIST。训练并保存结果定义网络跟前面差不多,但是需要定义padding,毕竟MNIST训练和测试图像都是28x28,但是LeNet-5期望输入的图像原创 2020-08-01 15:05:27 · 1934 阅读 · 2 评论 -
libtorch学习笔记(4)- 构建一个简单的神经网路
一个简单的前馈神经网络(feed-forward network)先看一张图这个神经网络有两个卷积层(C1, C2), C1后面跟着一个池化层,C2后面跟着另外一个池化层,C2后面的池化层后面跟着两个全连接层和输出层1。Python方式描述网络import torchimport torch.nn as nnimport torch.nn.functional as Fclass Net(nn.Module): def __init__(self): super原创 2020-07-26 12:35:50 · 2130 阅读 · 0 评论 -
libtorch学习笔记(3)- 一些基本概念
几个基本概念标量 (scaler)看名称scaler就知道它是一个数字,在libtorch中可以把标量视为零阶张量,可以如此声明// 标量auto scaler = torch::tensor(1.0f);std::cout << "scaler sizes() length: " << scaler.sizes().size() << "\n" << scaler << std::endl;输出结果:向量 (vector)向量原创 2020-07-20 00:36:51 · 1377 阅读 · 1 评论 -
libtorch学习笔记(2)- 自动求导
问题对于如下函数,在指定的输入上求导,比如:输入[2, 4, 10]f(x)=3x2+x+4f(x) = 3x^2 + x + 4f(x)=3x2+x+4实现首先,创建一个可追踪张量,初始化值为[2.0, 4.0, 10.0],各元素是浮点数,不能写成[2, 4,10],否则无法进行追踪和求导。 auto x = torch::tensor({ 2.0, 4.0, 10.0 }, torch::requires_grad()); std::cout << x <<原创 2020-07-19 21:36:39 · 789 阅读 · 0 评论 -
libtorch学习笔记(1)- 开发环境搭建
安装我是使用VS2017,首先下载libtorch安装包,我选在了debug版本的用于学习:https://pytorch.org/get-started/locally/解压到某一目录,比如:I:\pytorch\1.5.1\debug配置VS2017创建一个VS2017 console project, 选择Debug|x64,然后配置include, libpath和link libraries:比如:c10.lib;torch.lib;caffe2_module_test_dynam原创 2020-07-19 20:37:36 · 1777 阅读 · 2 评论 -
一个继承类实例内存释放的问题
#include <stdint.h>#include <vector>class A{};class B: public A{ uint16_t entry_count; std::vector<uint32_t> entries;};int main(){ A* b = new B(); delete ...原创 2018-02-12 23:25:06 · 336 阅读 · 0 评论 -
一种通用的C++类或者结构成员变量的初始化方法
C++11提供了新的特性,可以初始化一些类或者结构成员变量,尤其某类实例化的变量的初始化,下面介绍一种在C++98中也可以初始化类成员变量的通用方法原创 2017-06-18 15:58:05 · 517 阅读 · 0 评论