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 10
和 vocabulary size is 50
,所以嵌入矩阵的形状为 (50,10)
。 Embedding 层的输出X
的形状为(1,2,10)
。然后它传入模型,输出X_hat
,形状也是(1,2,10)
。必须训练模型以最大化表示“the”的向量X_hat[0]
与嵌入层中表示“the”的向量X[0]
最相似的概率,“cat”也是如此。但是损失是这样的,我必须计算X
和X_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_hat
和 loss
,但我对 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 中提供模型?