keras中模型如何传递到函数里供函数体使用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了keras中模型如何传递到函数里供函数体使用相关的知识,希望对你有一定的参考价值。

参考技术A 我的一个模型含有自定义层“SincConv1D”,需要使用下面的代码导入。
我的一个模型含有自定义层“SincConv1D”,需要使用下面的代码导入:
from keras.models import load_model
model = load_model(\'model.h5\', custom_objects=\'SincConv1D\': SincConv1D)
如果不加custom_objects指定目标层Layer,则会出现以下报错:
ValueError: Unknown layer: SincConv1D
同样的,当我的模型含有自定义函数“my_loss”,需要使用下面的代码导入:
from keras.models import load_model
model = load_model(\'model.h5\', custom_objects=\'my_loss\': my_loss)
补充知识:keras加载模型load_model报错——ValueError: Unknown layer: CRF
我就废话不多说了,大家还是直接看代码吧!
from keras.models import load_model
model = load_model(model_path)
会报错,需要在load_model函数中添加custom_objects参数,来声明自定义的层
(用keras搭建bilstm-crf,在训练模型时,使用的是:
from keras_contrib.layers.crf import CRF)
from keras_contrib.layers.crf import CRF, crf_loss, crf_viterbi_accuracy
model = load_model(model_path, custom_objects="CRF": CRF, \'crf_loss\': crf_loss,
\'crf_viterbi_accuracy\': crf_viterbi_accuracy)

Keras:如何在损失函数中使用层的权重?

【中文标题】Keras:如何在损失函数中使用层的权重?【英文标题】:Keras : How to use weights of a layer in loss function? 【发布时间】:2018-04-30 09:48:05 【问题描述】:

我正在 keras 中实现自定义损失函数。模型是autoencoder。第一层是嵌入层,它将大小为(batch_size, sentence_length) 的输入嵌入到(batch_size, sentence_length, embedding_dimension) 中。然后模型将嵌入压缩成一定维度的向量,最后必须重构嵌入(batch_size, sentence_lenght, embedding_dimension)

但是嵌入层是可训练的,损失必须使用嵌入层的权重(我必须对我词汇表的所有词嵌入求和)。

例如,如果我想以玩具为例进行训练:“猫”。 sentence_length is 2 并假设 embedding_dimension is 10vocabulary size is 50,所以嵌入矩阵的形状为 (50,10)。 Embedding 层的输出X 的形状为(1,2,10)。然后它传入模型,输出X_hat,形状也是(1,2,10)。必须训练模型以最大化表示“the”的向量X_hat[0]与嵌入层中表示“the”的向量X[0]最相似的概率,“cat”也是如此。但是损失是这样的,我必须计算XX_hat之间的余弦相似度,通过X_hat的余弦相似度和嵌入矩阵中的每个嵌入(50,因为词汇量为50)的总和进行归一化,它们是嵌入层权重的列。

但是如何在训练过程的每次迭代中访问嵌入层中的权重?

谢谢!

【问题讨论】:

可以破解模型以使嵌入的输出进入损失函数,但采用层的权重似乎会增加更复杂的工作...... 您确定要这样做吗?归一化总和可能会爆炸。您是否有任何论文描述了您的方法?也许你在那里有一个 softmax 输出。 我尝试实现在 NIPS 2017 上接受的这篇论文。arxiv.org/pdf/1708.04729.pdf。可能我论文不是很懂,但是看Equation 1。分母对We中嵌入的词汇的所有单词取余弦相似度,也就是embedding matrix。 【参考方案1】:

这似乎有点疯狂,但似乎有效:网络没有创建我将在 model.compile 中传递的自定义损失函数,而是在我调用的函数中计算损失(来自arxiv.org/pdf/1708.04729.pdf 的公式 1)使用 Lambda:

loss = Lambda(lambda x: similarity(x[0], x[1], x[2]))([X_hat, X, embedding_matrix])    

并且网络有两个输出:X_hatloss,但我对 X_hat 的权重为 0,而 loss 为拥有所有权重:

model = Model(input_sequence, [X_hat, loss])
model.compile(loss=mean_squared_error,
              optimizer=optimizer,
              loss_weights=[0., 1.])

当我训练模型时:

for i in range(epochs):
    for j in range(num_data):
        input_embedding = model.layers[1].get_weights()[0][[data[j:j+1]]]
        y = [input_embedding, 0] #The embedding of the input
        model.fit(data[j:j+1], y, batch_size=1, ...)

这样,模型被训练为使 loss 趋向于 0,当我想使用经过训练的模型的预测时,我使用第一个输出,即重构 X_hat

【讨论】:

你认为这行得通吗?因为在计算图中,model.layer[1] 的权重在进行自动微分时不会出现。如果我错了,请纠正我。

以上是关于keras中模型如何传递到函数里供函数体使用的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Keras 模型中使用 TensorFlow 的采样 softmax 损失函数?

Keras 自定义损失函数,用于传递 y_true 和 y_pred 以外的参数

如何在具有使用@tf.keras.utils.register_keras_serializable 注册的自定义函数的 Tensorflow Serving 中提供模型?

如何使用自定义损失函数加载 Keras 模型?

如何在 Keras 自定义损失函数中使用张量?

在 tf.keras 的 model.fit 中,有没有办法将每个样本分批传递 n 次?