Tf.Dataset с Keras, возвращающим ValueError - PullRequest
0 голосов
/ 07 июня 2019

Получение значения ValueError, связанного с формой, при передаче набора данных Tensorflow в функцию Keas's model.fit.

X_train моего набора данных имеет форму (100 выборок x 62 объектов), а Y_train - (100 выборок x 1 метка

Воспроизводимый код ниже:

import numpy as np
from tensorflow.keras import layers, Sequential, optimizers
from tensorflow.data import Dataset

num_samples = 100
num_features = 62
num_labels = 1
batch_size = 32
steps_per_epoch = int(num_samples/batch_size)

X_train = np.random.rand(num_samples,num_features)
Y_train = np.random.rand(num_samples, num_labels)

final_dataset = Dataset.from_tensor_slices((X_train, Y_train))

model = Sequential()
model.add(layers.Dense(256, activation='relu',input_shape=(num_features,)))
model.add(layers.Dense(128, activation='relu'))
model.add(layers.Dense(num_labels, activation='softmax'))
model.compile(optimizer=optimizers.Adam(0.001), loss='categorical_crossentropy',metrics=['accuracy'])

history = model.fit(final_dataset,epochs=10,batch_size=batch_size,steps_per_epoch = steps_per_epoch)

Ошибка:

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

Почему плотность_производителя получает массив с формой (1,)? Я четко передаю егоX_train формы (n_samples, n_features).

Интересно, что ошибка исчезла, если бы я применил пакетную функцию (некоторое число) к набору данных, но, похоже, я что-то упустил.

1 Ответ

0 голосов
/ 08 июня 2019

Это предполагаемое поведение.

Когда вы используете набор данных Tensorflow, вы не должны указывать batch_size в методе подгонки 'Model'. Вместо этого, как вы упомянули, вы должны генерировать пакеты, используя функцию с набором данных tenorflow.

Как указано здесь в документации

batch_size: целое число или нет. Количество образцов на обновление градиента. Если не указано, batch_size по умолчанию будет 32. Не указывайте batch_size, если ваши данные представлены в виде символических тензоров, наборов данных, итераторов набора данных, генераторов или keras.utils.Sequence (так как они генерируют пакеты) .

Следовательно, классическое поведение - поступать так же, как вы: генерировать пакеты с набором данных.
Также используйте repeat, если вы хотите выполнить несколько эпох. На стороне .fit вам нужно будет указать steps_per_epoch, чтобы указать, сколько партий составляет одна эпоха, и epochs для вашего числа эпох.

...