关于tf.layers .dense的问题

时间:2019-02-02 10:06:22

标签: python tensorflow

我最近才开始研究张量流。做一些运动时,会出现一个问题。 对于构建隐藏层,我知道有两种定义方法。

  1. 通过使用tf.layers.dense定义完全连接的层 例如

    layer_1 = tf.layers.dense(X,512,activation = tf.nn.relu) layer_2 = tf.layers.dense(layer_1,256,activation = tf.nn.relu)

  2. 通过使用tf.add(tf.matmul(X,W),b)(直接矩阵乘法)来定义图层 例如:

    w1 = tf.Variable(tf.random_normal([in_size,out_size]))

    b1 = ....

    w2 = ....

    b2 = ...

    layer_1 = tf.add(tf.matmul(x,w1),b1) layer_1 = tf.nn.relu(relu) layer_2 = tf.add(tf.matmul(layer_1,w2),b2) layer_2 = tf.nn.relu(layer_2)

我尝试了这两种方法来构建多层NN,两者都可以工作。 我的问题是:它们之间有区别吗? 我的猜测:1)在方法2中,W,b可以通过张量板监视,因为它们是明确定义的。

感谢任何反馈。谢谢

2 个答案:

答案 0 :(得分:1)

您的第一种方法将默认使用tf.glorot_uniform_initializer来初始化权重,如herehere中所述,因此性能可能会略有不同。我认为您也可以使用第一种方法来监控体重。

答案 1 :(得分:1)

使用tf.layers和通过创建Wb矩阵然后进行tf.matmultf.add来定义自己的图层之间绝对没有区别。例如,第一个代码段:

tf.reset_default_graph()
tf.set_random_seed(42)
X = tf.ones((5,4), dtype=tf.float32)
init = tf.initializers.random_uniform(minval=-0.1, maxval=0.1, dtype=tf.float32)
logits_first = tf.layers.dense(inputs = X, units = 7, kernel_initializer=init, 
bias_initializer=init)
sess = tf.Session()
sess.run(tf.global_variables_initializer())
sess.run(logits_first)

求值与第二个片段相同的值:

tf.reset_default_graph()
tf.set_random_seed(42)
X = tf.ones((5,4), dtype=tf.float32)
W = tf.Variable(tf.random_uniform([4, 7], -0.1, 0.1), dtype=tf.float32)
b = tf.Variable(tf.random_uniform([7], -0.1, 0.1), dtype=tf.float32)
logits_second = tf.add(tf.matmul(X, W), b)
sess = tf.Session()
sess.run(tf.global_variables_initializer())
sess.run(logits_second)

此外,您可以监视两种方法。图创建中定义的所有内容都可以在张量板上监视。