我创建了以下Keras自定义模型:
import tensorflow as tf
from tensorflow.keras.layers import Layer
class MyModel(tf.keras.Model):
def __init__(self, num_classes):
super(MyModel, self).__init__()
self.dense_layer = tf.keras.layers.Dense(num_classes,activation='softmax')
self.lambda_layer = tf.keras.layers.Lambda(lambda x: tf.math.argmax(x, axis=-1))
def call(self, inputs):
x = self.dense_layer(inputs)
x = self.lambda_layer(x)
return x
# A convenient way to get model summary
# and plot in subclassed api
def build_graph(self, raw_shape):
x = tf.keras.layers.Input(shape=(raw_shape))
return tf.keras.Model(inputs=[x],
outputs=self.call(x))
任务是多类分类。模型由一个带有softmax激活的密集层和一个lambda层组成,lambda层作为后处理单元,将密集输出向量转换为单个值(预测类)。
训练目标是一个独热编码矩阵,如下所示:
[
[0,0,0,0,1]
[0,0,1,0,0]
[0,0,0,1,0]
[0,0,0,0,1]
]
如果我可以在密集层定义一个categorical_crossentropy
损失,忽略lambda层,同时仍然保持功能,并在调用model.predict(x)
时输出一个值,那就太好了。
请注意
我的工作环境不允许我使用@alonetogether建议的自定义训练循环。
3条答案
按热度按时间fruv7luv1#
您可以尝试使用自定义训练循环,这是非常简单的IMO:
预测:
x一个一个一个一个x一个一个二个x
shyt4zoc2#
我认为有一个
Model.predict_classes
函数可以替代lambda层。但如果它不起作用:似乎没有办法做到这一点,而不使用这些黑客之一:
我确信没有其他的解决方法,所以,我相信“两个模型”版本最适合你的情况,你似乎“需要”一个单输入,单输出和
fit
的模型。然后我会这么做
nhhxz33t3#
我遇到了一个类似的问题,我需要在标准化的地面实况数据上训练模型,但我希望模型输出“非标准化”的结果。
我所做的是在模型中添加“非规范化”层,并在损失函数周围添加一个 Package 器,该 Package 器将模型的输出重新规范化,以便仅计算损失。这可以在编译函数中完成。
当我稍后加载模型时,我不编译它,以避免“Loss function 'loss_wrapper' not found”错误