用卷积代替全连接,虽然在参数上没有减少,但是一个重要的优点在于输入的图片大小就可变了
从写好网络的角度去看这个问题,FC一旦定义了要对其做修改需要重新写这个层,也就是会改变网络的结构了;但是对于CONV来说,可以动态设置卷积核([h,w,c]*n),在图片读入时设计一个函数来读取大小,三个维度的参数返回给卷积核的大小
最常用的是D-VGG16 --16层需要求参
特点:使用小的卷积核(连续使用小的卷积核 -- 减少需要计算的参数 两层3*3连续卷积 == 一层5*5的卷积的感受野 层数增加--更丰富的非线性变换)
降维:
池化不重新计算参数,此处1*1的卷积核通过设置步长来缩小提取的面积
还有一种方式通过设置卷积核的个数,在提取后的特征图的通道数上进行降维
1*1的卷积核的好处:在作用上近似于池化核能做到降维,同时引入更高层次的非线性变换
w定义为一个不把方差写死的正态分布--上面作用于tanh
在relu上效果不怎么好
在xavier基础上除以2(也就是微调定制的思想)
对relu的契合度就大大提升了
w是变量,需要反复调整、训练、再调整
激活函数 -- relu;w合理的一个初始化 只能使得梯度消失的情况有所好转,是不能完全解决的,根本原因也是w是要调的
ELU在tensorflow框架中可以直接使用
hidden1=fully_connected(X,n_hidden1,activation_fn=tf.nn.elu)
'n_hidden1'是什么?
n_hidden1表示第一个隐藏层的神经元数量。n_hidden1是一个整数,定义了该层有多少个神经元
n_hidden1
相较于relu,leakly relu可以解决当梯度为负时,relu梯度为0(神经元死亡问题)
这个算子把原来的relu函数分段去看,划分为[负无穷,0),[0,正无穷],tf.maximum对比参数中第一个和第二个绝对值的大小,取绝对值大的,在负区间上,乘上一个比较小的系数(0.01),那么就取到这部分数值,而在正区间上,还是原来的数值大,就不受影响 -- leakly relu 需要再去定义算子实现
w大为什么会导致梯度消失
回到参数w本身,作为在网络结构中进行传递的东西,好比我们寄快递,原始的东西是我们放进去的,可以比拟为w的初始值,然后我会里三层外三层地去包装快递,可以比拟为参数在网络结构里每一层的传递,中间用来绑的胶带就是激活函数,w是要放在层与层之间的激活函数中去计算出新的数值传递到下一层的。那就回到激活函数上,tanh、sigmod、relu的函数图像,看tanh,在x上较大的一个位置(但是不是特别大时),函数的斜率(求导 -- 梯度)很大--梯度爆炸(也就是w的绝对值比较大);当趋近于无穷时激活函数的变化率也趋近于0 -- 梯度消失
正则化的本质是作用于学习率,通过一个正则化参数来减小学习率也就是步长,进而缓解梯度t的增幅,所以w ** t+1 = w ** t - (a-L) * g那么参数w的变动就会相对减小,因为往往训练到一定批次后精确率、准确率等指标的提高都是在w的小幅度调整中实现的,可以理解为精益求精,而不是大刀阔斧地革新阶段了
如何理解梯度消失和梯度爆炸
个人理解是:梯度消失:连续的一定的批次下,返回的accuracy一直都基本不变了,比如卡在0.92(举个例子),同时这个指标不能达到我们的预期,也就是还有点欠拟合,那么才会说是‘出问题了’(梯度消失),一直卡在1的化我们不会觉得这是个不好的现象
梯度爆炸:accuracy滑铁卢
梯度裁剪 -- 梯度爆炸问题
在反向传播结合Adam动态调整学习率时虽然一定程度上可以避免‘跳出山谷’的问题,但由于深度神经网络本身参数的量特别大,加之其损失函数的非凸性质,导致不确定性因素很大,加上梯度裁剪的策略可以更好地避免训练出现‘滑铁卢’
accuracy小幅度的变动可能原因:dropout的随机性、激活函数的非线性拟合能力
大幅度的变动(滑铁卢)则更应该考虑反向传播时梯度、模型参数的问题
//value[j+1]什么意思 package com.itbaizhan.arr.utll; import java.util.Arrays; public class maopaoText { public static void main(String[] args) { int [] a ={1,2,3,4,41,36,23,5,32,42}; mao(a); System.out.println(Arrays.toString(a)); } public static void mao(int[] value){ int emp; for (int i=0;i<value.length;i++){ boolean flag =true; for (int j=0;j<value.length-1-i;j++){ if(value[j]>value[j+1]){ emp=value[j];//mt[j] , value[j]=value[j+1];//将后来的值给现在参数, value[j+1]=emp ;//现在的参数赋值给第三变量 flag = false; } } if (flag){ break; } System.out.println(Arrays.toString(value)); } } }
老师,a[2]=[] 和a[2:3]=[]不都是换了元素3吗? 只是一个变成了空列表一个是切片范围内替换成空列表,为什么c不能算元素3删除啊?
template中写了
</router-view>,为什么在网页中没有显示呢,而且无法跳转到对应的页面
和老师的代码一样 为什么只有两个按钮,点击跳转的话,路由会改变,但是对应的页面却没有显示
为啥我显示的是这样的
老师好奇这两个方法哪个占内存少一些,运算快一些?
就是最后那个print位置有什么讲究啊,每个位置的结果都不同
非常抱歉给您带来不好的体验!为了更深入的了解您的学习情况以及遇到的问题,您可以直接拨打投诉热线:
我们将在第一时间处理好您的问题!
关于
课程分类
百战程序员微信公众号
百战程序员微信小程序
©2014-2025百战汇智(北京)科技有限公司 All Rights Reserved 北京亦庄经济开发区科创十四街 赛蒂国际工业园网站维护:百战汇智(北京)科技有限公司 京公网安备 11011402011233号 京ICP备18060230号-3 营业执照 经营许可证:京B2-20212637