中间层可以直接在 keras 损失函数中访问吗?
Can intermediate layers be accessed directly within keras loss function?
我很好奇损失函数是否可以在 keras 中实现中间层输出,而无需设计模型将中间层作为输出提供。我看到一个解决方案可以是将架构重新设计为 return 除了最终预测之外的中间层并将其用作解决方法,但我不清楚是否可以直接从损失函数访问层输出
I'm unclear whether a layer output can be accessed directly from a loss function
当然可以。
举个例子,考虑使用函数 API:
的这个模型
inp = keras.layers.Input(shape=(28, 28))
flat = keras.layers.Flatten()(inp)
dense = keras.layers.Dense(128, activation=tf.nn.relu)(flat)
out = keras.layers.Dense(10, activation=tf.nn.softmax)(dense)
model = keras.models.Model(inputs=inp, outputs=out )
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
如果,比如说,我们想引入一个新的损失函数,它也会对我们的 dense
层输出的最大权重进行惩罚,那么我们可以编写一个自定义损失函数,如下所示:
def my_funky_loss_fn(y_true, y_pred):
return (keras.losses.sparse_categorical_crossentropy(y_true, y_pred)
+ keras.backend.max(dense))
我们只需将新的损失函数传递给 compile()
方法即可在我们的模型中使用它:
model.compile(optimizer='adam',
loss=my_funky_loss_fn,
metrics=['accuracy'])
我很好奇损失函数是否可以在 keras 中实现中间层输出,而无需设计模型将中间层作为输出提供。我看到一个解决方案可以是将架构重新设计为 return 除了最终预测之外的中间层并将其用作解决方法,但我不清楚是否可以直接从损失函数访问层输出
I'm unclear whether a layer output can be accessed directly from a loss function
当然可以。
举个例子,考虑使用函数 API:
的这个模型inp = keras.layers.Input(shape=(28, 28))
flat = keras.layers.Flatten()(inp)
dense = keras.layers.Dense(128, activation=tf.nn.relu)(flat)
out = keras.layers.Dense(10, activation=tf.nn.softmax)(dense)
model = keras.models.Model(inputs=inp, outputs=out )
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
如果,比如说,我们想引入一个新的损失函数,它也会对我们的 dense
层输出的最大权重进行惩罚,那么我们可以编写一个自定义损失函数,如下所示:
def my_funky_loss_fn(y_true, y_pred):
return (keras.losses.sparse_categorical_crossentropy(y_true, y_pred)
+ keras.backend.max(dense))
我们只需将新的损失函数传递给 compile()
方法即可在我们的模型中使用它:
model.compile(optimizer='adam',
loss=my_funky_loss_fn,
metrics=['accuracy'])