Преобразование модели 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) можно ли реализовать преобразование слова в Embedding в функции, а затем отдавать в нейросеть входные данные, ранее преобразованные в Embedding?

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) 

Заранее спасибо.


person AM13    schedule 19.02.2019    source источник


Ответы (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, а затем загрузка данных из него было решением для меня.

Надеюсь, это поможет и другим.

person AM13    schedule 20.02.2019

Вероятно, вы можете получить ответ на этот вопрос в чате DL4J Gitter: https://gitter.im/deeplearning4j/deeplearning4j

person racknuf    schedule 20.02.2019