Ratkaistu: toistuva neuroverkko pytorch

Viimeisin päivitys: 09/11/2023

toistuva neuroverkko Recurrent Neural Networks (RNN:t) on eräänlainen keinotekoinen hermoverkko, joka on suunniteltu käsittelemään ja analysoimaan datasarjoja. Ne ovat osoittautuneet erityisen hyödyllisiksi erilaisissa sovelluksissa, mukaan lukien luonnollisen kielen käsittelyssä, puheentunnistuksessa ja aikasarjan ennustamisessa. Tässä artikkelissa sukeltamme syvälle RNN:ien maailmaan, tutkimme, kuinka ne ratkaisevat peräkkäisen tietojenkäsittelyn ongelman, ja käymme läpi yksinkertaisen RNN:n vaiheittaisen toteutuksen Pythonissa.

Toistuvien hermoverkkojen ymmärtäminen

A Toistuva hermoverkko on eräänlainen hermoverkko, joka sisältää silmukoita, jotka mahdollistavat tiedon säilymisen useissa aikavaiheissa. Tämä on erityisen hyödyllistä käsiteltäessä datasarjoja, joissa elementtien järjestyksellä ja ajoituksella on ratkaiseva rooli taustalla olevien kuvioiden ymmärtämisessä. Perinteisissä feedforward-hermoverkoissa tätä kykyä ei ole, koska ne käsittelevät syötteitä itsenäisesti eikä yhden kerroksen lähtöä syötetä takaisin itseensä.

Yksi RNN:n avainkomponenteista on piilotettu tila, joka on esitys sekvenssin edellisistä elementeistä. Piilotettu tila päivitetään jokaisessa aikavaiheessa ottaen huomioon sekä nykyinen syöte että edellinen piilotettu tila. Tämän ansiosta RNN:t voivat kaapata ja oppia kuvioita, jotka ulottuvat useille aikavaiheille, ja mukauttaa käyttäytymistään sekvenssin koko kontekstin perusteella.

Yksinkertaisen RNN:n käyttöönotto Pythonissa

Tässä osiossa toteutamme yksinkertaisen RNN:n käyttämällä Pythonia ja Tensorflowa, suosittua syväoppimiskirjastoa. Tavoitteenamme on luoda RNN, joka voi ennustaa tekstin seuraavan merkin, kun syötetään tekstinpätkä.

import tensorflow as tf
import numpy as np

# Preprocess the text data
text = "The quick brown fox jumps over the lazy dog."
chars = sorted(set(text))
char_to_index = {char: index for index, char in enumerate(chars)}
index_to_char = {index: char for index, char in enumerate(chars)}

# Prepare the input and output sequences
sequence_length = 10
input_sequences = []
output_sequences = []
for i in range(0, len(text) - sequence_length):
  input_sequences.append([char_to_index[c] for c in text[i:i + sequence_length]])
  output_sequences.append(char_to_index[text[i + sequence_length]])

input_sequences = np.array(input_sequences)
output_sequences = np.array(output_sequences)

# Build the RNN model
model = tf.keras.Sequential([
  tf.keras.layers.Embedding(len(chars), 8, input_length=sequence_length),
  tf.keras.layers.SimpleRNN(16, return_sequences=False, activation="tanh"),
  tf.keras.layers.Dense(len(chars), activation="softmax")
])

model.compile(optimizer="adam", loss="sparse_categorical_crossentropy", metrics=["accuracy"])

Yllä olevassa koodissa tuomme ensin tarvittavat kirjastot ja esikäsittelemme tekstitiedot. Tekstidata muunnetaan sitten syöttö- ja lähtösarjoiksi.

RNN-malli on rakennettu Tensorflow:n Keras API:lla. Luomme ensin upotuskerroksen hahmojen yhdistämiseksi jatkuvaan vektoriavaruuteen, jota seuraa SimpleRNN-taso, jossa on 16 piilotettua yksikköä. Lopuksi lisätään tiheä kerros, jossa on softmax-aktivointitoiminto, joka luo lopulliset todennäköisyydet jokaiselle merkille.

RNN:n koulutus ja testaus

Kun mallimme on rakennettu, voimme harjoitella sitä syötesarjoilla ja niitä vastaavilla output_sequencesilla.

# Train the model
model.fit(input_sequences, output_sequences, epochs=100, batch_size=1)

# Generate a new text sequence from the trained model
seed = "The quick "
input_seed = np.array([[char_to_index[c] for c in seed]])
output_chars = []
for _ in range(sequence_length):
  predictions = model.predict(input_seed)
  next_char = index_to_char[np.argmax(predictions)]
  output_chars.append(next_char)
  input_seed = np.roll(input_seed, -1)
  input_seed[-1] = char_to_index[next_char]

generated_text = "".join(output_chars)
print(seed + generated_text)

RNN on koulutettu käyttämällä Adam-optimoijaa ja harvaa kategorista crossentropiahäviötä. Harjoittelun jälkeen luomme uuden tekstisekvenssin syöttämällä koulutetulle RNN:lle alkutekstiä ja ennustamalla seuraavan merkin, päivittämällä sitten syötteen ennustetulla merkillä ja jatkamalla tätä prosessia halutun pituuden ajan.

Yhteenvetona voidaan todeta, että toistuvat hermoverkot ovat tehokas työkalu peräkkäisten tietojen käsittelyyn, monimutkaisten suhteiden kaappaamiseen useissa aikavaiheissa. Toteuttamalla yksinkertaisen RNN:n Pythonissa osoitimme niiden potentiaalin tekstin luontitehtäviin. Näitä malleja voidaan laajentaa ja parantaa useiden sekvenssien välisten ongelmien ratkaisemiseksi, mikä tekee niistä keskeisen osan syväoppimisen alalla.

Related viestiä: