Tensorflow:将手动构建图层转换为tf.contrib.layers

时间:2017-02-22 18:01:22

标签: python tensorflow

我定义了这四个层:

layer_1 = tf.add(
    tf.matmul(input, tf.Variable(tf.random_normal([n_input, n_hidden_1])),
    tf.Variable(tf.random_normal([n_hidden_1]))))
layer_2 = tf.nn.sigmoid(tf.add(
    tf.matmul(layer_1, tf.Variable(tf.random_normal([n_hidden_1, n_hidden_2])),
    tf.Variable(tf.random_normal([n_hidden_2]))))
layer_3 = tf.nn.sigmoid(tf.add(
    tf.matmul(layer_2, tf.Variable(tf.random_normal([n_hidden_2, n_hidden_1])))),
    tf.Variable(tf.random_normal([n_hidden_1]))))
layer_4 = tf.add(
    tf.matmul(layer_3, tf.Variable(tf.random_normal([n_hidden_1, n_input]))),
    tf.Variable(tf.random_normal([n_input])))

我想将此代码转换为基于tf.contrib.layers的代码。到目前为止,我得到了

layer_1 = tf.contrib.layers.fully_connected(
    inputs=input,
    num_outputs=n_hidden_1,
    activation_fn=None)
layer_2 = tf.contrib.layers.fully_connected(
    inputs=layer_1,
    num_outputs=n_hidden_2,
    activation_fn=tf.nn.sigmoid)
layer_3 = tf.contrib.layers.fully_connected(
    inputs=layer_2,
    num_outputs=n_hidden_1,
    activation_fn=tf.nn.sigmoid)
layer_4 = tf.contrib.layers.linear(
    inputs=layer_3,
    num_outputs=n_input)

阅读https://www.tensorflow.org/versions/master/tutorials/layers/https://www.tensorflow.org/api_docs/python/tf/contrib/layers/fully_connected。我在https://www.tensorflow.org/api_guides/python/contrib.layers#Higher_level_ops_for_building_neural_network_layers中读到tf.contrib.layers.linear是线性图层的替代方案。

但是我的输出与我之前的输出相比更加不同,那么这可能是偶然的。我在层的配置中做错了什么?

1 个答案:

答案 0 :(得分:0)

您的代码与tf.contrib.layers版本之间的一个区别是默认初始值设定项不同:

这些通常被认为是完全连接图层的良好默认值,但您可以使用tf.random_normal_initializer覆盖它们,如下所示:

layer_1 = tf.contrib.layers.fully_connected(
    inputs=input,
    num_outputs=n_hidden_1,
    activation_fn=None,
    weights_initializer=tf.random_normal_initializer(),
    biases_initializer=tf.random_normal_initializer())
# ...