Автоэнкодер Keras: потеря при проверке> потеря при обучении - но при тестировании набора данных он работает хорошо - PullRequest
0 голосов
/ 10 октября 2019

В КРАТКОМ ЯЗЫКЕ:

Я обучил автоэнкодер, у которого потери при проверке всегда превышают потери при обучении (см. Прилагаемый рисунок). as - Autoencoder Я думаю, что это сигналпереоснащения. Тем не менее, мой 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()

1 Ответ

3 голосов
/ 11 октября 2019

2) если на самом деле проблема заключается в том, что существует разрыв между обучением и потерей проверки (когда производительность в наборе данных тестирования действительно хорошая).

Это просто разрыв в обобщении , т. Е. Ожидаемый разрыв в производительности между наборами обучения и валидации *1007*;цитата из недавнего сообщения в блоге Google AI :

Важной концепцией для понимания обобщения является разрыв в обобщении , т. е. разница в производительности моделина тренировочных данных и их производительности на невидимых данных, взятых из того же распределения.

.

Я бы подумал, что это сигнал переоснащения. Однако мой автоэнкодер хорошо работает с набором данных тестирования.

Это , а не , но причина не совсем в том, что вы думаете (не говоря уже о том, что "хорошо" - этоочень субъективный термин).

Контрольная подпись переоснащения - это когда ваша потеря при проверке начинает расти, а ваша потеря при обучении продолжает уменьшаться, то есть:

enter image description here

Ваш график не показывает такого поведения;также обратите внимание на разрыв (каламбур) между кривыми на приведенном выше графике (адаптировано из записи Википедии о переоснащении ).

как оно естьвозможно, что потери при проверке намного выше, чем при обучении, несмотря на то, что производительность автоэнкодера хороша в наборе данных тестирования

Здесь абсолютно нет противоречия здесь;обратите внимание, что ваши потери при обучении почти равны нулю, что само по себе не обязательно удивительно, но, безусловно, было бы удивительно, если бы потери при проверке были близки к нулю. И, опять же, «хорошо» - это очень субъективный термин.

Другими словами, ничто в предоставленной вами информации не показывает, что с вашей моделью что-то не так ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...