簡體   English   中英

在Keras中為模型編譯指定多重損失函數

[英]Specify multiple loss function for model compilation in Keras

我想為交叉熵的對象類指定2個損失函數,為邊界均方誤差的邊界框指定2個損失函數。 如何指定在model.compile每個輸出與相應的損失函數?

model = Sequential()

model.add(Dense(128, activation='relu'))
out_last_dense = model.add(Dense(128, activation='relu'))
object_type = model.add(Dense(1, activation='softmax'))(out_last_dense)
object_coordinates = model.add(Dense(4, activation='softmax'))(out_last_dense)

/// here is the problem i want to specify loss function for object type and coordinates
model.compile(loss= keras.losses.categorical_crossentropy,
   optimizer= 'sgd', metrics=['accuracy'])

首先,由於模型有兩個輸出層,因此不能在這里使用Sequential API(即,您編寫的內容都是錯誤的,並且會引發錯誤)。 相反,您必須使用Keras Functional API

inp = Input(shape=...)
x = Dense(128, activation='relu')(inp)
x = Dense(128, activation='relu')(x)
object_type = Dense(1, activation='sigmoid', name='type')(x)
object_coordinates = Dense(4, activation='linear', name='coord')(x)

現在,您可以根據上面給出的名稱並使用字典為每個輸出層指定損失函數(以及度量):

model.compile(loss={'type': 'binary_crossentropy', 'coord': 'mse'}, 
              optimizer='sgd', metrics={'type': 'accuracy', 'coord': 'mae'})

此外,請注意,您正在使用softmax作為激活函數,並且在上面將其更改為sigomidlinear 這是因為:1)在具有一個單位的層上使用softmax沒有意義(如果有兩個以上的類,則應使用softmax),並且2)另一層預測坐標,因此使用softmax根本不適合(除非問題表述允許您這樣做)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM