def Model_attention_conv():
model = Sequential()
model.add(Embedding(vocab_size, 256, input_length=input_length))
model.add(Conv1D(512, 5, activation='relu'))
model.add(MaxPooling1D())
model.add(SeqSelfAttention(attention_activation='sigmoid'))
model.add(Flatten())
model.add(Dense(labels_max, activation='sigmoid'))
return model
Ik kijk bij Kaggle of er nog een nlp uitdaging bij is gekomen. En ja hoor, er is er net weer een gestart:
Jigsaw Unintended Bias in Toxicity Classification
Detect toxicity across a diverse range of conversations
Oke, dit gaat dus over ongewenst taalgebruik in online conversaties. Leuk om ons model eens mee te testen.
Een voorbeeld van 'toxic' in de kolom 'insult' :
"haha you guys are a bunch of losers." |
Met een score van 0.89.
De verschillende types toxic taalgebruik zijn wel geklassificeerd maar de contest gaat alleen over toxic ja/nee. Hierbij is > .5 toxic.
Het tokenizen en 'padding' (naar de jiuste lengte brengen) laat ik deze keer aan de Keras routins daarvoor over. En na het aanpassen van de loss functie naar kleinste kwardratische afwijking (mean squared error) draait het model al snel.
Model creation ...
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
embedding_1 (Embedding) (None, 100, 256) 90746368
_________________________________________________________________
conv1d_1 (Conv1D) (None, 96, 512) 655872
_________________________________________________________________
max_pooling1d_1 (MaxPooling1 (None, 48, 512) 0
_________________________________________________________________
seq_self_attention_1 (SeqSel (None, 48, 512) 32833
_________________________________________________________________
flatten_1 (Flatten) (None, 24576) 0
_________________________________________________________________
dense_1 (Dense) (None, 1) 24577
=================================================================
Total params: 91,459,650
Trainable params: 91,459,650
Non-trainable params: 0
Helaas vallen de resultaten zwaar tegen. De loss en val_loss lijken zich niet te verbeteren ondanks bijvoorbeeld het aanpassen van de learning rate of de optimizer. (Adam naar stochastic gradient descent (SDG) . Vreemd. De aangeboden data lijkt toch goed te zijn.
In navolging van een voorbeeld kernel bij Kaggle maak ik de voorspelde uitkomensten digitaal: 0 voor < .5 en 1 voor groter >= 5.
y_train = np.where(train['target'] >= 0.5, 1, 0)
Tevens pas ik daarvoor de loss functie aan naar de 'binary_crossentropy'
Ook pas ik de manier van tokenizen aan:
Van
print('Reading data ...')
path = 'C:\\Users\\DirkW\\Documents\\Jigsaw\\'
train = pd.read_csv('C:\\Users\\DirkW\\Documents\\Jigsaw\\train.csv', encoding="ISO-8859-1") #encoding='utf-8')
train = train.fillna("")
x_train = preprocess(train['comment_text'])
x_train = x_train.astype(str, errors='ignore').values.tolist()
x_train = [''.join(x) for x in x_train]
test = pd.read_csv('C:\\Users\\DirkW\\Documents\\Jigsaw\\test.csv', encoding="ISO-8859-1")
test = test.fillna("")
x_test= preprocess(test['comment_text'])
#x_test = x_test.astype(str, errors='ignore').values.tolist()
#x_test = [''.join(x) for x in x_test]
print('Tokenizing data ...')
'''
'''
tokenizer = Tokenizer(num_words=50000)
vocab_size = len(tokenizer.word_index) + 1
tokenizer.fit_on_texts(x_train)
X_train = tokenizer.texts_to_sequences(x_train)
X_test = tokenizer.texts_to_sequences(x_test)
print('Padding data ...')
X_train = pad_sequences(X_train, padding='post', maxlen=input_length)
X_test = pad_sequences(X_test, padding='post', maxlen=input_length)
naar
train = pd.read_csv('C:\\Users\\DirkW\\Documents\\Jigsaw\\train.csv', encoding="ISO-8859-1") #encoding='utf-8')
train = train.fillna("")
x_train = preprocess(train['comment_text'])
tokenizer = text.Tokenizer()
tokenizer.fit_on_texts(list(x_train) + list(x_test))
vocab_size = len(tokenizer.word_index) + 1
x_train = tokenizer.texts_to_sequences(x_train)
x_test = tokenizer.texts_to_sequences(x_test)
x_train = sequence.pad_sequences(x_train, maxlen=input_length)
x_test = sequence.pad_sequences(x_test, maxlen=input_length)
De tokenizer gebruikt nu zowel train als test teksten. Ik heb geen maximaal aantal woorden meer opgegeven en de 'moeilijke ombouw stappen zijn eruit:
x_train = x_train.astype(str, errors='ignore').values.tolist()
x_train = [''.join(x) for x in x_train]
De loss lijkt nu in ieder geval te verbeteren. Helaas de validation loss nog niet. Die wordt vooralsnog alleen maar slechter:
1443899/1443899 [==============================] - 1033s 715us/step - loss: 0.1502 - val_loss: 0.1394
Epoch 00001: val_loss improved from inf to 0.13939, saving model to model-best.h5
Epoch 2/20
1443899/1443899 [==============================] - 1019s 706us/step - loss: 0.1275 - val_loss: 0.1397
Epoch 00002: val_loss did not improve from 0.13939
Epoch 3/20
1443899/1443899 [==============================] - 1031s 714us/step - loss: 0.1092 - val_loss: 0.1516
Epoch 00003: val_loss did not improve from 0.13939
Epoch 4/20
533050/1443899 [==========>...................] - ETA: 10:33 - loss: 0.0847
Maar ... we zijn nog maar bij de 4e epoch. Wie weet ... Het duurt nu wel lang: 1030 sec per epoch!
1443899/1443899 [==============================] - 1033s 715us/step - loss: 0.1502 - val_loss: 0.1394
Epoch 00001: val_loss improved from inf to 0.13939, saving model to model-best.h5
Epoch 2/20
1443899/1443899 [==============================] - 1019s 706us/step - loss: 0.1275 - val_loss: 0.1397
Epoch 00002: val_loss did not improve from 0.13939
Epoch 3/20
1443899/1443899 [==============================] - 1031s 714us/step - loss: 0.1092 - val_loss: 0.1516
Epoch 00003: val_loss did not improve from 0.13939
Epoch 4/20
1443899/1443899 [==============================] - 1029s 712us/step - loss: 0.0900 - val_loss: 0.1696
Epoch 00004: val_loss did not improve from 0.13939
Epoch 5/20
1443899/1443899 [==============================] - 1015s 703us/step - loss: 0.0725 - val_loss: 0.1871
Epoch 00005: val_loss did not improve from 0.13939
Epoch 6/20
1443899/1443899 [==============================] - 1006s 697us/step - loss: 0.0574 - val_loss: 0.2166
Epoch 00006: val_loss did not improve from 0.13939
Epoch 00006: early stopping
Geen opmerkingen:
Een reactie posten