De eerste stap was het trainen van de 'word-embeddings'. Ook daarvoor heb ik alle woorden uit de filmsentiment data genomen en ze getraind op 'omliggende woorden':
Train on 12000000 samples, validate on 3000000 samples
Epoch 1/60
12000000/12000000 [==============================] - 1828s 152us/step - loss: 0.2814 - accuracy: 0.0412 - val_loss: 0.2790 - val_accuracy: 0.0398
Epoch 2/60
12000000/12000000 [==============================] - 1716s 143us/step - loss: 0.2790 - accuracy: 0.0415 - val_loss: 0.2790 - val_accuracy: 0.0386
Epoch 3/60
12000000/12000000 [==============================] - 1496s 125us/step - loss: 0.2790 - accuracy: 0.0416 - val_loss: 0.2790 - val_accuracy: 0.0458
Epoch 4/60
12000000/12000000 [==============================] - 1346s 112us/step - loss: 0.2790 - accuracy: 0.0414 - val_loss: 0.2790 - val_accuracy: 0.0425
Epoch 5/60
12000000/12000000 [==============================] - 1290s 107us/step - loss: 0.2790 - accuracy: 0.0416 - val_loss: 0.2790 - val_accuracy: 0.0456
Met 12 miljoen woorden leek me 6 epochs wel genoeg. Je ziet de validation loss nauwelijks bewegen.
Eerst heb ik de c2w2v vectoren apart willen converteren maar dat gaf memory errors. Gek genoeg niet bij de conversie zelf maar pas bij de poging om de data (met numpy) op te slaan. Blijkbaar heeft die dan tijdelijk meer memory nodig.
Het lukt mij nu echter om de 2e conversie als 'layer' op te nemen.
Eerst maak ik een 'hulpmodel' van de getrainde woord embeddings.
c2w2v_model = load_model(path + 'model-best-c2w2v.h5')
get_1st_layer_output = K.function([c2w2v_model.layers[0].input],
[c2w2v_model.layers[0].output])
hmodel = Model(c2w2v_model.inputs,c2w2v_model.layers[0].output)
En dan kan ik dat hulpmodel als layer opnemen in de Keras 'api - versie' van mijn eerdere model:
def Model_attention_conv_api():
input_shape = Input(shape = (max_sent * max_words, max_vec))
x = hmodel (input_shape)
x = Dense(512) (x)
x = Conv1D(512, 2, activation='relu') (x)
x = AveragePooling1D() (x)
x = SeqSelfAttention(attention_activation='relu') (x)
x = Flatten() (x)
x = Dense(128) (x)
x = Dense(label_size-1, activation='sigmoid') (x)
model = Model(inputs = input_shape,outputs=x)
return model
Wow, daar ben ik best wel trots op. Nu eens kijken wat het resultaat gaat zijn. Misschien lukt het zo ook nog wel om ook de chars2vec zo op te nemen zodat data conversie niet nodig is.
Dat is heel niet slecht, lijkt mij. Welliswaar nog niet bij de 85% val acc die ik zou willen maar voor een eerste test ben ik verre van ontevreden.
En na even door trainen bijna 83% !!!
Een, iets hogere trainings rate (van 0.00001 to .0001) geeft een score van meer dan 84% in 16 epochs! We naderen de beoogde 85%!!!
This is the result with chars2vec size 100 (instead of 50)
Geen opmerkingen:
Een reactie posten