#python #tensorflow #machine-learning #keras #recurrent-neural-network
#python #тензорный поток #машинное обучение #keras #рекуррентная нейронная сеть
Вопрос:
Я пытаюсь снабдить модель RNN .tfrecords
наборами данных (обучить, протестировать), чтобы обучить ее. Но я получаю сообщение об ошибке размера input0.
Я думаю train_data
, что хочет изменить размер до 4 dims, но я не уверен.
Приведенная ниже функция возвращает наборы данных из .tfrecords
с функциями и одной меткой с горячим кодированием.
def get_dataset(directory, num_classes=60, batch_size=32, drop_remainder=False,
shuffle=False, shuffle_size=1000):
# dictionary describing the features.
feature_description = {
'features': tf.io.FixedLenFeature([], tf.string),
'label': tf.io.FixedLenFeature([], tf.int64)
}
# parse each proto and, the features within
def _parse_feature_function(example_proto):
features = tf.io.parse_single_example(example_proto, feature_description)
data = tf.io.parse_tensor(features['features'], tf.float32)
label = tf.one_hot(features['label'], num_classes)
data = tf.reshape(data, (3, 300, 25, 2))
return data, label
records = [os.path.join(directory, file) for file in os.listdir(directory) if file.endswith("tfrecord")]
dataset = tf.data.TFRecordDataset(records, num_parallel_reads=len(records))
dataset = dataset.map(_parse_feature_function)
dataset = dataset.batch(batch_size, drop_remainder=drop_remainder)
dataset = dataset.prefetch(batch_size)
if shuffle:
dataset = dataset.shuffle(shuffle_size)
return dataset
if __name__ == "__main__":
train_data = get_dataset('/TfRecords/xsub/')
test_data = get_dataset('/TfRecords/xview/')
print(train_data)
# create LSTM
verbose, epochs, batch_size = 1, 100, 32
n_features=60
n_length = 32
model = Sequential()
model.add(
TimeDistributed(Conv1D(filters=64, kernel_size=3, activation='relu'), input_shape=(None, n_length, n_features)))
model.add(TimeDistributed(Conv1D(filters=64, kernel_size=3, activation='relu')))
model.add(TimeDistributed(Dropout(0.5)))
model.add(TimeDistributed(MaxPooling1D(pool_size=2)))
model.add(TimeDistributed(Flatten()))
model.add(LSTM(100))
model.add(Dropout(0.5))
model.add(Dense(100, activation='relu'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.summary()
history = model.fit(train_data, epochs=epochs, batch_size=batch_size, verbose=verbose,
validation_data=test_data)
Отображаемая ошибка:
Ошибка значения: ввод 0 последовательного уровня несовместим со слоем: ожидаемый ndim = 4, найденный ndim = 5. Получена полная форма: [Нет, 3, 300, 25, 2]
Комментарии:
1. Не могли бы вы предоставить тестовые и обучающие формы данных?
2. Слой Tensorflow Timedistruted_Conv1D ожидает ввода формы 4D. Измените форму ввода соответствующим образом. Или используйте
TimeDistributed_Conv2D
layer.TimeDistributed(Conv1D)
слой ожидает ввода формы 5D. Для получения дополнительной информации прочитайте эту ссылку . Спасибо!