Pull to refresh

Comments 3

Я и ChatGPT написали что-то похожее, при этом текст получается даже лучше. Возможно из-за того, что я использовал символы, а не буквы и/или нестандартный метод обучения, пока модель не обучится до нужного уровня точности. Так же сыграла сложная архитектура нейронной сети.

Моя модель обучается не только генерировать слова, учитывая все буквы, она запоминает знаки препинания и переходы на следующие строки. Единственная проблема — все буквы будут маленькими.

import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Embedding, Bidirectional, LSTM, Dense, Flatten, GlobalMaxPooling1D
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences
import numpy as np

# Определим функцию для создания модели
def create_model(total_words, max_sequence_len):
    model = Sequential()
    model.add(Embedding(total_words, 1000, input_length=max_sequence_len-1))
    model.add(Bidirectional(LSTM(1000, return_sequences=True)))
    model.add(GlobalMaxPooling1D())
    model.add(Flatten())
    model.add(Dense(1000, activation='relu'))
    model.add(Dense(total_words, activation='softmax'))
    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
    return model

# Обучающие данные (нужно заполнить данными)
TextData = """
"""

# Подготовка данных
tokenizer = Tokenizer(char_level=True)
tokenizer.fit_on_texts(TextData)
total_chars = len(tokenizer.word_index) + 1
max_sequence_len = 50

input_sequences = []
for i in range(0, len(TextData) - max_sequence_len, 1):
    sequence = TextData[i:i + max_sequence_len]
    input_sequences.append(sequence)

input_sequences = tokenizer.texts_to_sequences(input_sequences)
input_sequences = np.array(input_sequences)
xs, labels = input_sequences[:, :-1], input_sequences[:, -1]
ys = tf.keras.utils.to_categorical(labels, num_classes=total_chars)

# Создание и обучение модели
model = create_model(total_chars, max_sequence_len)
accuracy = 0
epochs = 0
while accuracy < 0.7:
    model.fit(xs, ys, epochs=1, verbose=1)
    loss, accuracy = model.evaluate(xs, ys, verbose=0)
    epochs += 1

# Сохранение модели
model.save('TextGenerator3000.h5')

# Генерация текста
def generate_text(seed_text, next_chars, model, max_sequence_len):
    generated_text = seed_text
    for _ in range(next_chars):
        token_list = tokenizer.texts_to_sequences([seed_text])[0]
        token_list = pad_sequences([token_list], maxlen=max_sequence_len-1, padding='pre')

        predicted_probs = model.predict(token_list)[0]
        predicted = np.argmax(predicted_probs)
        output_char = tokenizer.index_word.get(predicted, "")
        seed_text += output_char
        generated_text += output_char

    return generated_text

# Генерация текста с использованием модели
while True:
    seed_text = input("Вы: ")
    next_chars = 500
    generated_text = generate_text(seed_text, next_chars, model, max_sequence_len)
    print(generated_text)

ChatGPT написал лишь основу кода с простой моделью, простым обучением на 10 эпохах и простой генерацией текста. Я добавил больше слоёв, изменил обучение до определенного уровня точности и добавил возможность использовать модель сколько угодно раз.

Можете поэкспериментировать с кодом, если захотите! Если у вас слабый ПК, то лучше просто уменьшить количество нейронов, например до 100 в каждом слое.

Можете привести пример того, что выдает ваша нейросеть на том же входящем запросе, что и в статье? Любопытно узнать, настолько может отличаться результат.

while accuracy < 0.7:

Ввод: я пишу продолжение

Вывод: я пишу продолжениется в в в а вот генарта тото в тотон3. в тотон3. в тотон3. в осьминог меняет окрастся ся сян сян, к хе прятаться от хищничо хищничо хищничо хищничо ...

TextData = """Осьминоги меняют свой окрас, сливаясь с окружением, что позволяет им охотиться и прятаться от хищников.

Протоны стабильны, поэтому вероятно период полураспада более 10^33 лет."""

В сгенерированном примере можно вполне понять, что написала нейросеть.

При ещё больших данных в TextData при точности 0.7 нейросеть показывает меньше ошибок и более осмысленный текст. Продемонстрирую, как только будет возможность использовать T4 TPU в гугл коллаб, где я обучаю её. На процессоре у себя на компьютере это медленно.

Важно не ставить точность на 0,99 или 1, так как это будет значить, что нейросеть просто запомнила текст и ничего нового не напишет.

Sign up to leave a comment.