一,用10层神经网络,每一层的参数都是随机正态分布,均值为0,标准差为0.01

#10层神经网络
data = tf.constant(np.random.randn(2000, 800).astype('float32'))
layer_sizes = [800 - 50 * i for i in range(0, 10)]
num_layers = len(layer_sizes)fcs = []
for i in range(0, num_layers - 1):X = data if i == 0 else fcs[i - 1]node_in = layer_sizes[i]node_out = layer_sizes[i + 1]W = tf.Variable(np.random.randn(node_in, node_out).astype('float32')) * 0.01fc = tf.matmul(X, W)# fc = tf.contrib.layers.batch_norm(fc, center=True, scale=True,#                                   is_training=True)fc = tf.nn.tanh(fc)fcs.append(fc)#
with tf.Session() as sess:sess.run(tf.global_variables_initializer())print('input mean {0:.5f} and std {1:.5f}'.format(np.mean(data.eval()),np.std(data.eval())))for idx, fc in enumerate(fcs):print('layer {0} mean {1:.5f} and std {2:.5f}'.format(idx + 1, np.mean(fc.eval()),np.std(fc.eval())))for idx, fc in enumerate(fcs):print(fc)plt.subplot(1, len(fcs), idx + 1)#绘制直方图30个binplt.hist(fc.eval().flatten(), 30, range=[-1, 1])plt.xlabel('layer ' + str(idx + 1))plt.yticks([])#把y轴刻度关掉plt.show()

每一层输出值分布的直方图:

随着层数的增加,我们看到输出值迅速向0靠拢,在后几层中,几乎所有的输出值 x 都很接近0!回忆优化神经网络的back propagation算法,根据链式法则,gradient等于当前函数的gradient乘以后一层的gradient,这意味着输出值 x 是计算gradient中的乘法因子,直接导致gradient很小,使得参数难以被更新!

二,标准差改为1

几乎所有的值集中在-1或1附近,神经元饱和了!注意到tanh在-1和1附近的gradient都接近0,这同样导致了gradient太小,参数难以被更新

三,Xavier initialization可以解决上面的问题!其初始化方式也并不复杂。Xavier初始化的基本思想是保持输入和输出的方差一致,这样就避免了所有输出值都趋向于0。Xavier initialization是由Xavier Glorot et al.在2010年提出,He initialization是由Kaiming He et al.在2015年提出,Batch Normalization是由Sergey Ioffe et al.在2015年提出。

#10层神经网络
data = tf.constant(np.random.randn(2000, 800).astype('float32'))
layer_sizes = [800 - 50 * i for i in range(0, 10)]
num_layers = len(layer_sizes)fcs = []
for i in range(0, num_layers - 1):X = data if i == 0 else fcs[i - 1]node_in = layer_sizes[i]node_out = layer_sizes[i + 1]W = tf.Variable(np.random.randn(node_in, node_out).astype('float32'))/np.sqrt(node_in)fc = tf.matmul(X, W)# fc = tf.contrib.layers.batch_norm(fc, center=True, scale=True,#                                   is_training=True)fc = tf.nn.tanh(fc)fcs.append(fc)#
with tf.Session() as sess:sess.run(tf.global_variables_initializer())print('input mean {0:.5f} and std {1:.5f}'.format(np.mean(data.eval()),np.std(data.eval())))for idx, fc in enumerate(fcs):print('layer {0} mean {1:.5f} and std {2:.5f}'.format(idx + 1, np.mean(fc.eval()),np.std(fc.eval())))for idx, fc in enumerate(fcs):print(fc)plt.subplot(1, len(fcs), idx + 1)#绘制直方图30个binplt.hist(fc.eval().flatten(), 30, range=[-1, 1])plt.xlabel('layer ' + str(idx + 1))plt.yticks([])#把y轴刻度关掉plt.show()

输出值在很多层之后依然保持着良好的分布,

四,激活函数替换成relu

