В настоящее время я экспериментирую с генеративными состязательными сетями в Керасе. Как предлагается в этой статье, я хочу использовать функцию исторических усредненных потерь. То есть я хочу наказать за изменение весов сети. Я не знаю, как это грамотно реализовать.
Я реализовал пользовательскую функцию потерь в соответствии с ответом на this пост.
def historical_averaging_wrapper(current_weights, prev_weights):
def historical_averaging(y_true, y_pred):
diff = 0
for i in range(len(current_weights)):
diff += abs(np.sum(current_weights[i]) + np.sum(prev_weights[i]))
return K.binary_crossentropy(y_true, y_pred) + diff
return historical_averaging
Веса сети штрафуются, и веса меняются после каждого пакета данных.
Моя первая идея заключалась в том, чтобы обновлять функцию потерь после каждой партии. Примерно так:
prev_weights = model.get_weights()
for i in range(len(data)/batch_len):
current_weights = model.get_weights()
model.compile(loss=historical_averaging_wrapper(current_weights, prev_weights), optimizer='adam')
model.fit(training_data[i*batch_size:(i+1)*batch_size], training_labels[i*batch_size:(i+1)*batch_size], epochs=1, batch_size=batch_size)
prev_weights = current_weights
Это разумно? На мой взгляд, такой подход кажется немного «запутанным». Есть ли еще возможность сделать это «поумнее»? Например, обновить функцию потерь в генераторе данных и использовать fit_generator ()? Заранее спасибо.