Почему модель может быть оснащена массивом numpy неправильных размеров в тензорном потоке (2.x)? - PullRequest
0 голосов
/ 16 января 2020

Когда я учусь строить модель с tensorflow.keras.Model (тензор потока. версия = 2.0.0), я компилирую свою модель следующим образом:

import tensorflow as tf
x = tf.keras.layers.Input(shape=(2,))
y = tf.keras.layers.Dense(3, activation='softmax')(x)
model = tf.keras.Model(x,y)
model.compile(
    loss='binary_crossentropy',
    optimizer=tf.keras.optimizers.Adam(1e-4),
    metrics=['accuracy']
)

Когда я нужно использовать model.fit метод, я делаю несколько попыток:

Попытка 1:

model.fit(
    x=[[1,1],[2,2]],
    y=[[1,1,1],[2,2,2]],
    epochs=3
)

Это должно быть правильно, и поэтому результат выполнения будет.

Попытка 2:

model.fit(
    x=[[1,1],[2,2]],
    y=[[1,1],[2,2]],
    epochs=3
)

Этот код должен обработать ошибку, поскольку размеры переменной y не могут адаптироваться к выводу модели, и я получил ошибку ValueError, например Dimensions must be equal, but are 2 and 3 for 'loss/dense_loss/mul' (op: 'Mul') with input shapes: [?,2], [?,3]. Это все так же, как и ожидалось.

Попытка 3:

model.fit(
    x=[[1,1],[2,2]],
    y=[[1],[2]],
    epochs=3
)

Так что я думаю, что этот код также должен выдавать ошибку, как Attempt 2, но почему модель может быть оснащена такими данные тренировки? и чему научилась модель?

1 Ответ

0 голосов
/ 16 января 2020

Я попытался запустить ваш код из "Попытки 3" и получил ошибку, используя tensorflow==2.1.0-rc1:

import tensorflow as tf
print(tf.__version__)
x = tf.keras.layers.Input(shape=(2,))
y = tf.keras.layers.Dense(3, activation='softmax')(x)
model = tf.keras.Model(x,y)
model.compile(
    loss='binary_crossentropy',
    optimizer=tf.keras.optimizers.Adam(1e-4),
    metrics=['accuracy']
)
model.fit(
    x=[[1,1],[2,2]],
    y=[[1],[2]],
    epochs=3
)
2.1.0-rc1
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-7-ab313c8f2b57> in <module>()
     12     x=[[1,1],[2,2]],
     13     y=[[1,1],[2,2]],
---> 14     epochs=3
     15 )

7 frames
/tensorflow-2.1.0/python3.6/tensorflow_core/python/keras/engine/training_utils.py in check_loss_and_target_compatibility(targets, loss_fns, output_shapes)
    808           raise ValueError('A target array with shape ' + str(y.shape) +
    809                            ' was passed for an output of shape ' + str(shape) +
--> 810                            ' while using as loss `' + loss_name + '`. '
    811                            'This loss expects targets to have the same shape '
    812                            'as the output.')

ValueError: A target array with shape (2, 2) was passed for an output of shape (None, 3) while using as loss `binary_crossentropy`. This loss expects targets to have the same shape as the output.

Я удивлен, что это позволит вам обучиться другой версии tf2- - для модели не имеет смысла иметь выходной слой с размерами, отличными от вашего класса. Можете ли вы уточнить вывод, который вы получаете из своей «Попытки 3» (возможно, поделитесь колабом)?

Может быть, это связано с вашим выбором функции потери? BinaryCrossentropy следует использовать, когда есть только два класса меток (предполагается, что это 0 и 1), которые обычно ассоциируются с одним выходом (например, Dense(1)). Другими словами, для каждого примера в прогнозе должно быть одно значение с плавающей запятой.

Возможно, вы сможете получить модель для компиляции и подгонки ваших данных из вашей Попытки три, если используете sparse_categorical_crossentropy:

model.compile(
    loss='sparse_categorical_crossentropy',
    optimizer=tf.keras.optimizers.Adam(1e-4),
    metrics=['accuracy']
)

На данный момент ваша потеря не соответствует вашим выходным размерам.

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