#10层神经网络
data = tf.constant(np.random.randn(2000, 800).astype('float32'))
layer_sizes = [800 - 50 * i for i in range(0, 10)]
num_layers = len(layer_sizes)fcs = []
for i in range(0, num_layers - 1):X = data if i == 0 else fcs[i - 1]node_in = layer_sizes[i]node_out = layer_sizes[i + 1]W = tf.Variable(np.random.randn(node_in, node_out).astype('float32'))/np.sqrt(node_in)fc = tf.matmul(X, W)# fc = tf.contrib.layers.batch_norm(fc, center=True, scale=True,#                                   is_training=True)fc = tf.nn.relu(fc)fcs.append(fc)#
with tf.Session() as sess:sess.run(tf.global_variables_initializer())print('input mean {0:.5f} and std {1:.5f}'.format(np.mean(data.eval()),np.std(data.eval())))for idx, fc in enumerate(fcs):print('layer {0} mean {1:.5f} and std {2:.5f}'.format(idx + 1, np.mean(fc.eval()),np.std(fc.eval())))for idx, fc in enumerate(fcs):print(fc)plt.subplot(1, len(fcs), idx + 1)#绘制直方图30个binplt.hist(fc.eval().flatten(), 30, range=[-1, 1])plt.xlabel('layer ' + str(idx + 1))plt.yticks([])#把y轴刻度关掉plt.show()

前面结果还好,后面的趋势却是越来越接近0

五,He initialization的思想是:在ReLU网络中,假定每一层有一半的神经元被激活,另一半为0,所以,要保持variance不变,只需要在Xavier的基础上再除以2:

W = tf.Variable(np.random.randn(node_in,node_out)) / np.sqrt(node_in/2)

六,Batch Normalization是一种巧妙而粗暴的方法来削弱bad initialization的影响,我们想要的是在非线性activation之前,输出值应该有比较好的分布(例如高斯分布),以便于back propagation时计算gradient,更新weight。

#10层神经网络
data = tf.constant(np.random.randn(2000, 800).astype('float32'))
layer_sizes = [800 - 50 * i for i in range(0, 10)]
num_layers = len(layer_sizes)fcs = []
for i in range(0, num_layers - 1):X = data if i == 0 else fcs[i - 1]node_in = layer_sizes[i]node_out = layer_sizes[i + 1]W = tf.Variable(np.random.randn(node_in, node_out).astype('float32'))/np.sqrt(node_in)fc = tf.matmul(X, W)fc = tf.contrib.layers.batch_norm(fc, center=True, scale=True,is_training=True)fc = tf.nn.relu(fc)fcs.append(fc)#
with tf.Session() as sess:sess.run(tf.global_variables_initializer())print('input mean {0:.5f} and std {1:.5f}'.format(np.mean(data.eval()),np.std(data.eval())))for idx, fc in enumerate(fcs):print('layer {0} mean {1:.5f} and std {2:.5f}'.format(idx + 1, np.mean(fc.eval()),np.std(fc.eval())))for idx, fc in enumerate(fcs):print(fc)plt.subplot(1, len(fcs), idx + 1)#绘制直方图30个binplt.hist(fc.eval().flatten(), 30, range=[-1, 1])plt.xlabel('layer ' + str(idx + 1))plt.yticks([])#把y轴刻度关掉plt.show()

