训练ANN进行回归时,Keras将训练/验证损失存储在History object中。对于在最后一层具有<{3}}的多个输出,即均方误差或MSE:
任何提示将不胜感激。
编辑------------
model = Sequential()
model.add(LSTM(10, input_shape=(train_X.shape[1], train_X.shape[2])))
model.add(Dense(2))
model.compile(loss='mse', optimizer='adam')
添加摘录后重新表达我的问题:
在输出层中有两个神经元的情况下,如何计算损失?所产生的损失代表什么?是两个输出的平均损失吗?
答案 0 :(得分:0)
标准的MSE损失在Keras中实现如下:
def mse_loss(y_true, y_pred):
return K.mean(K.square(y_pred - y_true), axis=-1)
如果您现在在输出层有多个神经元,则计算的损失将只是所有单个神经元损失平方的均值。
如果要跟踪每个输出的损失,则必须为此编写自己的度量。如果您想使其尽可能简单,则可以使用以下度量(由于Keras仅允许度量输入y_true和y_pred,因此必须嵌套):
def inner_part_custom_metric(y_true, y_pred, i):
d = y_pred-y_true
square_d = K.square(d)
return square_d[:,i] #y has shape [batch_size, output_dim]
def custom_metric_output_i(i):
def custom_metric_i(y_true, y_pred):
return inner_part_custom_metric(y_true, y_pred, i)
return custom_metric_i
现在,假设您有2个输出神经元。创建此指标的2个实例:
metrics = [custom_metric_output_i(0), custom_metric_output_i(1)]
然后按如下所示编译模型:
model = ...
model.compile(loss='mean_squared_error', optimizer=SGD(lr=0.01), metrics=metrics)
history = model.fit(...)
现在,您可以访问历史对象中每个神经元的丢失。使用以下命令查看历史对象中的内容:
print(history.history.keys())
答案 1 :(得分:0)
print(history.history.keys())
然后:
print(history.history['custom_metric_i'])
如前所述,实际上只会打印一维的历史记录!