
深度学习
头发光了你就强了
Neural Network and Machine Learning
展开
-
上古激活函数之local response normalizatiion
最近因为工作原因,需要写lrn的gpu shader实现,公式如下:个人觉得lrn只适用于分类网络,且作用不大。其一,网络在初始训练时,权重都是随机值,产生的特征没有表征意义,对没有表征意义的特征进行抑制或者放大,不合理,除非把公式里的几个超参改进成可训练的,随着网络的训练施加影响。其二,对于非分类网络,例如图像生成,相邻通道值是不需要放大差距的,例如网络的最后进程,一般一个通道只表示一个或很少的特征,例如背景,值都是相近的...原创 2020-08-26 10:32:34 · 319 阅读 · 0 评论 -
深度学习之dropout计算细节
dropout得原理和作用就不必说了,dropout是以给定得概率随机选取输出值置0,但在置0后对与未置0的值,还会乘以1(1-dropout_rate),为什么要这样,拿最简单的例子来说,假如输出一个概率向量,要保持概率和始终为1....原创 2020-08-21 14:52:11 · 990 阅读 · 1 评论 -
tensorflow batch normalization use example
import sys, osos.environ["CUDA_VISIBLE_DEVICES"] = "0"import tensorflow as tfimport tensorflow.examples.tutorials.mnist.input_data as input_datamnist = input_data.read_data_sets("./MNIST_data/",one_hot=True)import numpy as npfrom PIL import Imageho原创 2020-08-13 11:48:26 · 146 阅读 · 0 评论 -
deep learning之batch normalization详解
建议直接看paper:paper地址batch normalization已经是一门很老的技术了,2015年就出了paper,相信大家都耳熟能详,已经是网络的必备结构,但其中的一些细节,恐怕容易疏忽。公式:x为bn层的输入数据,此公式的作用是把输入数据的分布的期望和方差变为0和1。bn的模式有两种,一种是通用模式:per activation,另一种只适合卷积:spatial。对于per activation:求期望,假设数据格式为NCHW,大小为data[10][10][10][10], 产原创 2020-08-12 16:28:02 · 230 阅读 · 0 评论 -
cudnn之Partially-packed Tensors
cudnn 的 nd tensor的内存排列形式有 Fully-packed Tensors、Partially-packed Tensors、Spatially Packed Tensors、Overlapping Tensors这4种,本文讲Partially-packed Tensors。Partially-packed Tensors就是地址长度大于值的个数,举个例子,一个float32数组a[3][2][2],stride为[5,2,1],那么此数组在device上占用的内存应为sizeof(f原创 2020-07-14 14:07:01 · 325 阅读 · 0 评论 -
deep learning激活函数实现之cudnn
代码不方便上传,只能传图片。注意:cudnn对于输入的维度限制为4~8,少于4维的数据可以把多余的维度的shape设置为1,多余8维的数据则无能为力了。cudnn对于输入数据的size限制为最多20亿,也就是说输入数组的元素的个数最多为20亿。先看kernel头文件:kernel cpp文件:run:...原创 2020-07-07 17:34:18 · 332 阅读 · 0 评论 -
卷积实现之cudnn
由于工作原因,我需要用cudnn实现卷积。代码在内网,只好上传代码图片。工程主文件:工程辅助文件:辅助文件用于造test case,不是必须文件。cmake 文件:卷积核头文件:卷积核cpp文件:用卷积核构造卷积:...原创 2020-07-02 10:23:42 · 840 阅读 · 0 评论 -
cudnn不同卷积实现速度和空间比拼
卷积逻辑上只有一种理解,但硬件实现为了加速和节约空间有各种不同的实现。cudnn上有8种实现,我用的cudnn7,CUDNN_CONVOLUTION_FWD_ALGO_DIRECT在cudnn上没有实现。在输入为[1,200,200,3],卷积核为[3,3,3,3],stride为1,pad为1时,各个运算时间,gpu显存消耗,workspace size 为0.000003S233M0M0.0000026S233M0.228M0.0000036S233M4.119原创 2020-06-28 10:56:15 · 1462 阅读 · 4 评论 -
空洞卷积的感受视野计算
一个3x3卷积核,dialation为1时感受视野为3x3,当dialation为2时,感受视野为多少?网上大多数说的是7x7,就是在卷积核内部插0值,在外围也包了一圈0,本人用tensorflow和cudnn验证了一下,当input tensor 为[1,10,10,3],卷积核为3x3x3x3(o,i,h,w),stride为1,dialation为2,pad为1时,输出tensor为[1,8,8,3],可见感受视野为5x5,并非7x7,空洞卷积只是在卷积核内部插0值,并没有在卷积核外围填0值,况且在外原创 2020-06-23 11:26:24 · 688 阅读 · 0 评论 -
NVIDIA数值不稳定
调用cudnn库写卷积运算,同样的输入 、卷积核、操作,总能观测到输出的微小偏差。实验在RTX2080TI上进行输入:shape为:[1,3,10,10]卷积核:shape为[3,3,3,3]第一次输出为:第二次输出为:可以看到第一行第三列数据有微小差异。因为是并行运算,同样的代码,在硬件上的运行流程每次几乎都不一样,所以数值会有微小差异,对于深度学习大多数应用场景,这点差异可以忽略,但对于高精度计算的场景,特斯拉才能满足。...原创 2020-06-18 10:51:01 · 283 阅读 · 0 评论 -
batch normalization
Batch Normalization作为最近一年来DL的重要成果,已经广泛被证明其有效性和重要性。虽然有些细节处理还解释不清其理论原因,但是实践证明好用才是真的好,别忘了DL从Hinton对深层网络做Pre-Train开始就是一个经验领先于理论分析的偏经验的一门学问。本文是对论文《Batch Normalization: Accelerating Deep Network Training by...转载 2019-01-22 16:27:58 · 136 阅读 · 0 评论 -
argmax函数轴取值
在深度学习中,argmax函数很常见,标签采用ont-hot,输出层用softmax激活可以加快网络训练速度和提升准确率,而在取值时,用argmax函数取值,涉及轴问题,数据在哪个轴,axis就填哪个轴,通常数据都在最后一个轴,下面举例说明。一维情形:代码:import tensorflow as tfimport numpy as npnp_arry = (np.random.nor...原创 2019-01-27 17:00:10 · 884 阅读 · 0 评论 -
Python代码雨版本2
import randomimport pygamePANEL_width = 1600PANEL_highly = 800FONT_PX = 15pygame.init()# 创建一个可是窗口winSur = pygame.display.set_mode((PANEL_width, PANEL_highly))font = pygame.font.SysFont("1...转载 2019-01-21 12:44:55 · 4869 阅读 · 0 评论 -
python黑客帝国代码雨特效
效果:代码:try:import pygameimport sysfrom pygame.locals import *from random import randintexcept:print(“Load modules error!!”)exit()define some datasSCREEN_WIDTH = 1366SCREEN_HEIGHT = 768LOW...转载 2019-01-21 12:33:45 · 9378 阅读 · 0 评论 -
pytorch之Variable对象
Variable类封装了Tensor类,并且添加了一些方法Variable类也重载了算术运算符,±*/,但未重载“+=”和“=”运算符,且不支持在原对象内存区域做修改原创 2019-01-19 20:36:53 · 426 阅读 · 0 评论 -
pytorch之Variable对象之梯度推导
由简入繁看代码:import torchfrom torch.autograd import Variablea = Variable(torch.ones(4),requires_grad=True)b=a+2c=b.mean()print©c.backward()print(a.grad)输出:tensor(3., grad_fn=)tensor([0.2500, 0....原创 2019-01-19 21:31:27 · 648 阅读 · 0 评论 -
pytorch之Tensor与Variable的区别
首先在变量的操作上:Tensor对象支持在原对象内存区域上修改数据,通过“+=”或者torch.add()方法而Variable不支持在原对象内存区域上修改数据Variable对象可求梯度,并且对Variable对象的操作,操作会被记录...原创 2019-01-19 21:45:01 · 7023 阅读 · 0 评论 -
pytorch全连接模型实现离散点回归拟合
神经网络可作为一个函数,例如x为训练样本矩阵,f为神经网络,则f(x)会得到一个输出,输出表示啥取决于训练目的和训练过程。本文章讲解以拟合为设计目的的全连接神经网络模型,神经网络即可进行线性回归,也可进行非线性回归,并且是还是分段拟合,线性与非线性取决于激活函数!先来简单的一元二次函数:看代码:x = torch.unsqueeze(torch.linspace(-1,1,100),dim...原创 2019-01-20 16:18:06 · 2892 阅读 · 0 评论 -
pytorch标签转onehot形式
代码:import torchclass_num = 10batch_size = 4label = torch.LongTensor(batch_size, 1).random_() % class_numprint(label.size())one_hot = torch.zeros(batch_size, class_num).scatter_(1, label, 1)prin...原创 2019-01-20 18:49:47 · 12674 阅读 · 0 评论 -
pytorch轴
代码:import torchclass_num = 10batch_size = 4label = torch.Tensor(2,3,4,5).random_() % class_numprint(label.size())label=label.permute(1,0,2,3)print(label.size())输出:torch.Size([2, 3, 4, 5])tor...原创 2019-01-20 19:21:13 · 267 阅读 · 0 评论 -
PIL读取图片的形状及变形
代码:from PIL import Imageimg = Image.open(“图片路径”).convert(‘RGB’)此时图片的形状是hwc,一般来说,训练网络要的形状是whc,这里可以用numpy变形代码如下img=np.array(img)img=img.transpose((1,0,2)) #hwc–>whc...原创 2019-01-28 14:10:26 · 5751 阅读 · 1 评论 -
tensorlfow手动插入fake quant node之op的多个输入区间差别过大
如图:对于add这个op,左边的输入范围为[-50,50],且左边为网络中间特征tensor,右边为掩码,范围为[0,10000],则add以后的输出为【0,10050】,如果在add以后插入量化节点,则中间特征tensor的精度损失殆尽!...原创 2019-07-31 19:37:39 · 823 阅读 · 1 评论 -
tensorflow之tensorboard op name与本地graph name之坑
带括号的,在本地graph的名称实际上是"bert/encoder/layer_0/attention/self/Reshape"原创 2019-07-31 14:30:36 · 374 阅读 · 0 评论 -
tensorflow优化器对graph的操作
在训练时,opt会进行两步操作,第一步建立反向传播图,第二步执行,traininig graph和reference graph是不一样的,但权重是一样的原创 2019-07-05 12:01:54 · 323 阅读 · 0 评论 -
tensorflow restore .ckpt原理分析
在进行saver.restore(sess, ckpt_filename)前需要建立一个graph,而graph包括opration和tensor,placeholder,这种方式只是reload权重,网络结构不一样可也reload权重,只要权重名字一样就行...原创 2019-07-05 11:59:06 · 636 阅读 · 0 评论 -
深度学习卷积的本质
要搞懂卷积的本质,得从以下几个方面理解。卷积的数学意义:卷积为相乘再求和,其实质为积分运算的离散实现,卷积核为大小为积分区间。函数的表现形式:函数可以为表达式,例如:y=a*x+b,也可以为表格,深度学习中,卷积核为积分函数,输入为积分变量。对图像或者特征图进行卷积的意义:先说输入通道为1输出通道都为n的情况,就是拿n个函数(长宽为a,b的卷积核),对输入的两个维度(x轴和y轴)的每一点(...原创 2019-07-03 11:16:33 · 1741 阅读 · 0 评论 -
pytorch指定权重初始化方式
如果网络权重不初始化,pytorch有一套默认初始化机制,本人没有研究具体怎么初始化的,和tensorflow标准正态分布初始化效果一样,下面是指定初始化代码:conv = nn.Conv2d(*args, **kwargs)conv.weight.data.normal_() #w以标准正态分布初始化conv.bias.data.zero_() #偏置以0初始化...原创 2019-05-06 15:37:25 · 3485 阅读 · 0 评论 -
centerloss之中心点计算
以minist为例:中心点有2种计算方式:方式1:人算:批次取400,平均每批次每个数字有400/10=40个点,如果取40个点的中心为每批次训练的中心,数据太少,误差大, 所以先定义一个队列,队列长度为400*20,前20个周期不训练中心损失,只训练分类损失,把每批次网络计算的点(形状为【400,2】)装进队列,从第20个周期开始,计算队列里对应数字的中心,然后以此中心计算中心损失...原创 2019-04-11 16:15:28 · 1279 阅读 · 0 评论 -
python之glob模块
深度学习的数据集往往是一个文件下下面包含很多图片,用glob模块可以很方便的制作dataset,下面简单介绍:glob.glob()函数接受通配模式作为输入,并返回所有匹配的文件名的路径字符串列表,与os.listdir类似。文件夹路径为:‘data/samples’,里面放了很多图片看代码:import globa=glob.glob('%s/*.*' % r'data/sample...原创 2019-03-26 15:28:55 · 422 阅读 · 0 评论 -
numpy切片与索引的区别与组合使用
数组索引能办到的,切片都能办到,只不过索引会降维,而切片不回改变维度,代码:纯切片:import numpy as npboxes = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,10]])a = boxes[:,2:3]print(boxes.shape)print(a)结果:(3, 4)[[ 3][ 7][11]]切片家索引:...原创 2019-02-26 19:19:14 · 1234 阅读 · 1 评论 -
numpy之where()
where()函数接收bool数组,返回满足条件的索引,不过要特别注意返回值的形式看代码:import numpy as npb=np.array([[[5,5],[2,2],[3,3],[5,5],[1,1]],[[5,5],[2,2],[3,3],[5,5],[1,1]]])print(b.shape)all =np.where(b > 3)dim1,dim2,dim3...原创 2019-03-01 16:50:25 · 438 阅读 · 0 评论 -
特征方程的基础理解
1,对于mXnA方程组,也就是m个方程,n个未知数,如果方程组不相容(方程组有相互矛盾的方程),则无解,解集为空;若相容,则要么有且仅有一个解,要么有无穷多个解。从几何角度理解:1.1对于二元方程组,方程组的解集取决于各个方程的几何直线的关系,相交有且仅有一个解,平行无解,重合有无数多个解1.2对于3元方程组,方程组的解集取决于各个方程组的几何平面的关系1.3对于超过3元的方程组,方程组的...原创 2018-12-05 16:06:25 · 16873 阅读 · 0 评论 -
tensorflow之默认对象集合
使用tensorflow.add_collection()方法可以创建对象集合,而tensorflow默认会把对象放入名为“variables”的集合里面。看代码:import tensorflow as tfimport numpy as npwith tf.variable_scope(“xyz”) as scop:a=tf.get_variable(“a”,shape=[2])b...原创 2018-12-13 20:22:19 · 155 阅读 · 0 评论 -
tensorflow之让变量不可训练
import tensorflow as tfimport numpy as npwith tf.variable_scope(“xyz”) as scop:a=tf.get_variable(“a”,shape=[2],trainable=False)b=tf.get_variable(“b”,shape=[2])c=tf.get_variable(“c”,shape=[2])pri...原创 2018-12-13 20:26:22 · 3942 阅读 · 0 评论 -
python zip对象重复访问之坑
python中,zip对象只可被访问一次看代码:a = [1,2,3,4,5]b = [6,7,8,9,10]c=zip(a,b)print(type©)print©for i,j in c:print(i,j)print("************************")for k,l in c:print(“222222”)print(k,l)print("&am...原创 2018-12-19 15:43:44 · 1191 阅读 · 2 评论 -
tensorflow迭代器
代码:import tensorflow as tfdataset = tf.data.Dataset.range(100)iterator = dataset.make_one_shot_iterator()next_element = iterator.get_next()with tf.Session() as sess:print(sess.run(next_element))...原创 2018-12-19 16:02:59 · 881 阅读 · 0 评论 -
tensorflow之one hot
import tensorflow as tfa = tf.one_hot(5, 10)b = tf.argmax(a)with tf.Session() as sess:print(sess.run(a))print(sess.run(b))原创 2018-12-19 17:03:21 · 146 阅读 · 0 评论 -
tensorflow之收集变量
import tensorflow as tfimport numpy as npa = tf.Variable(0,dtype=tf.float32)c = tf.assign_add(a,1)#收集标量#d是一次操作<class ‘tensorflow.python.framework.ops.Tensor’>d = tf.summary.scalar(“loss”,a...原创 2018-12-14 16:02:54 · 289 阅读 · 1 评论 -
tensorboard基础操作1
使用tensorboard会从用户本地文件夹下面寻找文件,然后在浏览器显示,刷新周期可自己设置,首先要把生成数据和保存数据,保存的数据是二进制形式。代码如下:import tensorflow as tfimport numpy as npa = tf.Variable(0,dtype=tf.float32)c = tf.assign_add(a,1)#收集标量#d是一次操作&lt;...原创 2018-12-14 16:28:18 · 354 阅读 · 0 评论 -
tensorflow.get_variable
get_variable类似C++结构体代码:import tensorflow as tfimport numpy as npa=tf.get_variable(“a”,shape=[2])b=tf.get_variable(“b”,shape=[2,2])c=tf.get_variable(“c”,shape=[2])tf.add_to_collection(“group1”,a...原创 2018-12-13 18:40:58 · 341 阅读 · 1 评论