LSTM est une variante des réseaux de neurones récurrents utilisée pour résoudre des problèmes de dépendance à long terme. L'idée principale est de contrôler le flux des états d'entrée, de sortie et internes à travers une série d'unités fermées, évitant ainsi efficacement le problème de gradient de disparition ou d'explosion dans RNN. Ce mécanisme de contrôle permet au LSTM de mémoriser les informations pendant une longue période et d'oublier ou de mettre à jour sélectivement l'état selon les besoins, lui permettant ainsi de mieux gérer les données de longue séquence.
Le principe de fonctionnement du LSTM est de contrôler le flux et la préservation des informations via trois unités de contrôle de porte, qui comprennent des portes d'oubli, des portes d'entrée et des portes de sortie.
Forgetting Gate : contrôle si l'état précédent doit être oublié, permettant au modèle de conserver de manière sélective les informations sur l'état précédent.
Porte d'entrée : contrôle la proportion de nouvelles informations d'entrée dans l'état actuel, permettant au modèle d'ajouter de manière sélective de nouvelles informations.
Porte de sortie : contrôle la sortie des informations sur l'état actuel, permettant au modèle de produire de manière sélective des informations sur l'état.
Par exemple, supposons que nous souhaitions utiliser LSTM pour générer un texte sur la météo. Tout d’abord, nous devons convertir le texte en nombres, ce que nous pouvons faire en mappant chaque mot sur un entier unique. Nous pouvons ensuite introduire ces entiers dans un LSTM et entraîner le modèle pour prédire la distribution de probabilité du mot suivant. Enfin, nous pouvons utiliser cette distribution de probabilité pour générer du texte continu.
Ce qui suit est un exemple de code pour implémenter LSTM pour générer du texte :
import numpy as np import sys import io from keras.models import Sequential from keras.layers import Dense, LSTM, Dropout from keras.callbacks import ModelCheckpoint from keras.utils import np_utils # 读取文本文件并将其转换为整数 with io.open('text.txt', encoding='utf-8') as f: text = f.read() chars =list(set(text)) char_to_int = dict((c, i) for i, c in enumerate(chars)) # 将文本分割成固定长度的序列 seq_length = 100 dataX = [] dataY = [] for i in range(0, len(text) - seq_length, 1): seq_in = text[i:i + seq_length] seq_out = text[i + seq_length] dataX.append([char_to_int[char] for char in seq_in]) dataY.append(char_to_int[seq_out]) n_patterns = len(dataX) # 将数据转换为适合LSTM的格式 X = np.reshape(dataX, (n_patterns, seq_length, 1)) X = X / float(len(chars)) y = np_utils.to_categorical(dataY) # 定义LSTM模型 model = Sequential() model.add(LSTM(256, input_shape=(X.shape[1], X.shape[2]), return_sequences=True)) model.add(Dropout(0.2)) model.add(LSTM(256)) model.add(Dropout(0.2)) model.add(Dense(y.shape[1], activation='softmax')) model.compile(loss='categorical_crossentropy', optimizer='adam') # 训练模型 filepath="weights-improvement-{epoch:02d}-{loss:.4f}.hdf5" checkpoint = ModelCheckpoint(filepath, monitor='loss', verbose=1, save_best_only=True, mode='min') callbacks_list = [checkpoint] model.fit(X, y, epochs=20, batch_size=128, callbacks=callbacks_list) # 使用模型生成文本 int_to_char = dict((i, c) for i, c in enumerate(chars)) start = np.random.randint(0, len(dataX)-1) pattern = dataX[start] print("Seed:") print("\"", ''.join([int_to_char[value] for value in pattern]), "\"") for i in range(1000): x = np.reshape(pattern, (1, len(pattern), 1)) x = x / float(len(chars)) prediction = model.predict(x, verbose=0) index = np.argmax(prediction) result = int_to_char[index] seq_in = [int_to_char[value] for value in pattern] sys.stdout.write(result) pattern.append(index) pattern = pattern[1:len(pattern)]
Dans le code ci-dessus, nous lisons d'abord le fichier texte via la bibliothèque io et mappons chaque caractère à un entier unique. Nous divisons ensuite le texte en séquences de longueur 100 et convertissons ces séquences dans un format adapté au LSTM. Ensuite, nous définissons un modèle contenant deux couches LSTM et une couche entièrement connectée, en utilisant softmax comme fonction d'activation pour calculer la distribution de probabilité du caractère suivant. Enfin, nous utilisons la méthode fit pour entraîner le modèle et la méthode prédictive pour générer du texte continu.
Lorsque nous utilisons le modèle pour générer du texte, nous sélectionnons d'abord au hasard une séquence dans l'ensemble de données comme point de départ. Nous utilisons ensuite le modèle pour prédire la distribution de probabilité du caractère suivant et sélectionnons le caractère avec la probabilité la plus élevée comme caractère suivant. Ensuite, nous ajoutons ce caractère à la fin de la séquence et supprimons le caractère au début de la séquence, en répétant les étapes ci-dessus jusqu'à ce que nous ayons généré 1 000 caractères de texte.
En général, LSTM est une variante des réseaux de neurones récurrents spécifiquement conçus pour résoudre les problèmes de dépendance à long terme. En utilisant des unités fermées pour contrôler le flux des entrées, des sorties et des états internes, LSTM est en mesure d'éviter le problème de la disparition ou de l'explosion des gradients, permettant ainsi des applications telles que la génération de texte continu.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!