Точность модели LSTM очень низкая - PullRequest
0 голосов
/ 20 мая 2019

Я пытаюсь построить модель для прогнозирования текста.

Форма x_train: (19992, 40, 1)

array([[[0.00680272],
        [0.01417234],
        [0.        ],
        ...,

        [0.01473923],
        [0.        ],
        [0.0085034 ]]])

Форма y_train: (19992, 42) (это горячая кодировка)

array([[0., 0., 0., ..., 0., 0., 0.],
       [0., 0., 0., ..., 0., 0., 0.],
       [0., 0., 0., ..., 0., 0., 0.],
       ...,
       [0., 0., 0., ..., 0., 0., 0.],
       [1., 0., 0., ..., 0., 0., 0.],
       [0., 0., 0., ..., 0., 0., 0.]], dtype=float32)

Моя модель:

model = Sequential()
model.add(LSTM(256, input_shape=(40,1), return_sequences=True))
model.add(Dropout(0.3))
model.add(LSTM(128))
model.add(Dropout(0.5))
model.add(Dense(42, activation='softmax'))

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

Теперь, обучая свою модель даже с 150 эпохами, я могу достичь толькоточность 0,512.Что я должен улучшить в модели, чтобы повысить ее точность?

Train on 15993 samples, validate on 3999 samples
Epoch 1/15
15993/15993 [==============================] - 23s 3ms/step - loss: 2.9527 - acc: 0.2013 - val_loss: 2.8762 - val_acc: 0.2061
Epoch 2/15
15993/15993 [==============================] - 23s 3ms/step - loss: 2.8670 - acc: 0.2111 - val_loss: 2.8678 - val_acc: 0.2061
Epoch 3/15
15993/15993 [==============================] - 23s 3ms/step - loss: 2.8548 - acc: 0.2117 - val_loss: 2.8615 - val_acc: 0.2061
Epoch 4/15
15993/15993 [==============================] - 22s 3ms/step - loss: 2.8516 - acc: 0.2121 - val_loss: 2.8629 - val_acc: 0.2061
Epoch 5/15
15993/15993 [==============================] - 22s 3ms/step - loss: 2.8447 - acc: 0.2117 - val_loss: 2.8663 - val_acc: 0.2061
Epoch 6/15
15993/15993 [==============================] - 21s 3ms/step - loss: 2.8445 - acc: 0.2133 - val_loss: 2.8657 - val_acc: 0.2061
Epoch 7/15
15993/15993 [==============================] - 22s 3ms/step - loss: 2.8404 - acc: 0.2134 - val_loss: 2.8657 - val_acc: 0.2061
Epoch 8/15
15993/15993 [==============================] - 21s 3ms/step - loss: 2.8401 - acc: 0.2117 - val_loss: 2.8673 - val_acc: 0.2061
Epoch 9/15
15993/15993 [==============================] - 21s 3ms/step - loss: 2.8391 - acc: 0.2139 - val_loss: 2.8657 - val_acc: 0.2061
Epoch 10/15
15993/15993 [==============================] - 22s 3ms/step - loss: 2.8412 - acc: 0.2141 - val_loss: 2.8642 - val_acc: 0.2061
Epoch 11/15
15993/15993 [==============================] - 21s 3ms/step - loss: 2.8394 - acc: 0.2149 - val_loss: 2.8680 - val_acc: 0.2061
Epoch 12/15
15993/15993 [==============================] - 22s 3ms/step - loss: 2.8404 - acc: 0.2154 - val_loss: 2.8658 - val_acc: 0.2061
Epoch 13/15
15993/15993 [==============================] - 22s 3ms/step - loss: 2.8380 - acc: 0.2161 - val_loss: 2.8672 - val_acc: 0.2061
Epoch 14/15
15993/15993 [==============================] - 22s 3ms/step - loss: 2.8384 - acc: 0.2169 - val_loss: 2.8674 - val_acc: 0.2061
Epoch 15/15
15993/15993 [==============================] - 22s 3ms/step - loss: 2.8378 - acc: 0.2171 - val_loss: 2.8702 - val_acc: 0.2061

1 Ответ

1 голос
/ 20 мая 2019

Я думаю, что вы рассматриваете основанную на LSTM модель языка уровня персонажа. В моделях такого типа в качестве входных данных обычно используются многомерные вложения, а не только одномерные скаляры. Так что для Keras вы можете попробовать следующую сетевую архитектуру:

model = Sequential()
model.add(Embedding(42, output_dim=64, input_length=40))
model.add(LSTM(256,input_shape=(40,1),return_sequences=True))
model.add(Dropout(0.3))
model.add(LSTM(128))
model.add(Dropout(0.5))
model.add(Dense(42,activation='softmax'))

где output_dim - количество размеров вложения. Входными данными в эту сеть являются целочисленные матрицы [batch_size x input_length], где каждый элемент является индексом char. Посмотрите этот пост для деталей. Надеюсь, это поможет!

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