मेरा कोड इस त्रुटि को उत्पन्न करता प्रतीत होता है जब "input_data" 4000 से अधिक लंबा होता है। लेकिन मैं इसे 180,000 लंबी सरणी पर प्रशिक्षित करना चाहता हूं। मैंने अभी एक टेक्स्ट जनरेशन क्लास समाप्त की है और अपने मॉडल को कुछ एमिनेम गीत बनाने की कोशिश कर रहा हूं, और यह वास्तव में केवल एमिनेम के सभी शब्दों के लगभग 5% (180k में से 4k) का उपयोग करके बहुत बुरा नहीं कर रहा है।

'''

import tensorflow as tf
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences

import string
import numpy as np
import pandas as pd


# Eminem lyrics https://www.kaggle.com/thaddeussegura/eminem-lyrics-from-all-albums

from urllib.request import urlopen

data = urlopen('https://storage.googleapis.com/kagglesdsdata/datasets/835677/1426970/eminem_lyrics/ALL_eminem.txt?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=gcp-kaggle-com%40kaggle-161607.iam.gserviceaccount.com%2F20200924%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20200924T201536Z&X-Goog-Expires=259199&X-Goog-SignedHeaders=host&X-Goog-Signature=9e8afd7dba5915b209e33905c68e93f2bfb1d3baac9456e1a0d16d1b74a0b482baa26bb6f348c2f901b46b63555b1a2bcc900c9db7d17321c27fe4578cc5d12463ca6b3e7c8998cf66a05a33b4b324dba3e48341d010f13a423debb8d1c2f52536870a9cc3ddfa72a4ca9bda874e934bcfdd21512e413e068bbd8c0a2a4042df66358d978080d164ead2f9e0edf1eee4bf66cf2f5c0aa63a5b7e9cea80ca6c211a0558aca9e7671235f105074f5f3f74abb882001acec29573c84b8ed9bf044b7233fb270a12fefe01bd40fe64b44cc0b89d54469357719d14404bb3c6033961c25af43c5c5f9c20fc090cf38fe03946058ecb9b67ebdfe4022c564480a2c73c').read().decode('utf-8')


# split
text = data.split()

# remove puctuation, make all lowercase
dataset = []
import re
for s in text:
    s = re.sub(r'[^\w\s]','',s).lower()
    dataset.append(s)


def tokenize_corpus(corpus, num_words=-1):
  # Fit a Tokenizer on the corpus
  if num_words > -1:
    tokenizer = Tokenizer(num_words=num_words)
  else:
    tokenizer = Tokenizer()
  tokenizer.fit_on_texts(corpus)
  return tokenizer

# Tokenize the corpus
tokenizer = tokenize_corpus(dataset)

total_words = len(tokenizer.word_index) + 1
print(total_words)


# get inputs and outputs
input_data = []
labels = []
for i in range(180000):
    tokens = np.array(sum(tokenizer.texts_to_sequences(dataset[i:i+11]), []))
    input_data.append(tokens[:-1])
    labels.append(tokens[-1])

input_data = np.array(input_data)
labels = np.array(labels)

#print(input_data)
#print(labels)

# One-hot encode the labels
one_hot_labels = tf.keras.utils.to_categorical(labels, num_classes=total_words)

मैंने 'input_data' को टेंसर में बदलने की भी कोशिश की, इसे अलग-अलग प्रकार का बना दिया, आदि और यह केवल सभी प्रकार की विभिन्न त्रुटियां पैदा करता है। लेकिन अगर १८०००० को ४००० से कम में बदल दें तो सब कुछ ठीक काम करता है

यदि मॉडल एक साथ सभी १८०,००० अनुक्रमों को संसाधित नहीं कर सकता है, तो क्या मैं इसे ४००० प्रत्येक के ४५ सरणियों में तोड़ सकता हूँ और प्रत्येक पर ५-१० युगों के लिए प्रशिक्षित कर सकता हूँ?

आदर्श:

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Embedding, LSTM, Dense, Bidirectional

model = Sequential()
model.add(Embedding(total_words, 64, input_length=10))
model.add(Bidirectional(LSTM(32)))
model.add(Dense(total_words, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
history = model.fit(input_data, one_hot_labels, epochs=100, verbose=1)

अंतिम पंक्ति त्रुटि देती है, शायद मुझे मॉडल में ही कुछ बदलना चाहिए?

बाकी यहाँ लेकिन "seed_text" को सिर्फ क्लास लैब से कॉपी किया गया है:

seed_text = "im feeling chills getting these bills still while having meal"
next_words = 100
  
for _ in range(next_words):
  token_list = tokenizer.texts_to_sequences([seed_text])[0]
  token_list = pad_sequences([token_list], maxlen=10, padding='pre')
  predicted_probs = model.predict(token_list)[0]
  predicted = np.random.choice([x for x in range(len(predicted_probs))],
                               p=predicted_probs)
  output_word = ""
  for word, index in tokenizer.word_index.items():
    if index == predicted:
      output_word = word
      break
  seed_text += " " + output_word
print(seed_text)

कृपया इस त्रुटि को हल करने में मदद करें, और मुझे बताएं कि क्या आपके पास कोई विचार है कि मैं समग्र रूप से मॉडल को कैसे सुधार सकता हूं।

0
Petr Frolkin 25 सितंबर 2020, 22:33

1 उत्तर

सबसे बढ़िया उत्तर

मैंने पाया कि लगभग ४००० शब्दों के बाद, किसी कारण से, टोकननाइज़र अलग-अलग लंबाई के टेंसर (निर्दिष्ट के अनुसार १० नहीं) का उत्पादन शुरू करता है, इसलिए इसे पैडिंग के लिए कोड की एक और लाइन की आवश्यकता होती है:

padded = pad_sequences(input_data, maxlen=10, padding="pre")
0
Petr Frolkin 4 अक्टूबर 2020, 02:40