Тензор потока: почему результат одного узла нейронной сети без функции активации отличается от моего собственного расчета? - PullRequest
0 голосов
/ 05 апреля 2019

я создал один узел с 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 Ответ

1 голос
/ 05 апреля 2019

Проблема в том, что 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...