Я хочу реализовать следующую сеть в Керасе для проекта word2vec:
Вот моя попытка реализовать его, где d=50
и V=vocab_size
:
ip_shape1 = Input(shape=(vocab_size,))
ip_shape2 = Input(shape=(vocab_size,))
ip_shape3 = Input(shape=(vocab_size,))
shared_layer = Dense(50, activation = "sigmoid")
op1 = shared_layer(ip_shape1)
op2 = shared_layer(ip_shape2)
op3 = shared_layer(ip_shape3)
projection_layer = Concatenate()([op1, op2, op3])
hidden_layer = Dense(vocab_size+100)(projection_layer)
output_layer = Dense(vocab_size, activation='softmax')(hidden_layer)
model = Model(inputs=[ip_shape1, ip_shape2, ip_shape3], outputs=output_layer)
Во-первых, я хотел бы знать, правильно ли я реализовал сеть? Затем я должен извлечь общий слой E
, чтобы иметь векторы для слов. Как я мог извлечь это?
Ниже также описано, как я подготовил свои данные тренировок для подачи в сеть:
tokenizer = Tokenizer()
tokenizer.fit_on_texts(data)
encoded = tokenizer.texts_to_sequences(data)
# determine the vocabulary size
vocab_size = len(tokenizer.word_index) + 1
sequences = list()
for i in range(1, len(encoded)):
sent = encoded[i]
_4grams = list(nltk.ngrams(sent, n=4))
for gram in _4grams:
sequences.append(gram)
# split into X and y elements
sequences = np.array(sequences)
# print("seq2:", sequences)
X, y = sequences[:, 0:3], sequences[:, 3]
X = to_categorical(X, num_classes=vocab_size)
y = to_categorical(y, num_classes=vocab_size)
Xtrain, Xtest, Ytrain, Ytest = train_test_split(X, y, test_size=0.3, random_state=42)
# one hot encode outputs
И вот как я передаю его в сеть:
history = model.fit([Xtrain[:,0,:],Xtrain[:,1,:], Xtrain[:,2,:]], Ytrain, epochs=10, verbose=1,
validation_data=([Xtest[:,0,:],Xtest[:,1,:], Xtest[:,2,:]], Ytest))
Они как на картинке выше?