TL;DR
Как это исправить? Определите входной слой:
x = tf.keras.layers.Input(tensor=tf.ones(shape=(1, 8)))
dense = tf.layers.Dense(units=2)
out = dense(x)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
res = sess.run(fetches=out)
print(dense.output_shape) # shape = (1, 2)
В соответствии с документацией Кераса, если слой имеет единственный узел strong>, вы можете получить его входной тензор, выходной тензор, входную форму и выходную форму с помощью:
- layer.input
- layer.output
- layer.input_shape
- layer.output_shape
Но в приведенном выше примере, когда мы вызываем layer.output_shape
или другие атрибуты, он генерирует исключения, которые кажутся немного странными.
Если углубиться в исходный код, ошибка вызвана входящими узлами.
if not self._inbound_nodes:
raise AttributeError('The layer has never been called '
'and thus has no defined output shape.')
Что это за входящие узлы?
Узел описывает связь между двумя уровнями. Каждый раз, когда слой подключается к какому-либо новому входу, узел добавляется в layer._inbound_nodes. Каждый раз, когда выходные данные уровня используются другим слоем, узел добавляется в layer._outbound_nodes.
Как видно из вышеизложенного, когда self._inbounds_nodes
равно None, возникает исключение. Это означает, что когда слой не подключен к входному слою или, в более общем смысле, ни один из предыдущих слоев не подключен к входному слою, self._inbounds_nodes
пуст, что вызвало проблему.
Обратите внимание, что x
в вашем примере - это тензор, а не входной слой. См. Еще один пример для дополнительных разъяснений:
x = tf.keras.layers.Input(shape=(8,))
dense = tf.layers.Dense(units=2)
out = dense(x)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
res = sess.run(fetches=out, feed_dict={x: np.ones(shape=(1, 8))})
print(res)
print(res.shape) # shape = (1,2)
print(dense.output_shape) # shape = (None,2)
Это прекрасно, потому что входной слой определен.
Обратите внимание, что в вашем примере out
- это тензор. Разница между функцией tf.shape()
и .shape
= (_ 11_) заключается в следующем:
tf.shape(x)
возвращает одномерный целочисленный тензор, представляющий динамическую форму x. Динамическая форма будет известна только во время выполнения графа.
x.shape
возвращает кортеж Python, представляющий статическую форму x. Статическая форма, известная во время определения графика.
Подробнее о форме тензора см .: https://pgaleone.eu/tensorflow/2018/07/28/understanding-tensorflow-tensors-shape-static-dynamic/
person
Amir
schedule
15.01.2019