DL4J模型中转换keras模型
Convert keras model in DL4J model
我必须在 java 中保存和加载一个 keras 模型,然后我想我可以使用 DL4J。问题是,当我保存我的模型时,它没有具有自己权重的嵌入层。
我在 keras 中重新加载模型时遇到同样的问题,但在这种情况下,我可以创建相同的架构并仅加载模型的权重。
特别是我从这样的架构开始:
Layer (type) Output Shape Param #
=================================================================
embedding_1 (Embedding) (None, 300, 300) 219184200
_________________________________________________________________
lstm_1 (LSTM) (None, 300, 256) 570368
_________________________________________________________________
dropout_1 (Dropout) (None, 300, 256) 0
_________________________________________________________________
lstm_2 (LSTM) (None, 128) 197120
_________________________________________________________________
dropout_2 (Dropout) (None, 128) 0
_________________________________________________________________
dense_1 (Dense) (None, 2) 258
=================================================================
保存和加载后我得到这个(在 keras 和 DL4J 中):
Layer (type) Output Shape Param #
=================================================================
embedding_1 (Embedding) (None, None, 300) 219184200
_________________________________________________________________
lstm_1 (LSTM) (None, None, 256) 570368
_________________________________________________________________
dropout_1 (Dropout) (None, None, 256) 0
_________________________________________________________________
lstm_2 (LSTM) (None, 128) 197120
_________________________________________________________________
dropout_2 (Dropout) (None, 128) 0
_________________________________________________________________
dense_1 (Dense) (None, 2) 258
=================================================================
在 java 中有解决方案或解决方法吗?
1) 是否可以在keras中正确保存和加载结构和权重?
2) 是否可以使用 DL4J 或其他库在 java 中创建这种类型的模型?
3) 是否可以在一个函数中实现词到Embedding的转换,然后将之前在Embedding中转换的输入给神经网络?
4) 我可以使用 DL4J 在 java 的嵌入层中加载权重吗?
这是我的网络的代码:
sentence_indices = Input(shape=input_shape, dtype=np.int32)
emb_dim = 300 # embedding di 300 parole in italiano
embedding_layer = pretrained_embedding_layer(word_to_vec_map, word_to_index, emb_dim)
embeddings = embedding_layer(sentence_indices)
X = LSTM(256, return_sequences=True)(embeddings)
X = Dropout(0.15)(X)
X = LSTM(128)(X)
X = Dropout(0.15)(X)
X = Dense(num_activation, activation='softmax')(X)
model = Model(sentence_indices, X)
sequentialModel = Sequential(model.layers)
提前致谢。
您可能会在 DL4J Gitter 聊天中得到这个答案:https://gitter.im/deeplearning4j/deeplearning4j
我发现 Keras 神经网络和 DL4J 神经网络之间的差异是由于对 word2Vec(或 GloVe)文件的不同解析。
特别是加载 word2Vec 然后解析以创建 3 个字典:
- word2Index
- index2Word
- word2EmbeddingVec
from gensim.models import Word2Vec
modelW2V = Word2Vec.load('C:/Users/Alessio/Desktop/emoji_ita/embedding/glove_WIKI') # glove model
我发现两种不同的解析(使用相同的代码)为 "index - word" 和 "word - index" 产生了不同的匹配。将字典保存在 json 文件中,然后从中加载数据对我来说是一个解决方案。
希望这对其他人也有帮助。
我必须在 java 中保存和加载一个 keras 模型,然后我想我可以使用 DL4J。问题是,当我保存我的模型时,它没有具有自己权重的嵌入层。 我在 keras 中重新加载模型时遇到同样的问题,但在这种情况下,我可以创建相同的架构并仅加载模型的权重。
特别是我从这样的架构开始:
Layer (type) Output Shape Param #
=================================================================
embedding_1 (Embedding) (None, 300, 300) 219184200
_________________________________________________________________
lstm_1 (LSTM) (None, 300, 256) 570368
_________________________________________________________________
dropout_1 (Dropout) (None, 300, 256) 0
_________________________________________________________________
lstm_2 (LSTM) (None, 128) 197120
_________________________________________________________________
dropout_2 (Dropout) (None, 128) 0
_________________________________________________________________
dense_1 (Dense) (None, 2) 258
=================================================================
保存和加载后我得到这个(在 keras 和 DL4J 中):
Layer (type) Output Shape Param #
=================================================================
embedding_1 (Embedding) (None, None, 300) 219184200
_________________________________________________________________
lstm_1 (LSTM) (None, None, 256) 570368
_________________________________________________________________
dropout_1 (Dropout) (None, None, 256) 0
_________________________________________________________________
lstm_2 (LSTM) (None, 128) 197120
_________________________________________________________________
dropout_2 (Dropout) (None, 128) 0
_________________________________________________________________
dense_1 (Dense) (None, 2) 258
=================================================================
在 java 中有解决方案或解决方法吗? 1) 是否可以在keras中正确保存和加载结构和权重?
2) 是否可以使用 DL4J 或其他库在 java 中创建这种类型的模型?
3) 是否可以在一个函数中实现词到Embedding的转换,然后将之前在Embedding中转换的输入给神经网络?
4) 我可以使用 DL4J 在 java 的嵌入层中加载权重吗?
这是我的网络的代码:
sentence_indices = Input(shape=input_shape, dtype=np.int32)
emb_dim = 300 # embedding di 300 parole in italiano
embedding_layer = pretrained_embedding_layer(word_to_vec_map, word_to_index, emb_dim)
embeddings = embedding_layer(sentence_indices)
X = LSTM(256, return_sequences=True)(embeddings)
X = Dropout(0.15)(X)
X = LSTM(128)(X)
X = Dropout(0.15)(X)
X = Dense(num_activation, activation='softmax')(X)
model = Model(sentence_indices, X)
sequentialModel = Sequential(model.layers)
提前致谢。
您可能会在 DL4J Gitter 聊天中得到这个答案:https://gitter.im/deeplearning4j/deeplearning4j
我发现 Keras 神经网络和 DL4J 神经网络之间的差异是由于对 word2Vec(或 GloVe)文件的不同解析。 特别是加载 word2Vec 然后解析以创建 3 个字典: - word2Index - index2Word - word2EmbeddingVec
from gensim.models import Word2Vec
modelW2V = Word2Vec.load('C:/Users/Alessio/Desktop/emoji_ita/embedding/glove_WIKI') # glove model
我发现两种不同的解析(使用相同的代码)为 "index - word" 和 "word - index" 产生了不同的匹配。将字典保存在 json 文件中,然后从中加载数据对我来说是一个解决方案。
希望这对其他人也有帮助。