我最近才开始研究张量流。做一些运动时,会出现一个问题。 对于构建隐藏层,我知道有两种定义方法。
通过使用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)
通过使用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可以通过张量板监视,因为它们是明确定义的。
感谢任何反馈。谢谢
答案 0 :(得分:1)
答案 1 :(得分:1)
使用tf.layers
和通过创建W
和b
矩阵然后进行tf.matmul
和tf.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)
此外,您可以监视两种方法。图创建中定义的所有内容都可以在张量板上监视。