Использование tf.data.Dataset с входным слоем Keras в Tensorflow 2.0 - PullRequest
1 голос
/ 03 мая 2019

Я экспериментирую с альфа-версией TensorFlow 2.0 и обнаружил, что она работает, как и ожидалось, при использовании массивов Numpy, но при использовании tf.data.Dataset появляется ошибка входного размера. Я использую набор данных iris в качестве простейшего примера, чтобы продемонстрировать это:

from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler, OneHotEncoder

import tensorflow as tf
from tensorflow.python import keras

iris = datasets.load_iris()

scl = StandardScaler()
ohe = OneHotEncoder(categories='auto')
data_norm = scl.fit_transform(iris.data)
data_target = ohe.fit_transform(iris.target.reshape(-1,1)).toarray()
train_data, val_data, train_target, val_target = train_test_split(data_norm, data_target, test_size=0.1)
train_data, test_data, train_target, test_target = train_test_split(train_data, train_target, test_size=0.2)


train_dataset = tf.data.Dataset.from_tensor_slices((train_data, train_target))
train_dataset.batch(32)

test_dataset = tf.data.Dataset.from_tensor_slices((test_data, test_target))
test_dataset.batch(32)

val_dataset = tf.data.Dataset.from_tensor_slices((val_data, val_target))
val_dataset.batch(32)

mdl = keras.Sequential([
    keras.layers.Dense(16, input_dim=4, activation='relu'),
    keras.layers.Dense(8, activation='relu'),
    keras.layers.Dense(8, activation='relu'),
    keras.layers.Dense(3, activation='sigmoid')]
)

mdl.compile(
    optimizer=keras.optimizers.Adam(0.01),
    loss=keras.losses.categorical_crossentropy,
    metrics=[keras.metrics.categorical_accuracy]
    )

history = mdl.fit(train_dataset, epochs=10, steps_per_epoch=15, validation_data=val_dataset)

и я получаю следующую ошибку:

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

при условии, что набор данных имеет только одно измерение. Если я передаю input_dim = 1, я получаю другую ошибку:

InvalidArgumentError: Incompatible shapes: [3] vs. [4]
     [[{{node metrics_5/categorical_accuracy/Equal}}]] [Op:__inference_keras_scratch_graph_8223]

Как правильно использовать tf.data.Dataset на модели Keras с Tensorflow 2.0?

1 Ответ

2 голосов
/ 03 мая 2019

Несколько изменений должны исправить ваш код.Преобразование набора данных batch() не происходит на месте, поэтому вам необходимо вернуть новые наборы данных.Во-вторых, вы также должны добавить преобразование repeat(), чтобы набор данных продолжал выводить примеры после просмотра всех данных.

...

train_dataset = tf.data.Dataset.from_tensor_slices((train_data, train_target))
train_dataset = train_dataset.batch(32)
train_dataset = train_dataset.repeat()

val_dataset = tf.data.Dataset.from_tensor_slices((val_data, val_target))
val_dataset = val_dataset.batch(32)
val_dataset = val_dataset.repeat()
...

Вам также необходимо добавить аргумент для validation_steps вфункция model.fit():

history = mdl.fit(train_dataset, epochs=10, steps_per_epoch=15, validation_data=val_dataset, validation_steps=1)

Для ваших собственных данных вам может потребоваться настроить batch_size для набора данных проверки и validation_steps, чтобы данные проверки периодически повторялись на каждом этапе.

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