Tensorflow 张量流权重初始化

Tensorflow 张量流权重初始化,tensorflow,deep-learning,mnist,Tensorflow,Deep Learning,Mnist,关于TensorFlow网站上的测试,我做了一个实验(),看看不同的权重初始化对学习的影响。我注意到,与我在《大众》杂志上读到的相反,无论体重多少,学习都是很好的 不同的曲线表示w的不同值,用于初始化卷积层和完全连接层的权重。请注意,w的所有值都可以正常工作,即使0.3和1.0的性能较低,一些值的训练速度更快,尤其是0.03和0.1最快。尽管如此,图中显示了相当大的w范围,这表明w.r.t.权重初始化的“鲁棒性” def-weight_变量(形状,w=0.1): 初始值=tf.截断的_法线(形

关于TensorFlow网站上的测试,我做了一个实验(),看看不同的权重初始化对学习的影响。我注意到,与我在《大众》杂志上读到的相反,无论体重多少,学习都是很好的

不同的曲线表示
w
的不同值,用于初始化卷积层和完全连接层的权重。请注意,
w
的所有值都可以正常工作,即使
0.3
1.0
的性能较低,一些值的训练速度更快,尤其是
0.03
0.1
最快。尽管如此,图中显示了相当大的
w
范围,这表明w.r.t.权重初始化的“鲁棒性”

def-weight_变量(形状,w=0.1):
初始值=tf.截断的_法线(形状,stddev=w)
返回tf.变量(初始值)
def偏差_变量(形状,w=0.1):
初始=tf.常数(w,形状=形状)
返回tf.变量(初始值)
问题:为什么这个网络没有出现消失或爆炸的梯度问题

我建议您阅读实现细节的要点,但这里的代码仅供参考。在我的Nvidia 960m上花了大约一个小时,尽管我认为它也可以在合理的时间内在CPU上运行

导入时间
从tensorflow.examples.tutorials.mnist导入输入数据
导入tensorflow作为tf
从tensorflow.python.client导入设备库
进口numpy
将matplotlib.pyplot导入为pyplot
mnist=输入数据。读取数据集('mnist\U数据',one\U hot=真)
#权重初始化
def重量_变量(形状,w=0.1):
初始值=tf.截断的_法线(形状,stddev=w)
返回tf.变量(初始值)
def偏差_变量(形状,w=0.1):
初始=tf.常数(w,形状=形状)
返回tf.变量(初始值)
#网络体系结构
def conv2d(x,W):
返回tf.nn.conv2d(x,W,步长=[1,1,1,1],padding='SAME')
def max_pool_2x2(x):
返回tf.nn.max_pool(x,ksize=[1,2,2,1],
步幅=[1,2,2,1],填充='SAME')
用于重量初始化的def构建网络(w):
“”“为MNIST问题生成CNN:
-32 5x5内核卷积层,带偏置和ReLU激活
-2x2最大池
-64 5x5内核卷积层,带偏置和ReLU激活
-2x2最大池
-具有1024个节点的完全连接层+偏置和ReLU激活
-辍学
-用于分类的全连接softmax层(10类)
返回列车数据的x和y占位符,即输出
将网络和dropbout占位符作为4个元素的元组。
"""
x=tf.placeholder(tf.float32,shape=[None,784])
y=tf.占位符(tf.float32,shape=[None,10])
x_image=tf.重塑(x,[-1,28,28,1])
W_conv1=权重_变量([5,5,1,32],W)
b_conv1=偏差_变量([32],w)
h_conv1=tf.nn.relu(conv2d(x_图像,W_conv1)+b_conv1)
h_池1=最大池2(h_池1)
W_conv2=权重_变量([5,5,32,64],W)
b_conv2=偏差_变量([64],w)
h_conv2=tf.nn.relu(conv2d(h_pool1,W_conv2)+b_conv2)
h_池2=最大池2×2(h_池2)
W_fc1=权重_变量([7*7*641024],W)
b_fc1=偏差_变量([1024],w)
h_pool2_flat=tf.重塑(h_pool2,[-1,7*7*64])
h_fc1=tf.nn.relu(tf.matmul(h_pool2_flat,W_fc1)+b_fc1)
keep_prob=tf.placeholder(tf.float32)
h_fc1_drop=tf.nn.drop(h_fc1,keep_prob)
W_fc2=重量_变量([1024,10],W)
b_fc2=偏差_变量([10],w)
y_conv=tf.matmul(h_fc1_drop,W_fc2)+b_fc2
返回(x,y,y转换,保持概率)
#实验
def评估重量初始值(w):
“”“返回在上训练的网络的精度学习曲线。”
10000批50个样本。学习曲线有一项
每100批
使用tf.Session()作为sess:
x、 y_u,y_conv,keep_prob=build_network_用于权重初始化(w)
交叉熵=tf.reduce\u平均值(
tf.nn.softmax_cross_entropy_与_logits(labels=y,logits=y\u conv))
列车步长=tf.列车AdamOptimizer(1e-4).最小化(交叉熵)
正确的预测=tf.equal(tf.argmax(y_conv,1),tf.argmax(y_,1))
准确度=tf.reduce_平均值(tf.cast(正确的预测,tf.float32))
sess.run(tf.global\u variables\u initializer())
lr=[]
对于范围内的uu(100):
对于范围(100)内的i:
批次=列表列下一批(50)
train_step.run(feed_dict={x:batch[0],y_:batch[1],keep_prob:0.5})
断言mnist.test.images.shape[0]==10000
#这样,精度评估适合我的2GB笔记本电脑GPU。
a=总和(
准确度。评估(进给量)={
x:mnist.test.images[2000*i:2000*(i+1)],
y:列表测试标签[2000*i:2000*(i+1)],
保持(prob:1.0})
对于范围(5))/5中的i
lr.追加(a)
返回lr
ws=[0.0001,0.0003,0.001,0.003,0.01,0.03,0.1,0.3,1.0]
准确度=[
[评估w中w的w权重的w初始值(w)]
适用于范围内(3)
]
#绘图结果
pyplot.plot(numpy.array(精度).平均值(0.T)
pyplot.ylim(0.9,1)
pyplot.xlim(0140)
pyplot.xlabel('batch(x100)'))
pyplot.ylabel(“测试精度”)
pyplot.legend(ws)

逻辑函数更倾向于消失梯度,因为它们的梯度都是权重初始化策略可能是改进模型的一个重要且经常被忽略的步骤,而且由于这是Google上的最高结果,我认为它可以保证得到更详细的答案

通常,每层激活函数梯度、传入/传出连接数(扇入/扇出)和权重方差的总乘积应等于1。这样,当您通过网络反向传播时,输入和输出梯度之间的差异将保持一致