#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()