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)
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 ...
Geen opmerkingen:
Een reactie posten