Проблема в том, что 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()