tensorflow权重初始化
一,用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权重初始化相关推荐
- Tensorflow:在Tensorflow的不同版本中如何实现Xavier参数权重初始化
Tensorflow:在Tensorflow的不同版本中如何实现Xavier参数权重初始化 目录 在Tensorflow的不同版本中实现Xavier参数权重初始化 Tensorflow1版本中实现
- Tensorflow中GRU和LSTM的权重初始化
GRU和LSTM权重初始化 在编写模型的时候,有时候你希望RNN用某种特别的方式初始化RNN的权重矩阵,比如xaiver或者orthogonal,这时候呢,只需要: 1 2 3 4 5 6 7 8 9 ...
- 权重初始化方式对神经网络迭代次数的影响
做一个网络 输入X范围是[1e-16,37] 权重初始化方式 Random rand1 =new Random(); int ti1=rand1.nextInt(98)+1; tw[a][b]=(do ...
- 深度学习 | Why and How:神经网络中的权重初始化
北京 | 深度学习与人工智能研修 12月23-24日 再设经典课程 重温深度学习阅读全文> 正文共2268个字,8张图,预计阅读时间:6分钟. 前言 神经网络中的权重(weight)初始化是个常 ...
- 深度学习入门笔记(十一):权重初始化
欢迎关注WX公众号:[程序员管小亮] 专栏--深度学习入门笔记 声明 1)该文章整理自网上的大牛和机器学习专家无私奉献的资料,具体引用的资料请看参考文献. 2)本文仅供学术交流,非商用.所以每一部分具 ...
- 优达学城《DeepLearning》2-3:权重初始化
目录 初始重量并观察训练损失 数据集和模型 导入库并加载数据 可视化一些训练数据 定义模型结构 初始化权重 全部为0或1 比较模型行为 均匀分布 统一初始化,基线 设置权重的一般规则 正态分布(Nor ...
- 【深度学习理论】(4) 权重初始化,Batch Normalization
各位同学好,最近学习了CS231N斯坦福计算机视觉公开课,讲的太精彩了,和大家分享一下. 1. 权重初始化 1.1 相同的初始化权重 神经网络中的所有权重都能通过梯度下降和反向传播来优化和更新.现在问 ...
- 神经网络中的权重初始化一览:从基础到Kaiming
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 在进行各种小实验和思维训练时,你会逐步发现为什么在训练深度神经网络 ...
- 神经网络中的权重初始化常用方法
1.权重初始化的重要性 神经网络的训练过程中的参数学习时基于梯度下降算法进行优化的.梯度下降法需要在开始训练时给每个参数赋予一个初始值.这个初始值的选取十分重要.在神经网络的训练中如果将权重全部初始化 ...
最新文章
- 将XML转为HTML
- JS 使用html2canvas实现截图功能的问题记录和解决方案
- 转载:MFC 获得各类指针、句柄的方法
- Spring Boot中使用Swagger2构建RESTful APIs
- BZOJ 4849 [NEERC2016]Mole Tunnels (模拟费用流)
- Object-C中的字符串对象1-不可变字符串
- python电脑编程求圆的面积案例_学Python划重点七 网络编程(UPD Socket编程、上传文件实例、计算圆的面积实例)...
- 研究员发现macOS 版本Safari 浏览器中的严重漏洞,获奖10.5万美元
- tomcat中三种部署项目的方法(转)
- Matplotlib——基本用法
- Tomcat,Jboss,Weblogic通过jndi连接数据库
- 远程协同网络架构photon cloud
- AgileEAS.NET SOA 中间件/敏捷软件开发平台
- C++ 职工管理系统
- linux下隐藏文件 和 显示隐藏文件命令
- 从此刻立志——我要做大牛
- p20华为云电脑白屏_教你一招让华为P20秒变电脑,真的很简单!
- opengl png图片 qt_Qt学习:三维绘图之OpenGL和Qt的结合(转)
- MySQL之启动选项
- 云卷云舒:2022 数据库总结从Gartner到IDC
热门文章
- 怎样高效阅读一份深度学习项目代码?
- 直通BAT必考题系列:深入剖析JVM之G1收集器、及回收流程、与推荐用例
- 2019 最全支付宝高级Java现场面试37题
- 领域应用 | 中医临床术语系统
- 【干货】推荐系统中的机器学习算法与评估实战
- Dubbo+Zookeeper+SpringBoot
- [KMP]一本通(http://ybt.ssoier.cn:8088) 1698:字符串匹配
- 02 算术、字符串与变量(1)
- PHP逐行解析文件,并写入数据库
- ResourceManager里面Trackingui需要手动该ip