Выведите функцию потерь/стоимости в керасах

Я пытаюсь найти функцию стоимости в Керасе. Я использую LSTM с функцией потерь categorical_crossentropy и добавил регуляризатор. Как мне вывести, как выглядит функция стоимости после моего регуляризатора для моего собственного анализа?

model = Sequential()
model.add(LSTM(
    NUM_HIDDEN_UNITS,
    return_sequences=True,
    input_shape=(PHRASE_LEN, SYMBOL_DIM),
    kernel_regularizer=regularizers.l2(0.01)
    ))
model.add(Dropout(0.3))
model.add(LSTM(NUM_HIDDEN_UNITS, return_sequences=False))
model.add(Dropout(0.3))
model.add(Dense(SYMBOL_DIM))
model.add(Activation('softmax'))
model.compile(loss='categorical_crossentropy',
    optimizer=RMSprop(lr=1e-03, rho=0.9, epsilon=1e-08))

person Mike Manh    schedule 02.02.2018    source источник
comment
Что значит выглядит? Вы пытаетесь просмотреть потери при вызове метода model.fit?   -  person jrjames83    schedule 03.02.2018


Ответы (1)


Как мне вывести, как выглядит функция стоимости после моего регуляризатора для моего собственного анализа?

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

Встречайте Tensorboard.

Это мощный инструмент визуализации, который позволяет отслеживать и визуализировать ваши метрики, выходные данные, архитектуру, инициализацию ядра и т. д. Хорошая новость заключается в том, что уже существует Обратный вызов Tensorboard Keras, который вы можете использовать для этой цели; вам просто нужно импортировать его. Чтобы использовать его, просто передайте экземпляр обратного вызова вашему методу fit, примерно так:

from keras.callbacks import TensorBoard
#indicate folder to save, plus other options
tensorboard = TensorBoard(log_dir='./logs/run1', histogram_freq=1,
    write_graph=True, write_images=False)  

#save it in your callback list
callbacks_list = [tensorboard]
#then pass to fit as callback, remember to use validation_data also
model.fit(X, Y, callbacks=callbacks_list, epochs=64, 
    validation_data=(X_test, Y_test), shuffle=True)

После этого запустите сервер Tensorboard (он работает локально на вашем компьютере), выполнив:

tensorboard --logdir=logs/run1

Например, вот как выглядят мои ядра на двух разных моделях, которые я тестировал (чтобы сравнить их, вам нужно сохранить отдельные прогоны, а затем вместо этого запустить Tensorboard в родительском каталоге). Это на вкладке «Гистограммы» на моем втором слое:

введите здесь описание изображения

Модель слева я инициализировал с помощью kernel_initializer='random_uniform', поэтому ее форма соответствует равномерному распределению. Модель справа справа я инициализировал с помощью kernel_initializer='normal', поэтому она выглядит как распределение Гаусса на протяжении всех моих эпох (около 30).

Таким образом, вы могли бы визуализировать, как «выглядят» ваши ядра и слои, более интерактивным и понятным способом, чем вывод на печать. Это лишь одна из замечательных функций Tensorboard, которая может помочь вам быстрее и лучше разрабатывать модели глубокого обучения.

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

Редактировать: Итак, вы комментируете, что хотите знать, как аналитически "выглядит" ваш урегулированный убыток. Давайте помнить, что, добавляя регуляризатор к функции потерь, мы, по сути, расширяем функцию потерь, чтобы включить в нее некоторый «штраф» или предпочтение. Итак, если вы используете cross_entropy в качестве функции потерь и добавляете регуляризатор l2 (то есть евклидову норму) с весом 0,01, вся ваша функция потерь будет выглядеть примерно так:

введите здесь описание изображения

person DarkCygnus    schedule 02.02.2018
comment
Спасибо, я уже использую tensorboard. Я имел в виду конкретно, как мне вывести то, что представляет собой функция полных потерь, как удобочитаемую функцию своих входов. Обычно cross_entropy — это моя функция потерь, но после добавления регуляризации я получаю странные значения потерь. Например, если бы я использовал только кросс-энтропию, моя потеря выглядела бы так: def loss(yHat, y): if yHat == 1: return -log(y) else: return -log(1 - y) Но поскольку я добавил регуляризацию, я не знаю, как это выглядит. - person Mike Manh; 06.02.2018
comment
@MikeManh хорошо, поэтому, когда вы применяете регуляризацию к своим моделям, вы в основном расширяете свою функцию потерь. Скажем, ваша функция потерь равна cross_entropy, ваша регуляризованная функция потерь будет J(x) = cross_entropy(x) + REG. В этом случае, поскольку вы использовали l2 в качестве регуляризатора с весом 0,01, это будет J(x) = cross_entropy(x) + 0.01*l2(x). Это аналитическая форма, которую теперь имеет ваша функция потерь. Я правильно тебя понял? - person DarkCygnus; 06.02.2018