Ответ на этот вопрос для 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: Невозможно принять длину фигуры с неизвестным рангом.
Кто-нибудь знает, как заставить это работать? Я также хотел бы иметь возможность использовать размер пакета, чтобы загружать два файла данных одновременно, например.