Форма данных набора данных tenorflow в кератах (tenenflow 2.0) неверна после преобразования из массива np - PullRequest
2 голосов
/ 12 апреля 2019

При настройке простого теста тензорного потока 2.0 после данного руководства ввод во входной слой keras неправильный, но только после преобразования в набор данных (который претендует на правильную форму).

Запуск ноутбука colab из документации, конечно, работает, но я не могу понять, что может быть не так с моей настройкой.Любые советы приветствуются!

Настройка некоторых поддельных данных в лаборатории jupyter:

data = np.random.random((1000, 32,))
labels = np.random.random((1000, 10,))

dataset = tf.data.Dataset.from_tensor_slices((data, labels))
dataset.shuffle(buffer_size=1024).batch(32)

>> <BatchDataset shapes: ((None, 32), (None, 10)), types: (tf.float64, tf.float64)>

Создание упрощенной модели с помощью API-интерфейса keras (последовательное не имеет значения):

inputs = keras.Input(shape=(32,))
hidden = keras.layers.Dense(64, activation='relu')(inputs)
hidden = keras.layers.Dense(64, activation='relu')(hidden)
output = keras.layers.Dense(10, activation='softmax')(hidden)

model = keras.Model(inputs=inputs, outputs=output)
model.compile(loss='mse',
              optimizer=keras.optimizers.Adam(0.001),
              metrics=['mae'])

Запуск подгонки модели к массивам-пустышкам работает, как и ожидалось:

model.fit(data, labels, epochs=10, batch_size=32)

>> Epoch 1/10
>> 1000/1000 [==============================] - 0s 124us/sample - loss: 0.2472 - mae: 0.4143
[...]
>> Epoch 10/10
>> 1000/1000 [==============================] - 0s 32us/sample - loss: 0.2451 - mae: 0.4132

Что не работает, так это подгонка к набору данных (в то время как пример документации / колаба):

model.fit(dataset, epochs=10, steps_per_epoch=10)

Который бросает ValueError на входную форму, которая, по-видимому, (1,):

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-6-9b010c729342> in <module>
----> 1 model.fit(dataset, epochs=10, steps_per_epoch=10)

~/venvs/tf/lib/python3.6/site-packages/tensorflow/python/keras/engine/training.py in fit(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, validation_freq, max_queue_size, workers, use_multiprocessing, **kwargs)
    789           workers=0,
    790           shuffle=shuffle,
--> 791           initial_epoch=initial_epoch)
    792 
    793     # Case 3: Symbolic tensors or Numpy array-like.

~/venvs/tf/lib/python3.6/site-packages/tensorflow/python/keras/engine/training.py in fit_generator(self, generator, steps_per_epoch, epochs, verbose, callbacks, validation_data, validation_steps, validation_freq, class_weight, max_queue_size, workers, use_multiprocessing, shuffle, initial_epoch)
   1513         shuffle=shuffle,
   1514         initial_epoch=initial_epoch,
-> 1515         steps_name='steps_per_epoch')
   1516 
   1517   def evaluate_generator(self,

~/venvs/tf/lib/python3.6/site-packages/tensorflow/python/keras/engine/training_generator.py in model_iteration(model, data, steps_per_epoch, epochs, verbose, callbacks, validation_data, validation_steps, validation_freq, class_weight, max_queue_size, workers, use_multiprocessing, shuffle, initial_epoch, mode, batch_size, steps_name, **kwargs)
    255 
    256       is_deferred = not model._is_compiled
--> 257       batch_outs = batch_function(*batch_data)
    258       if not isinstance(batch_outs, list):
    259         batch_outs = [batch_outs]

~/venvs/tf/lib/python3.6/site-packages/tensorflow/python/keras/engine/training.py in train_on_batch(self, x, y, sample_weight, class_weight, reset_metrics)
   1236     x, y, sample_weights = self._standardize_user_data(
   1237         x, y, sample_weight=sample_weight, class_weight=class_weight,
-> 1238         extract_tensors_from_dataset=True)
   1239 
   1240     if self.run_eagerly:

~/venvs/tf/lib/python3.6/site-packages/tensorflow/python/keras/engine/training.py in _standardize_user_data(self, x, y, sample_weight, class_weight, batch_size, check_steps, steps_name, steps, validation_split, shuffle, extract_tensors_from_dataset)
   2594           feed_input_shapes,
   2595           check_batch_axis=False,  # Don't enforce the batch size.
-> 2596           exception_prefix='input')
   2597 
   2598     if y is not None:

~/venvs/tf/lib/python3.6/site-packages/tensorflow/python/keras/engine/training_utils.py in standardize_input_data(data, names, shapes, check_batch_axis, exception_prefix)
    347                              ': expected ' + names[i] + ' to have shape ' +
    348                              str(shape) + ' but got array with shape ' +
--> 349                              str(data_shape))
    350   return data
    351 

ValueError: Error when checking input: expected input_1 to have shape (32,) but got array with shape (1,)

Это самая простая сжатая версия после обнаружения ошибки с более сложными моделями и нового пакета tenorflow-datasets вВо-первых, теперь все так просто, что у меня нет идей, почему он не просто работает (и делает (почти) то же самое, что и версия с массивами).

1 Ответ

4 голосов
/ 12 апреля 2019

Вы кормите модель объектом dataset, который вы создали на линии

dataset = tf.data.Dataset.from_tensor_slices((data, labels))

Это набор данных из 1000 пар (32, 10) каждая.

Следующая строка

dataset.shuffle(buffer_size=1024).batch(32)

Создает набор данных, который создает пакеты с формой (32, 32, 10), но вы никогда не назначали его переменной dataset (tf.data.Dataset были разработаны для использования цепочки методов, они генерируют новый набор данных и не изменяют набор данных на месте ).

Следовательно, вы можете решить, переписав переменную набора данных

dataset = dataset.shuffle(buffer_size=1024).batch(32)
...