Когда и где определяются и сохраняются «форма» и вес слоя кераса / тензорного потока? - PullRequest
0 голосов
/ 25 января 2019

Два конкретных вопроса:

Почему слой 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 на окнах.)

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Я вижу, что код учебника, на который я ссылался и цитировал был изменен, чтобы включить input_shape в Flatten слой. Теперь оно гласит:

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(input_shape=(28, 28)),
  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)

(ссылка остается https://www.tensorflow.org/tutorials)

Это обновление кода частично отвечает на мой вопрос.

0 голосов
/ 25 января 2019

В TensorFlow тензоры имеют двух различных типов форм: динамическая форма и статическая форма .Рассмотрим статические и динамические формы тензора с именем my_tensor.

Статическая форма доступна, только если вы определите ее при создании тензора, если она может быть выведена из других тензоров в графе с определенными формами.Если определено, его можно найти с помощью my_tensor.get_shape() в любое время.

Динамическая фигура доступна только во время выполнения и должна быть соизмерима со статической формой.Во время выполнения к графу можно добавить узел, который возвращает тензор, содержащий динамическую фигуру, используя tf.shape, например, запись my_shape=tf.shape(my_tensor) и запуск узла my_shape в вашем сеансе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...