Конвертировать модель keras в модель DL4J
Я должен сохранить и загрузить модель Keras в Java, а затем я подумал, что могу использовать DL4J. Проблема в том, что когда я сохраняю свою модель, на ней нет слоя Embedding с собственным весом. У меня та же проблема с перезагрузкой модели в 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) Можно ли сохранить и правильно загрузить структуру и вес в кератах?
2) возможно ли создать модель этого типа в Java с DL4J или другой библиотекой?
3) возможно ли реализовать слово преобразования для встраивания в функцию и затем передать нейронной сети вход, ранее преобразованный в встраивание?
4) Могу ли я загрузить веса в слое встраивания в Java с помощью DL4J?
Это код для моей сети:
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)
Заранее спасибо.
2 ответа
Я обнаружил, что различие между нейронной сетью 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
Я обнаружил, что два разных синтаксического анализа (с использованием одного и того же кода) дают разные совпадения для пары "индекс - слово" и "слово - индекс". Сохранение словаря в файле json и загрузка из него данных было для меня решением.
Надеюсь, что это может помочь другим.
Вы можете получить ответ на этот вопрос в чате DL4J Gitter: https://gitter.im/deeplearning4j/deeplearning4j