Zde je zjednodušený příklad jak vytvořit model pro generování textu pomocí LSTM (Long Short-Term Memory) sítě v Kerasu. Předpokládáme, že máme na vstupu text Shakespearových her (v tomto příkladu používáme menší text pro jednoduchost).
import numpy as np
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense
from tensorflow.keras.utils import to_categorical
# Začátek textu
text = "To be or not to be, that is the question"
# Vytvoříme mapování znaků na indexy a indexy na znaky
chars = sorted(list(set(text)))
char_to_index = dict((c, i) for i, c in enumerate(chars))
index_to_char = dict((i, c) for i, c in enumerate(chars))
# Počet jedinečných znaků
n_chars = len(chars)
# Délka sekvencí, které budeme používat pro trénink
seq_length = 10
# Vytvoříme tréninkové a cílové sekvence
X, Y = [], []
for i in range(0, len(text) - seq_length, 1):
seq_in = text[i:i + seq_length]
seq_out = text[i + seq_length]
X.append([char_to_index[char] for char in seq_in])
Y.append(char_to_index[seq_out])
# Počet tréninkových vzorků
n_samples = len(X)
# Přeformátujeme X a Y pro vstup do LSTM
X = np.reshape(X, (n_samples, seq_length, 1)) / float(n_chars)
Y = to_categorical(Y, num_classes=n_chars)
# Vytvoříme LSTM model
model = Sequential()
model.add(LSTM(256, input_shape=(X.shape[1], X.shape[2])))
model.add(Dense(n_chars, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam')
# Natrénujeme model
model.fit(X, Y, epochs=100, batch_size=128, verbose=0)
# Vygenerujeme text
start = np.random.randint(0, n_samples-1)
pattern = X[start]
print("Seed:")
print("\"", ''.join([index_to_char[int(value*n_chars)] for value in pattern]), "\"")
for i in range(100):
x = np.reshape(pattern, (1, len(pattern), 1))
prediction = model.predict(x, verbose=0)
index = np.argmax(prediction)
result = index_to_char[index]
seq_in = [index_to_char[int(value*n_chars)] for value in pattern]
print(result, end="") # tiskne text na stejném řádku
pattern = np.append(pattern[1:], [index/float(n_chars)])
print("\nDone.")
Tento příklad trénuje LSTM model na sekvencích o délce 10 znaků z vstupního textu a pak generuje nový text na základě náhodně zvolené startovní sekvence.
Všimněte si, že pro trénování modelu na velkém korpusu textu, jako je například kompletní soubor Shakespearových her, byste potřebovali výkonnější hardware (například GPU) a pravděpodobně byste také potřebovali upravit parametry modelu a proces trénování, aby lépe odpovídaly velikosti a složitosti dat.
Navíc by bylo vhodné implementovat nějakou formu regularizace, jako je dropout nebo weight decay, aby se předešlo přeučení modelu, což je běžný problém při trénování složitých modelů hlubokého učení na velkých datasetech.
Je také důležité poznamenat, že generování textu je složitý problém a i když může být tento základní model schopen vytvářet text, který vypadá “rozumně” na první pohled, je nepravděpodobné, že by byl schopen konzistentně vytvářet smysluplný a koherentní text na úrovni, kterou bychom očekávali od lidského autora.