2017-04-23 65 views
0

我有这个简单的两层前馈网络将分类MNIST数字。有了这个网络,我可以得到满意的精度,但我想稍微修改它。在Shrivastava et al.之后,我希望在没有横向模块的情况下采用自上而下的调制(请参阅第3页)。另外,我想将它限制在这两层,所以不要创建更深的网络。基本上,在新网络中,与下面的简单前馈网络相反,第二层再次连接到第一层以实现这种自顶向下的反馈链路。自顶向下调制双层网络

我不知道该如何去做,经过大量的在线挖掘之后,我还没有发现任何其他关于如何在TensorFlow(或任何其他库)中执行此操作的源代码/示例。任何帮助或正确的方向推动非常感谢!

# PREVENTS VANISHING GRADIENT PROBLEM 
stddev1=np.sqrt(2/float(784)) 
# second = 10 units 
stddev2=np.sqrt(2/float(10)) 

w1 = tf.get_variable('w1',[784,10], 
        initializer=tf.random_normal_initializer(mean=0, stddev=stddev1)) 
b1 = tf.get_variable('b1',[10,], 
        initializer=tf.constant_initializer(0.0)) 
# relu has vanishing gradient problem 
z1 = tf.matmul(x, w1) + b1 
y1 = tf.nn.relu(z1) # 

# layer 2 
w2 = tf.get_variable('w2',[10,10], 
       initializer= tf.random_normal_initializer(mean=0,stddev=stddev2)) 
b2 = tf.get_variable('b2',[10,], 
        initializer=tf.constant_initializer(0.0)) 
y = tf.nn.softmax(tf.matmul(y1, w2) + b2, name="output") 

y_ = tf.placeholder(tf.float32, [None, 10]) 

cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1])) 
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy) 

回答

1

如果你想你的第二层连接到第一层,这将是递归神经网络(RNN),而不是自上而下的调制,

你其实也谈不上什么都没做的纸就像你所说的,他们只在前面的图层中使用他们以前的图层,实际上,他们喜欢跳过连接。

跳过的连接(或跳过层)是这样的:enter image description here

正如你可以以后SIP-层,我们使用add功能聚集两层为一见,但要实现自上而下的调制纸使用'横向模块'来直接将前一层连接到下一层。

+0

好的,这是有道理的。这可能是在稍后阶段。我想要完成的是将z2添加到x(输入图像),并且z1是从x和z2的和中计算出来的。我应该使用RNN细胞/ LSTM细胞吗?然后会像这样的工作(这是单层的权利?):[链接](https://pythonprogramming.net/rnn-tensorflow-python-machine-learning-tutorial/) – coderjoe

+0

如果你想这样做:(layer1 = x + z1,layer2 = x + layer1),因此不需要RNN,并且您共享的链接使用多个图层。 –