Как загрузить файл .npy в конвейер tensorflow с помощью tf.data

Я пытаюсь прочитать свои данные X и y из файлов .npy с помощью np.load() в конвейере tf.data. Но получите следующую ошибку, если я позвоню model.fit(). У кого-нибудь есть решение этой проблемы? Я думал, что мне нужно придать форму X_data и y_data для tf.py_funciton. Я использую Tensorflow 2.4.

Ошибка:

Input 0 of layer sequential_13 is incompatible with the layer: expected ndim=3, found ndim=2. Full shape received: (None, None)

Описание:

train_filenames,train_label_filenames — это списки с путями к каждому файлу .npy.

Так что print(train_filenames[0]) показывает 'E:\UserData\Mustermann\02_Data\X_Data\Sample0.npy' , а np.load(train_filenames[0]).shape есть (12, 8002)
np.load(label_filenames[0]).reshape(-1,1).shape есть (1, 1)

Таким образом, одна выборка имеет длину 12 временных шагов и 8002 признака.

Код:

def load_files_py(train_filenames, train_label_filenames):
   
   X_data = np.load(train_filenames)
   label = np.load(train_label_filenames).reshape(-1,1)
   
   return X_data, label, X_data.shape, label.shape
def parse_function(train_filenames, train_label_filenames):
    
    temp = tf.py_function(load_files_py, inp=[train_filenames, train_label_filenames], Tout=[tf.float32, tf.float32, tf.int32, tf.int32])
    X_data = tf.reshape(temp[0], [temp[2]])
    label = tf.reshape(temp[1], [temp[3]])
    return X_data, label
batch_size = 64

train_dataset = tf.data.Dataset.from_tensor_slices((train_filenames,train_label_filenames))
train_dataset = train_dataset.shuffle(len(train_filenames))
train_dataset = train_dataset.map(parse_function, num_parallel_calls=2)
train_dataset = train_dataset.batch(batch_size)
train_dataset = train_dataset.prefetch(1)

test_dataset = tf.data.Dataset.from_tensor_slices((test_filenames,test_label_filenames))
test_dataset = test_dataset.shuffle(len(test_filenames))
test_dataset = test_dataset.map(parse_function, num_parallel_calls=2)
test_dataset = test_dataset.batch(batch_size)
test_dataset = test_dataset.prefetch(1)
model = tf.keras.models.Sequential([
    tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(16, input_shape = (12, 8002), return_sequences=True)),
    tf.keras.layers.LSTM(16),
    tf.keras.layers.Dense(16, activation='relu'),
    tf.keras.layers.Dropout(0.2),
    tf.keras.layers.Dense(8, activation='relu'),
    tf.keras.layers.Dense(4, activation='relu'),
    tf.keras.layers.Dense(1, activation = 'linear')   
]) 
model.compile(optimizer='adam', loss='mse')

EPOCHS =300

early = tf.keras.callbacks.EarlyStopping('val_loss', patience=20)
history = model.fit(train_dataset,
                    epochs=EPOCHS,
                    validation_data = test_dataset)

person Tensorlearner    schedule 14.01.2021    source источник


Ответы (1)


Из того, что я вижу, нет проблем с загрузкой файла .npy, поскольку ошибка предполагает, что есть проблема с моделью.

В вашем первом слое вы используете аргумент return_sequences=True, и это на самом деле проблема. Этот аргумент возвращает вам 3-D Array, что несовместимо со следующим слоем. Я попробую, удалив этот параметр.

person pratsbhatt    schedule 14.01.2021
comment
Спасибо за ваше предложение. Я пробовал, но ошибка остается. Насколько я знаю, мне нужно return_sequences = True, потому что после BiLSTM следует слой LSTM, которому нужно несколько скрытых состояний из слоя BiLSTM. - person Tensorlearner; 15.01.2021
comment
не могли бы вы вставить свой код в Google Colab, чтобы я мог запустить полный код с данными, чтобы выяснить, что может быть причиной этого? трудно судить, не запуская код. - person pratsbhatt; 15.01.2021
comment
Я создал записную книжку, в которой используются образцы данных, в которых существует та же ошибка. colab.research.google.com/drive/ - person Tensorlearner; 18.01.2021