在keras中,我想自定义我的损失函数,它不仅需要(y_true,y_pred)作为输入,还需要使用网络内层的输出作为输出图层的标签。这张图片显示了Network Layout
这里,内部输出是xn,它是一维特征向量。在右上角,输出是xn',这是xn的预测。换句话说,xn是xn'的标签。
虽然[Ax,Ay]传统上称为y_true,[Ax',Ay']是y_pred。
我想将这两个损失组件合并为一个并联合训练网络。
非常感谢任何想法或想法!
答案 0 :(得分:10)
我已找到出路,如果有人正在搜索相同内容,我在这里发布(基于此帖中给出的网络):
这个想法是定义自定义损失函数并将其用作网络的输出。 (符号:A
是变量A
的真实标签,A'
是变量A
的预测值
def customized_loss(args):
#A is from the training data
#S is the internal state
A, A', S, S' = args
#customize your own loss components
loss1 = K.mean(K.square(A - A'), axis=-1)
loss2 = K.mean(K.square(S - S'), axis=-1)
#adjust the weight between loss components
return 0.5 * loss1 + 0.5 * loss2
def model():
#define other inputs
A = Input(...) # define input A
#construct your model
cnn_model = Sequential()
...
# get true internal state
S = cnn_model(prev_layer_output0)
# get predicted internal state output
S' = Dense(...)(prev_layer_output1)
# get predicted A output
A' = Dense(...)(prev_layer_output2)
# customized loss function
loss_out = Lambda(customized_loss, output_shape=(1,), name='joint_loss')([A, A', S, S'])
model = Model(input=[...], output=[loss_out])
return model
def train():
m = model()
opt = 'adam'
model.compile(loss={'joint_loss': lambda y_true, y_pred:y_pred}, optimizer = opt)
# train the model
....
答案 1 :(得分:0)
首先,您应该使用Functional API。然后你应该将网络输出定义为输出加上内部层的结果,将它们合并为单个输出(通过连接),然后创建一个自定义丢失函数,然后将合并的输出分成两部分并进行损失计算独自一人。
类似的东西:
def customLoss(y_true, y_pred):
#loss here
internalLayer = Convolution2D()(inputs) #or other layers
internalModel = Model(input=inputs, output=internalLayer)
tmpOut = Dense(...)(internalModel)
mergedOut = merge([tmpOut, mergedOut], mode = "concat", axis = -1)
fullModel = Model(input=inputs, output=mergedOut)
fullModel.compile(loss = customLoss, optimizer = "whatever")
答案 2 :(得分:0)
对于此实现,我有所保留。在合并层计算出的损失将传播回两个合并分支。通常,您只希望将其传播到一层。