Разница между моделью (x) и model.predict (x) - PullRequest
0 голосов
/ 22 февраля 2020

Вот простая функциональная модель API с тензорным потоком.

input1 = tf.keras.layers.Input(shape=(2,), dtype='float32')
output1 = tf.keras.layers.Dense(2)(input1)
model = tf.keras.Model(inputs=input1, outputs=output1)

В некоторых примерах функционального API вывод получается с использованием model (), но есть также model.predict ().

В моем примере выше прогнозирование работает:

model.predict([[[1.1, 2.2]]])
>> array([[1.8761028 , 0.20520687]], dtype=float32)

Если я запускаю только модель, я получаю сообщение об ошибке:

model([[[1.1, 2.2]]])
>> ... InvalidArgumentError: In[0] is not a matrix [Op:MatMul]

В чем разница и почему произошла ошибка?

Спасибо,

Джулиан

1 Ответ

0 голосов
/ 23 февраля 2020

Состояния ошибки model() ожидает матрицу в качестве ввода, где вы предоставили список.

Чтобы решить эту проблему , просто преобразуйте ее в матрицу:

model(tf.Variable([[[1.1, 2.2]]]))

или

model(np.array([[[1.1, 2.2]]]))

О разнице между model() и model.predict()

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

left_proba = model(obs[np.newaxis])              # <--- HERE
action = (tf.random.uniform([1, 1]) > left_proba)
y_target = tf.constant([[1.]]) - tf.cast(action, tf.float32)
loss = tf.reduce_mean(loss_fn(y_target, left_proba))

Это похоже на вашу вторую строчку кода:

output1 = tf.keras.layers.Dense(2)(input1)

Как это похоже, спросите вы?

В вашем коде вы создаете новый узел в графе слоев, вызывая слой Dense для этого объекта input1.
Действие "layer call" как рисование стрелки из input1 к этому слою, который вы создали.
Вы "передаете" входные данные в плотный слой, и вы получаете output1.

В ссылке кода, они обрабатывают model как слой и выполняют "вызов слоя".
Видите сходство?:

output     = Dense(input)
left_proba = model(obs[...])

В свою очередь это создает новые узлы, которые выполняют другие операции ( в 3 строки, которые е ollow).
Это полезно, если вы хотите взять существующую модель и использовать ее в качестве компонента (или «слоя») для построения другой новой модели.

Что касается модель логический вывод , вы всегда будете делать это через y = model.predict(x).

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