我目前正在Keras试验生成性对抗网络。 正如在this论文中提出的,我想使用历史平均损失函数。意思是我想惩罚网络权重的变化。 我不知道如何巧妙地实施它。你知道吗
我是根据thispost的答案实现自定义loss函数的。你知道吗
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
这合理吗?在我看来,这种方法似乎有点“混乱”。 有没有另一种可能以“更聪明”的方式做到这一点? 比如在数据生成器中更新loss函数并使用fit_generator()? 提前谢谢。你知道吗
损失函数是使用张量对图进行的运算。 可以在loss函数中定义其他张量来保存以前的值。这是一个例子:
变量
prev_weights
保存前面的值。注意,我们在计算权重误差之后添加了K.update
操作。你知道吗用于测试的样本模型:
一些测试数据和目标函数:
在我的测试中,模型损耗随着时间的推移而减少。你知道吗
相关问题 更多 >
编程相关推荐