在此指定解决方案(答案部分),即使它存在于注释部分中,对于社区的利益.
变量,list_of_values
可以被认为是一个Input Variable
like
list_of_values = Input(shape=(1,), name='list_of_values')
并定义Custom Loss function
如下所示:
def sample_loss( y_true, y_pred, list_of_values ) :
return list_of_values * categorical_crossentropy( y_true, y_pred )
还有,同样Global Variable
可以作为输入传递给模型,例如:
model = Model( inputs=[x, y_true, list_of_values], outputs=y_pred, name='train_only' )
示例的完整代码如下所示:
from keras.layers import Input, Dense, Conv2D, MaxPool2D, Flatten
from keras.models import Model
from keras.losses import categorical_crossentropy
def sample_loss( y_true, y_pred, list_of_values ) :
return list_of_values * categorical_crossentropy( y_true, y_pred )
x = Input(shape=(32,32,3), name='image_in')
y_true = Input( shape=(10,), name='y_true' )
list_of_values = Input(shape=(1,), name='list_of_values')
f = Conv2D(16,(3,3),padding='same')(x)
f = MaxPool2D((2,2),padding='same')(f)
f = Conv2D(32,(3,3),padding='same')(f)
f = MaxPool2D((2,2),padding='same')(f)
f = Conv2D(64,(3,3),padding='same')(f)
f = MaxPool2D((2,2),padding='same')(f)
f = Flatten()(f)
y_pred = Dense(10, activation='softmax', name='y_pred' )(f)
model = Model( inputs=[x, y_true, list_of_values], outputs=y_pred, name='train_only' )
model.add_loss( sample_loss( y_true, y_pred, list_of_values ) )
model.compile( loss=None, optimizer='sgd' )
print model.summary()
欲了解更多信息,请参阅此堆栈溢出答案 https://stackoverflow.com/a/50127646/13465258.
希望这可以帮助。快乐学习!