Два конкретных вопроса:
Почему слой keras Dense
не знает свои input_shape
и output_shape
даже после запуска модели?
Почему нетслой знает количество параметров до тех пор, пока не пройдут некоторые тренировочные данные?
Я обучаю простую модель кераса / тензорного потока, но когда я пытаюсь посмотреть на слои модели, я получаю такие ошибки, как:
"AttributeError: слой никогда не вызывался и, следовательно, не имеет определенной формы ввода."
Или короткая версия моих вопросов: что здесь происходит?
Я уверен, что в некотором техническом смысле «слой никогда не вызывался» и «не имеет определенной входной формы», но, поскольку слой был обучен (и использован для оценки), что это значит, что он »никогда не назывался "?
(Что мне действительно нужно, так это обзор - я его пока не нашел) архитектуры keras и доступное введение в то, что происходит под капотом. Привет keras gurus!)
конкретно бегаюпервая модель из урока tenorflow:
https://www.tensorflow.org/tutorials/
Вот пример учебного кода, который я запустил:
import tensorflow as tf
mnist = tf.keras.datasets.mnist
(x_train, y_train),(x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(512, activation=tf.nn.relu),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(10, activation=tf.nn.softmax)
])
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
model.fit(x_train, y_train, epochs=5)
model.evaluate(x_test, y_test)
После запуска (т.е. построения, компиляцииПодбирая и оценивая) модель, я вызываю, например:
model.layers[1].input_shape
и получаю:
Файл "\ python \ keras \ engine \ base_layer.py",1338, в input_shape повысить AttributeError («Слой никогда не назывался» AttributeError: Слой никогда не вызывался и, следовательно, не имеет определенной формы ввода.
В связанной вене, если доработает model.fit()
, но после запуска model.compile()
я звоню:
model.layers[1].count_params()
Я получаю:
ValueError: Вы пытались вызвать count_params
на плотной_3, нослой не построен.Вы можете создать его вручную с помощью: dense_3.build(batch_input_shape)
.
Если я позвоню count_params()
после вызова model.fit()
, я получу 401920. (Спасибо, что нашли время ответить на мои вопросы.) (Это значениеравно 785 x 512 - я бы ожидал 784 x 512, но я полагаю, что это достаточно близко ...)
Наивно я мог бы предположить, что "компиляция" модели устанавливает различные структуры данных, содержащиепараметры модели должны быть оптимизированы, но, скорее всего, это происходит на лету, когда вы сначала прокачиваете данные тренировки через модель.
Хорошо, но что тогда делает model.compile()
?
(Это использует тензор потока 1.12.0 с питоном 3.7.2 на окнах.)