Как использовать Tensorflow 2 Dataset API с Keras? - PullRequest
0 голосов
/ 16 марта 2020

Ответ на этот вопрос для Tensorflow 1, например: Как правильно объединить API набора данных TensorFlow и Keras? , но этот ответ не помог в моем случае использования.

Ниже пример модели с тремя входами float32 и одним выходом float32. У меня есть большой объем данных, которые не все помещаются в память одновременно, поэтому они разбиты на отдельные файлы. Я пытаюсь использовать API набора данных для обучения модели путем одновременного ввода части обучающих данных.

import tensorflow as tf
import tensorflow.keras.layers as layers
import numpy as np

# Create TF model of a given architecture (number of hidden layers, layersize, #outputs, activation function)
def create_model(h=2, l=64, activation='relu'):
    model = tf.keras.Sequential([
        layers.Dense(l, activation=activation, input_shape=(3,), name='input_layer'),
        *[layers.Dense(l, activation=activation) for _ in range(h)],
        layers.Dense(1, activation='linear', name='output_layer')])
    return model

# Load data (3 X variables, 1 Y variable) split into 5 files
# (for this example, just create a list 5 numpy arrays)
list_of_training_datasets = [np.random.rand(10,4).astype(np.float32) for _ in range(5)]
validation_dataset = np.random.rand(30,4).astype(np.float32)

def data_generator():
    for data in list_of_training_datasets:
        x_data = data[:, 0:3]
        y_data = data[:, 3:4]
        yield((x_data,y_data))

# prepare model
model = create_model(h=2,l=64,activation='relu')
model.compile(loss='mse', optimizer=tf.keras.optimizers.Adam())

# load dataset
dataset = tf.data.Dataset.from_generator(data_generator,(np.float32,np.float32))

# fit model
model.fit(dataset, epochs=100, validation_data=(validation_dataset[:,0:3],validation_dataset[:,3:4]))

При выполнении этого я получаю ошибку:

ValueError: Невозможно принять длину фигуры с неизвестным рангом.

Кто-нибудь знает, как заставить это работать? Я также хотел бы иметь возможность использовать размер пакета, чтобы загружать два файла данных одновременно, например.

Ответы [ 2 ]

0 голосов
/ 17 марта 2020

Следующее работает, но я не знаю, является ли это наиболее эффективным.

Насколько я понимаю, если ваш тренировочный набор данных разбит на 10 частей, тогда вы должны установить steps_per_epoch = 10. Это гарантирует, что каждая эпоха будет проходить все данные один раз. Насколько я понимаю, dataset.repeat() необходим, потому что итератор набора данных «используется» после первой эпохи. .repeat() обеспечивает повторное создание итератора после его использования.

import numpy as np
import tensorflow.keras.layers as layers
import tensorflow as tf

# Create TF model of a given architecture (number of hidden layers, layersize, #outputs, activation function)
def create_model(h=2, l=64, activation='relu'):
    model = tf.keras.Sequential([
        layers.Dense(l, activation=activation, input_shape=(3,), name='input_layer'),
        *[layers.Dense(l, activation=activation) for _ in range(h)],
        layers.Dense(1, activation='linear', name='output_layer')])
    return model

# Load data (3 X variables, 1 Y variable) split into 5 files
# (for this example, just create a list 5 numpy arrays)
list_of_training_datasets = [np.random.rand(10,4).astype(np.float32) for _ in range(5)]
steps_per_epoch = len(list_of_training_datasets)
validation_dataset = np.random.rand(30,4).astype(np.float32)

def data_generator():
    for data in list_of_training_datasets:
        x_data = data[:, 0:3]
        y_data = data[:, 3:4]
        yield((x_data,y_data))

# prepare model
model = create_model(h=2,l=64,activation='relu')
model.compile(loss='mse', optimizer=tf.keras.optimizers.Adam())

# load dataset
dataset = tf.data.Dataset.from_generator(data_generator,output_types=(np.float32,np.float32),
                output_shapes=(tf.TensorShape([None,3]), tf.TensorShape([None,1]))).repeat()

# fit model
model.fit(dataset.as_numpy_iterator(), epochs=10,steps_per_epoch=steps_per_epoch,
          validation_data=(validation_dataset[:,0:3],validation_dataset[:,3:4]))
0 голосов
/ 16 марта 2020

Вам необходимо указать формы набора данных вместе с типами возвращаемых данных, как этот.

dataset = tf.data.Dataset.from_generator(data_generator,
                                         (np.float32,np.float32),
                                         ((None, 3), (None, 1)))
...