在TensorFlow 2中在损失函数中使用中间层的输出

我在学习TensorFlow 2的过程中,尝试复制OpenPose的训练过程,但为了实现这一点,我需要在损失函数中使用S、L中间层的输出。

我尝试使用函数式API,但似乎无法获取S/L层的输出以便在所需的损失函数中使用。我能看到通过子类化可能实现这一点,但这会增加复杂性,并且不利于调试。在我当前的学习阶段,调试和易用性可能是非常重要的优势。

有什么方法可以使用函数式API或顺序模型来构建这种类型的模型吗?

enter image description here


回答:

是的,函数式和顺序的Keras模型都支持这种操作。你可以传递一个包含层名称为键和损失函数为值的dict。下面是一个展示这种方法的代码示例。

如果你想从头开始构建模型,你可以简单地将层添加为模型的输出之一。

import tensorflow as tfimg = tf.keras.Input([128, 128, 3], name='image')conv_1 = tf.keras.layers.Conv2D(16, 3, 1, name='conv_1')(img)conv_2 = tf.keras.layers.Conv2D(16, 3, 1, name='conv_2')(conv_1)conv_3 = tf.keras.layers.Conv2D(16, 3, 1, name='conv_3')(conv_2)conv_4 = tf.keras.layers.Conv2D(16, 3, 1, name='conv_4')(conv_3)conv_5 = tf.keras.layers.Conv2D(16, 3, 1, name='conv_5')(conv_4)avg_pool = tf.keras.layers.GlobalAvgPool2D(name='avg_pool')(conv_5)output = tf.keras.layers.Dense(1, activation='sigmoid')(avg_pool)model = tf.keras.Model(inputs=[img], outputs=[output, conv_5])print(model.outputs)

输出:

[<tf.Tensor 'dense/Sigmoid:0' shape=(None, 1) dtype=float32>,<tf.Tensor 'conv_5/BiasAdd:0' shape=(None, 118, 118, 16) dtype=float32>]

但如果你正在使用一个已经构建好的模型,你可以使用model.get_layer方法访问一个层并创建一个新的模型:

intermediate_layer = model.get_layer('avg_pool').outputnew_model = tf.keras.Model(inputs=model.inputs, outputs=model.outputs + [intermediate_layer])print(new_model.outputs)

输出:

[<tf.Tensor 'dense/Sigmoid:0' shape=(None, 1) dtype=float32>,<tf.Tensor 'conv_5/BiasAdd:0' shape=(None, 118, 118, 16) dtype=float32>,<tf.Tensor 'avg_pool/Mean:0' shape=(None, 16) dtype=float32>]

然后编译你的模型,并为模型的每个输出指定一个单独的损失。这些损失可以是字符串,如果它们是Keras提供的默认损失,或者它们可以是实现你损失函数的可调用对象。

new_model.compile(optimizer='sgd',              loss={                  'dense': 'binary_crossentropy',                  'conv_5': 'mse',                  'avg_pool': 'mae'              })

一些虚拟数据和标签

images = tf.random.normal([100, 128, 128, 3])conv_3_labels = tf.random.normal([100, 118, 118, 16])avg_pool_labels =  tf.random.normal([100, 16])class_labels = tf.random.uniform([100], 0, 2, tf.float32)dataset = tf.data.Dataset.from_tensor_slices(    (images, (class_labels, conv_3_labels, avg_pool_labels)))dataset = dataset.batch(4, drop_remainder=True)

训练

new_model.fit(dataset)

输出:

25/25 [==============================] - 2s 79ms/step - loss: 2.4339- dense_loss: 0.3904 - conv_5_loss: 1.2367 - avg_pool_loss: 0.8068

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注