tensorflow权重初始化相关推荐

  1. Tensorflow:在Tensorflow的不同版本中如何实现Xavier参数权重初始化

    Tensorflow:在Tensorflow的不同版本中如何实现Xavier参数权重初始化 目录 在Tensorflow的不同版本中实现Xavier参数权重初始化 Tensorflow1版本中实现

  2. Tensorflow中GRU和LSTM的权重初始化

    GRU和LSTM权重初始化 在编写模型的时候,有时候你希望RNN用某种特别的方式初始化RNN的权重矩阵,比如xaiver或者orthogonal,这时候呢,只需要: 1 2 3 4 5 6 7 8 9 ...

  3. 权重初始化方式对神经网络迭代次数的影响

    做一个网络 输入X范围是[1e-16,37] 权重初始化方式 Random rand1 =new Random(); int ti1=rand1.nextInt(98)+1; tw[a][b]=(do ...

  4. 深度学习 | Why and How:神经网络中的权重初始化

    北京 | 深度学习与人工智能研修 12月23-24日 再设经典课程 重温深度学习阅读全文> 正文共2268个字,8张图,预计阅读时间:6分钟. 前言 神经网络中的权重(weight)初始化是个常 ...

  5. 深度学习入门笔记(十一):权重初始化

    欢迎关注WX公众号:[程序员管小亮] 专栏--深度学习入门笔记 声明 1)该文章整理自网上的大牛和机器学习专家无私奉献的资料,具体引用的资料请看参考文献. 2)本文仅供学术交流,非商用.所以每一部分具 ...

  6. 优达学城《DeepLearning》2-3:权重初始化

    目录 初始重量并观察训练损失 数据集和模型 导入库并加载数据 可视化一些训练数据 定义模型结构 初始化权重 全部为0或1 比较模型行为 均匀分布 统一初始化,基线 设置权重的一般规则 正态分布(Nor ...

  7. 【深度学习理论】(4) 权重初始化,Batch Normalization

    各位同学好,最近学习了CS231N斯坦福计算机视觉公开课,讲的太精彩了,和大家分享一下. 1. 权重初始化 1.1 相同的初始化权重 神经网络中的所有权重都能通过梯度下降和反向传播来优化和更新.现在问 ...

  8. 神经网络中的权重初始化一览:从基础到Kaiming

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 在进行各种小实验和思维训练时,你会逐步发现为什么在训练深度神经网络 ...

  9. 神经网络中的权重初始化常用方法

    1.权重初始化的重要性 神经网络的训练过程中的参数学习时基于梯度下降算法进行优化的.梯度下降法需要在开始训练时给每个参数赋予一个初始值.这个初始值的选取十分重要.在神经网络的训练中如果将权重全部初始化 ...

最新文章

  1. 将XML转为HTML
  2. JS 使用html2canvas实现截图功能的问题记录和解决方案
  3. 转载:MFC 获得各类指针、句柄的方法
  4. Spring Boot中使用Swagger2构建RESTful APIs
  5. BZOJ 4849 [NEERC2016]Mole Tunnels (模拟费用流)
  6. Object-C中的字符串对象1-不可变字符串
  7. python电脑编程求圆的面积案例_学Python划重点七 网络编程(UPD Socket编程、上传文件实例、计算圆的面积实例)...
  8. 研究员发现macOS 版本Safari 浏览器中的严重漏洞,获奖10.5万美元
  9. tomcat中三种部署项目的方法(转)
  10. Matplotlib——基本用法
  11. Tomcat,Jboss,Weblogic通过jndi连接数据库
  12. 远程协同网络架构photon cloud
  13. AgileEAS.NET SOA 中间件/敏捷软件开发平台
  14. C++ 职工管理系统
  15. linux下隐藏文件 和 显示隐藏文件命令
  16. 从此刻立志——我要做大牛
  17. p20华为云电脑白屏_教你一招让华为P20秒变电脑,真的很简单!
  18. opengl png图片 qt_Qt学习:三维绘图之OpenGL和Qt的结合(转)
  19. MySQL之启动选项
  20. 云卷云舒:2022 数据库总结从Gartner到IDC

热门文章

  1. 怎样高效阅读一份深度学习项目代码?
  2. 直通BAT必考题系列:深入剖析JVM之G1收集器、及回收流程、与推荐用例
  3. 2019 最全支付宝高级Java现场面试37题
  4. 领域应用 | 中医临床术语系统
  5. 【干货】推荐系统中的机器学习算法与评估实战
  6. Dubbo+Zookeeper+SpringBoot
  7. [KMP]一本通(http://ybt.ssoier.cn:8088) 1698:字符串匹配
  8. 02 算术、字符串与变量(1)
  9. PHP逐行解析文件,并写入数据库
  10. ResourceManager里面Trackingui需要手动该ip