В КРАТКОМ ЯЗЫКЕ:
Я обучил автоэнкодер, у которого потери при проверке всегда превышают потери при обучении (см. Прилагаемый рисунок). Я думаю, что это сигналпереоснащения. Тем не менее, мой Autoencoder хорошо работает на тестовом наборе данных. Мне было интересно, если:
1) со ссылкой на архитектуру сети, представленную ниже, кто-нибудь может дать представление о том, как уменьшить потери при проверке (и как возможно, что потери при проверке намного выше, чемобучающий, несмотря на то, что производительность автоэнкодера хороша для набора данных тестирования);
2) если действительно существует проблема, что существует разрыв между обучением и потерей проверки (когда производительность в наборе данных тестирования)на самом деле хорошо).
ДЕТАЛИ:
Я кодировал свой глубокий автоэнкодер в Керасе (код ниже). Архитектура 2001 (входной слой) - 1000 - 500 - 200 - 50 - 200 - 500 - 1000 - 2001 (выходной уровень). Мои образцы являются 1d функциями времени. Каждый из них имеет компоненты времени 2001 года. У меня 2000 образцов, которые я разделил на 1500 для обучения, 500 для тестирования. Из 1500 обучающих образцов 20% из них (т.е. 300) используются в качестве проверочного набора. Я нормализую тренировочный набор, удаляя среднее значение и деля его на стандартное отклонение. Я также использую среднее и стандартное отклонение обучающего набора данных для нормализации тестового набора данных.
Я тренирую Автоэнкодер, используя оптимизатор Adamax и среднеквадратическую ошибку как функцию потерь.
from tensorflow.keras.layers import Input, Dense, Dropout
from tensorflow.keras.models import Model
from tensorflow.keras import optimizers
import numpy as np
import copy
# data
data = # read my input samples. They are 1d functions of time and I have 2000 of them.
# Each function has 2001 time components
# shuffling data before training
import random
random.seed(4)
random.shuffle(data)
# split training (1500 samples) and testing (500 samples) dataset
X_train = data[:1500]
X_test = data[1500:]
# normalize training and testing set using mean and std deviation of training set
X_mean = X_train.mean()
X_train -= X_mean
X_std = X_train.std()
X_train /= X_std
X_test -= X_mean
X_test /= X_std
### MODEL ###
# Architecture
# input layer
input_shape = [X_train.shape[1]]
X_input = Input(input_shape)
# hidden layers
x = Dense(1000, activation='tanh', name='enc0')(X_input)
encoded = Dense(500, activation='tanh', name='enc1')(x)
encoded_2 = Dense(200, activation='tanh', name='enc2')(encoded)
encoded_3 = Dense(50, activation='tanh', name='enc3')(encoded_2)
decoded_2 = Dense(200, activation='tanh', name='dec2')(encoded_3)
decoded_1 = Dense(500, activation='tanh', name='dec1')(decoded_2)
x2 = Dense(1000, activation='tanh', name='dec0')(decoded_1)
# output layer
decoded = Dense(input_shape[0], name='out')(x2)
# the Model
model = Model(inputs=X_input, outputs=decoded, name='autoencoder')
# optimizer
opt = optimizers.Adamax()
model.compile(optimizer=opt, loss='mse', metrics=['acc'])
print(model.summary())
###################
### TRAINING ###
epochs = 1000
# train the model
history = model.fit(x = X_train, y = X_train,
epochs=epochs,
batch_size=100,
validation_split=0.2) # using 20% of training samples for validation
# Testing
prediction = model.predict(X_test)
for i in range(len(prediction)):
prediction[i] = np.multiply(prediction[i], X_std) + X_mean
loss = history.history['loss']
val_loss = history.history['val_loss']
epochs = range(epochs)
plt.figure()
plt.plot(epochs, loss, 'bo', label='Training loss')
plt.plot(epochs, val_loss, 'b', label='Validation loss')
plt.title('Training and validation loss')
plt.legend()
plt.show()
plt.close()