Tensorflow: почему результат одного узла нейронной сети без функции активации отличается от моих собственных вычислений?

#python-3.x #tensorflow #neural-network

#python-3.x #tensorflow #нейронная сеть

Вопрос:

я создал один узел с 3 входами и одним выходом со смещением 0 и без функции активации. насколько я понимаю, единственное, что здесь происходит, это матричное умножение между входным вектором и случайно инициализированными весами, но когда я сам выполняю умножение с теми же входными данными и весами, я получаю другой результат? чего я не понимаю / делаю неправильно?

заранее спасибо!

я основываю свои вычисления на некотором коде, предоставленном здесь

вот код:

 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:

Проблема в том, что tf.layers не использует uses не использует ваш сеанс 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()