Почему вы должны изменить входные данные в Keras / Tensorflow 2? - PullRequest
1 голос
/ 25 марта 2020

У меня есть простая сеть:

input_layer = Input(1)
inner_layer = Dense(4, activation='relu')(input_layer)
output_layer = Dense(1, activation='linear')(inner_layer)
model = Model(input_layer, output_layer)
optimizer = Adam(learning_rate=0.01)
model.compile(optimizer=optimizer, loss='mse')

Интуитивно понятно, что вывод для ввода 0 будет просто model.predict(0). Однако это приводит к этой ошибке: expected input_2 to have 2 dimensions, but got array with shape ()

Я понимаю, что ожидается, что вход (который является одним числом) будет двумерным, но я не понимаю, что Tensorflow принимает в качестве допустимого ввода. Я перепробовал много разных комбинаций входов, некоторые работают, а некоторые нет, это кажется довольно непоследовательным, и предупреждения / ошибки обычно бесполезны:

При вызове model.predict():

  • model.predict(0) - Броски
  • model.predict([0]) - Работы
  • model.predict([[0]]) - Работы

Когда вызов model() (я видел здесь , который необходим для получения градиентов):

  • model(0) - броски
  • model([0]) - броски
  • model([[0]]) - Броски

При использовании np.reshape:

  • model(np.reshape(0,[1,1])) - Работает
  • model(np.reshape([0],[1,1])) - Работает
  • model(np.reshape([[0]],[1,1])) - Работает

То, что работает последовательно, использует numpy s * Функция 1065 *. он всегда работает как для model.predict(), так и для model() на всех входах, если они преобразуются в форму [1,1].

Мои вопросы:

  1. Что рекомендации по вводу входных данных в модели тензорного потока в отношении форм / типов входных данных?
  2. Что означает «shape ()»?
  3. Что означает «(None, 1)»?
  4. Почему reshape работает, а [[0]] - нет? Оба создают двухмерную коллекцию.
  5. Почему при вызове model(0) / model([0]) / model([[0]]) это предупреждение показывает: WARNING:tensorflow:Model was constructed with shape Tensor("input_1:0", shape=(None, 1), dtype=float32) for input (None, 1), but it was re-called on a Tensor with incompatible shape ()?

1 Ответ

1 голос
/ 25 марта 2020

Форма тензора inputs = tf.keras.layers.Input(1) равна (None, 1) (пробег inputs.get_shape().as_list()). None означает любой размер, который определяется динамически (размер партии). 1 - это форма вашей точки данных. Например, это тензор формы (3, 1):

[[1], [2], [1]]

Это тензор формы (3,)

[1, 2, 1]

Если определить тензор формы (None, 1) Вы должны подать данные той же формы.

[[0]] имеет правильную форму (1, 1) и не выдаст ошибку или предупреждение, если вы передадите его как numpy массив ожидаемого типа данных:

import tensorflow as tf
import numpy as np

input_layer = tf.keras.layers.Input(1)
inner_layer = tf.keras.layers.Dense(4, activation='relu')(input_layer)
output_layer = tf.keras.layers.Dense(1, activation='linear')(inner_layer)
model = tf.keras.models.Model(input_layer, output_layer)
optimizer = tf.keras.optimizers.Adam(learning_rate=0.01)
model.compile(optimizer=optimizer, loss='mse')
print(model(np.array([[0.]], dtype=np.float32)).numpy()) # [[0.]]
print(model.predict(np.array([[0.], [1]], dtype=np.float32))) # [[0.        ]
                                                              # [0.08964952]]

np.reshape() работает, потому что он автоматически преобразует ваш список в numpy массив. Для получения дополнительной информации о np.reshape см. Официальную документацию .

. model.predict() также ожидает такую ​​же форму, как и model.__call__(), но может выполнять автоматическое изменение формы c (расширение размера на слева, т.е. [1] -- > [[1]]).

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