Omdat een eerder model beter werkte (tot 86% val_acc meen ik) toch maar eens geprobeerd om dat model met de mega hoeveelheid data aan de praat te krijgen. Het probleem is memory. En dat komt met name door de lengte van de woordenlijst. In de eerste stap in het model worden de indices van de woorden omgezet naar ene OneHot van evenveel booleans als het aantal woorden. Dat geeft ook dat het model daarna in de eerste laag evenzoveel leerparameters maal de batch grootte maal de grootte van de 2e laag in het model. Daar kan het geheugen van de videokaart niet goed tegen.
Een 2e probleem is dat alle data van de documenten nogmaals worden opgeslagen in een gigantisch array (x_train).
Het formaat hiervan is #documenten * #woorden in een document * #woorden in de vocubalary (in booleans)
In het vorige model is dat opgelost door de conversie naar booleans op te nemen in een extra layer in het model:
model = Sequential()
model.add(OneHot(input_dim=input_dim,
input_length=input_length))
model.add(TimeDistributed(Dense(256)))
model.add(Conv1D(256, 6, activation='relu'))
model.add(Conv1D(64, 3, activation='relu'))
model.add(MaxPooling1D(3))
model.add(Conv1D(128, 3, activation='relu'))
model.add(Conv1D(128, 3, activation='relu'))
model.add(GlobalAveragePooling1D())
model.add(Dropout(0.5))
model.add(layers.Dense(labels_max, activation='softmax'))
Maar dat lijkt helaas dus niet zo goed te functioneren. Het is mij nog niet duidelijk waarom niet.
Ik besluit dus terug te gaan naar het eerdere model door
- Reduceren van de woordenlijst (Alle woorden die minder dan 20x voorkomen worden eruit gefilterd.)
- In batches van 10.000 docs aanbieden van de trainingsdata. (6 epochs per serie)
Dat geeft al veel betere resultaten en grappige grafieken:
Helaas loopt die na 11 rondes in een memory error. Hoe dat komt is mij niet duidelijk. Ik maak (vrijwel) geen aanvullende data aan. Alleen de lists om loss en accuracy vast te leggen groeien ele ronde iets. Maar dat kan het niet zijn:
getsizeof(acc)
272
Het echte probleem lijkt nog steeds bij x_train: 23 gB !!!
getsizeof(x_train)
23.171.840.128
x_train.shape
(10000, 64, 36206)
Daar maak ik een kopie van in x_train_part (80%)
getsizeof(x_train_part)
128
Hmmm ... pythons / numpy's manier van 'kopieen maken' redt my hier blijkbaar maar geeft dus geen oplossing.
Natuurlijk kan ik het aantal docs per keer kleiner maken. Of niet alle woorden meenemen uit de docs. Of de vocabulare verder verkleinen.
Daarnaast concureert Python met andere programma's op mijn desktop. Dus het niet gebruiken daarvan helpt wellicht ook. Of natuurlijk meer memory kopen ...