Как ограничить размер словаря LSTM? - PullRequest
0 голосов
/ 28 апреля 2018

Я хочу иметь модель, которая предсказывает только определенную синтаксическую категорию, например, глаголы, могу ли я обновить веса LSTM так, чтобы они были установлены на 1, если слово является глаголом, и 0, если это любая другая категория

Это мой текущий код:

model = Sequential()
model.add(Embedding(vocab_size, embedding_size, input_length=5, weights=[pretrained_weights]))
model.add(Bidirectional(LSTM(units=embedding_size)))
model.add(Dense(2000, activation='softmax'))

for e in zip(model.layers[-1].trainable_weights, model.layers[-1].get_weights()):
    print('Param %s:\n%s' % (e[0], e[1]))

weights = [layer.get_weights() for layer in model.layers]
print(weights)

print(model.summary())

# compile network
model.compile(loss='categorical_crossentropy',
          optimizer = RMSprop(lr=0.001),
          metrics=['accuracy'])

# fit network
history = model.fit(X_train_fit, y_train_fit, epochs=100, verbose=2, validation_data=(X_val, y_val))
score = model.evaluate(x=X_test, y=y_test, batch_size=32)

Вот веса, которые я возвращаю:

Param <tf.Variable 'dense_1/kernel:0' shape=(600, 2000) dtype=float32_ref>:
[[-0.00803087  0.0332068  -0.02052244 ...  0.03497869  0.04023124
  -0.02789269]
 [-0.02439511  0.02649114  0.00163587 ... -0.01433908  0.00598045
   0.00556619]
 [-0.01622458 -0.02026448  0.02620039 ...  0.03154427  0.00676246
   0.00236203]
 ...
 [-0.00233192  0.02012364 -0.01562861 ... -0.01857186 -0.02323328
   0.01365903]
 [-0.02556716  0.02962652  0.02400535 ... -0.01870854 -0.04620285
  -0.02111554]
 [ 0.01415684 -0.00216265  0.03434955 ...  0.01771339  0.02930249
   0.002172  ]]
Param <tf.Variable 'dense_1/bias:0' shape=(2000,) dtype=float32_ref>:
[0. 0. 0. ... 0. 0. 0.]
[[array([[-0.023167 , -0.0042483, -0.10572  , ...,  0.089398 , -0.0159   ,
         0.14866  ],
       [-0.11112  , -0.0013859, -0.1778   , ...,  0.063374 , -0.12161  ,
         0.039339 ],
       [-0.065334 , -0.093031 , -0.017571 , ...,  0.16642  , -0.13079  ,
         0.035397 ],

и так далее. Могу ли я сделать это путем обновления весов? Или есть более эффективный способ выводить только глаголы? Спасибо за помощь!

1 Ответ

0 голосов
/ 08 мая 2018

В этой модели с этой потерей (categoryorical_crossentropy) вы не можете выучить глагольные / не глагольные метки без присмотра. Итак, вам нужны помеченные данные. Возможно, вы можете использовать помеченный корпус, например, Penn Tree Bank корпус, обучите эту модель, которая принимает входные слова и предсказывает выходные метки (закрытый класс меток).

Если вы хотите иметь один тег и регрессию для каждого слова, вы можете изменить модель, чтобы последний слой стал значением от 0 до 1:

model.add(Dense(1, activation='sigmoid'))

Затем измените функцию потерь на двоичную:

# compile network
model.compile(loss='binary_crossentropy',
          optimizer = RMSprop(lr=0.001),
          metrics=['accuracy'])

Тогда вместо меток вы должны иметь значения 1 и 0 в y_train_fit, представляющие глагол / не глагол каждого слова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...