При настройке простого теста тензорного потока 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 вВо-первых, теперь все так просто, что у меня нет идей, почему он не просто работает (и делает (почти) то же самое, что и версия с массивами).