मेरा कोड इस त्रुटि को उत्पन्न करता प्रतीत होता है जब "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)
कृपया इस त्रुटि को हल करने में मदद करें, और मुझे बताएं कि क्या आपके पास कोई विचार है कि मैं समग्र रूप से मॉडल को कैसे सुधार सकता हूं।
1 उत्तर
मैंने पाया कि लगभग ४००० शब्दों के बाद, किसी कारण से, टोकननाइज़र अलग-अलग लंबाई के टेंसर (निर्दिष्ट के अनुसार १० नहीं) का उत्पादन शुरू करता है, इसलिए इसे पैडिंग के लिए कोड की एक और लाइन की आवश्यकता होती है:
padded = pad_sequences(input_data, maxlen=10, padding="pre")
संबंधित सवाल
नए सवाल
python
पायथन एक बहु-प्रतिमान है, गतिशील रूप से टाइप किया हुआ, बहुउद्देशीय प्रोग्रामिंग भाषा है। यह एक साफ और एक समान वाक्यविन्यास सीखने, समझने और उपयोग करने के लिए त्वरित होने के लिए डिज़ाइन किया गया है। कृपया ध्यान दें कि अजगर 2 आधिकारिक तौर पर 01-01-2020 के समर्थन से बाहर है। फिर भी, संस्करण-विशिष्ट पायथन सवालों के लिए, [अजगर -२.०] या [अजगर -३.x] टैग जोड़ें। पायथन वेरिएंट (जैसे, ज्योथन, PyPy) या लाइब्रेरी (उदा।, पांडस और न्यूमपी) का उपयोग करते समय, कृपया इसे टैग में शामिल करें।