Нехватка памяти для обучающей выборки рекуррентной нейронной сети прогнозирующей слова

Доброго всем времени суток! Для рекуррентной нейронной сети прогнозирующей слова я создал обучающую выборку размром 200 тыс. слов и сразу столкнулся с ошибкой что невозможно выделить такое количество памяти ( в информации об ошибке конкретная цифра) для массива с формой (191548, 200000) и типом данных float32 (numpy.core._exceptions.MemoryError: Unable to allocate 351. GiB for an array with shape (191548, 200000) and data type float32)при сокращении обучащей выборки до 100 тыс. слов ошибка не появляется. Я понимаю что для того чтобы рекуррентная нейронная сеть начала обучатся мне нужно разбить мою обучающую выборку на части по количеству строк (так как в каждой строке одно преложение) и как то подовать эти части на вход, но как это правильно сделать не знаю, то есть сколько эпох на каждой части выборки сеть должна обучатся и когда и как программа должна запросить слеующую часть выборки(от чего орентироватся)? Облазил весь интернет, каких только запросов не делал но ни какой информации или примеров по этому поводу не нашел. Что делать не знаю, когда набирал словарь ждал что из Н.С. получиться профессор русского языка и литературы а в итоге получаю Эллочку Людоедову! Сам код не мой, взял из интернета, и как я писал выше на маленькой выборке 'text' он работает. '''

import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'

import numpy as np

from tensorflow.keras.layers import Dense, SimpleRNN, Input, Embedding
from tensorflow.keras.models import Sequential
from tensorflow.keras.preprocessing.text import Tokenizer, text_to_word_sequence
from tensorflow.keras.utils import to_categorical

with open('text', 'r', encoding='utf-8') as f:
    texts = f.read()
    texts = texts.replace('\ufeff', '')  # убираем первый невидимый символ

maxWordsCount = 200000
tokenizer = Tokenizer(num_words=100000, filters='!–"—#$%&amp;()*+,-./:;<=>?@[\\]^_`{|}~\t\n\r«»',
                      lower=True, split=' ', char_level=False)
tokenizer.fit_on_texts([texts])

dist = list(tokenizer.word_counts.items())
print(dist[:10])

data = tokenizer.texts_to_sequences([texts])
# res = to_categorical(data[0], num_classes=maxWordsCount)
# print(res.shape)
res = np.array( data[0] )

inp_words = 3
n = res.shape[0] - inp_words

X = np.array([res[i:i + inp_words] for i in range(n)])
Y = to_categorical(res[inp_words:], num_classes=maxWordsCount)

model = Sequential()
model.add(Embedding(maxWordsCount, 256, input_length = inp_words))
model.add(SimpleRNN(128, activation='tanh'))
model.add(Dense(maxWordsCount, activation='softmax'))
model.summary()

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

history = model.fit(X, Y, batch_size=32, epochs=500)


def buildPhrase(texts, str_len=20):
    res = texts
    data = tokenizer.texts_to_sequences([texts])[0]
    for i in range(str_len):
        # x = to_categorical(data[i: i + inp_words], num_classes=maxWordsCount)  # преобразуем в One-Hot-encoding
        # inp = x.reshape(1, inp_words, maxWordsCount)
        x = data[i: i + inp_words]
        inp = np.expand_dims(x, axis=0)

        pred = model.predict(inp)
        indx = pred.argmax(axis=1)[0]
        data.append(indx)

        res += " " + tokenizer.index_word[indx]  # дописываем строку

    return res


res = buildPhrase("позитив добавляет годы")
print(res)

'''


Ответы (0 шт):