Tensorflow:为什么没有激活函数的单个神经网络节点的结果与我自己的计算结果不同?

时间:2019-04-05 12:44:17

标签: python-3.x tensorflow neural-network

我创建了一个具有3个输入和一个具有偏置0且没有激活功能的输出的单个节点。 据我了解,这里唯一发生的是输入向量和随机初始化的权重之间的矩阵乘法,但是当我自己用相同的输入和权重进行乘法运算时,会得到不同的结果吗?我在想什么/做错了什么?

提前谢谢!

我的计算基于here提供的一些代码

代码如下:

def example_code(self):
    import tensorflow as tf

    data = [[1.0,2.0,3.0]]
    x = tf.placeholder(tf.float32,shape=[1,3],name="mydata")
    node = tf.layers.Dense(units=1)
    y = node(x)
    init = tf.global_variables_initializer()
    sess = tf.Session()
    sess.run(init)
    print("input: "+str(data))
    outcome = sess.run(y,feed_dict={x:data})
    #print("outcome from tensorflow: "+str(outcome))
    weights = node.get_weights()[0]
    bias = node.get_weights()[1]
    print("weights: "+str(weights))
    print("bias: "+str(bias))
    print("outcome from tensorflow: " + str(outcome))
    outcome = tf.matmul(data,weights)
    print("manually calculated outcome: "+str(sess.run(outcome)))

代码输出

input: [[1.0, 2.0, 3.0]]
weights: [[ 0.72705185] [-0.70188504] [ 0.5336163 ]]
bias: [0.]
outcome from tensorflow: [[-1.3463312]]
manually calculated outcome: [[0.9241307]]

1 个答案:

答案 0 :(得分:1)

问题是tf.layers未使用用途未在会话sess中使用。这继而导致权重的不同初始化,因此导致两个不同的值。 tf.layers最终使用tf.keras.backend.get_session()来检索用于初始化和权重(node.get_weights())的会话。 tf.keras.backend.get_session()尝试使用默认会话(如果有),如果没有,则创建自己的会话。在这种情况下,sess未配置为默认会话(只有tf.InteractiveSession在构造时自动配置为默认会话)。最简单的解决方法是以推荐的方式使用tf.Session作为上下文管理器:

def example_code(self):
    import tensorflow as tf
    with tf.Session() as sess:
        data = [[1.0,2.0,3.0]]
        x = tf.placeholder(tf.float32,shape=[1,3],name="mydata")
        node = tf.layers.Dense(units=1)
        y = node(x)
        init = tf.global_variables_initializer()
        sess.run(init)
        print("input: "+str(data))
        outcome = sess.run(y,feed_dict={x:data})
        #print("outcome from tensorflow: "+str(outcome))
        weights = node.get_weights()[0]
        bias = node.get_weights()[1]
        print("weights: "+str(weights))
        print("bias: "+str(bias))
        print("outcome from tensorflow: " + str(outcome))
        outcome = tf.matmul(data,weights)
        print("manually calculated outcome: "+str(sess.run(outcome)))

这会将sess设置为默认会话,并且还将确保在函数完成时释放其资源(这是代码中的另一个问题)。如果出于某种原因,您希望使用某个会话作为默认会话,但又不想通过上下文管理器将其关闭,则可以使用as_default()

def example_code(self):
    import tensorflow as tf
    sess = tf.Session():
    with sess.as_default():
        data = [[1.0,2.0,3.0]]
        x = tf.placeholder(tf.float32,shape=[1,3],name="mydata")
        node = tf.layers.Dense(units=1)
        y = node(x)
        init = tf.global_variables_initializer()
        sess.run(init)
        print("input: "+str(data))
        outcome = sess.run(y,feed_dict={x:data})
        #print("outcome from tensorflow: "+str(outcome))
        weights = node.get_weights()[0]
        bias = node.get_weights()[1]
        print("weights: "+str(weights))
        print("bias: "+str(bias))
        print("outcome from tensorflow: " + str(outcome))
        outcome = tf.matmul(data,weights)
        print("manually calculated outcome: "+str(sess.run(outcome)))
    # You need to manually ensure that the session gets closed after
    sess.close()