اذهب إلى المحتوى

السؤال

نشر

قمت ببناء نموذج لتحليل المشاعر، لكن عند التدريب يظهر لي الخطأ التالي:

df_train = pd.read_csv('/content/drive/MyDrive/imdbdataset/Completely_clean_data.csv')
df_train.drop(df_train.filter(regex="Unname"),axis=1, inplace=True)
df_test = pd.read_csv('/content/drive/MyDrive/imdbdataset/Completely_clean_data_test.csv')
df_test.drop(df_test.filter(regex="Unname"),axis=1, inplace=True)
max_words = 75000
tokenizer = Tokenizer(num_words=max_words)
# fitting
tokenizer.fit_on_texts(pd.concat([df_test['review'], df_train['review']]))
#max_len=int(df["review_len"].mean()) #231 # do you remember!!
train = tokenizer.texts_to_sequences(df_train['review'])
test = tokenizer.texts_to_sequences(df_test['review'])
train = pad_sequences(train, maxlen=200)
test = pad_sequences(test, maxlen=200)
print("the shape of data train :",train.shape)
print("the shape of data test :",test.shape)
# model
def modelBiLSTM():
  max_words = 75000
  #drop_lstm =0.4
  embeddings=128
  model = Sequential()
  model.add(Embedding(10000, embeddings))
  model.add(Bidirectional(LSTM(64, activation='tanh'))) # 2D output
  model.add(Dense(1, activation='sigmoid')) # binary output
  return model
model=modelBiLSTM()
model.summary()
# training
model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['acc'])
history=model.fit(train, train_label,validation_split=0.12, batch_size=32, epochs=8)
---------------------------------------------------------------------------

InvalidArgumentError                      Traceback (most recent call last)

<ipython-input-13-850a3e320f47> in <module>()
      1 model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['acc'])
----> 2 history=model.fit(train, train_label,validation_split=0.12, batch_size=32, epochs=8)

6 frames

/usr/local/lib/python3.7/dist-packages/tensorflow/python/eager/execute.py in quick_execute(op_name, num_outputs, inputs, attrs, ctx, name)
     58     ctx.ensure_initialized()
     59     tensors = pywrap_tfe.TFE_Py_Execute(ctx._handle, device_name, op_name,
---> 60                                         inputs, attrs, num_outputs)
     61   except core._NotOkStatusException as e:
     62     if name is not None:

InvalidArgumentError:  indices[28,152] = 57171 is not in [0, 10000)
	 [[node sequential_2/embedding_2/embedding_lookup (defined at /usr/local/lib/python3.7/dist-packages/keras/layers/embeddings.py:184) ]] [Op:__inference_train_function_12661]

Errors may have originated from an input operation.
Input Source operations connected to node sequential_2/embedding_2/embedding_lookup:
 sequential_2/embedding_2/embedding_lookup/10350 (defined at /usr/lib/python3.7/contextlib.py:112)	
 sequential_2/embedding_2/Cast (defined at /usr/local/lib/python3.7/dist-packages/keras/layers/embeddings.py:183)

Function call stack:
train_function

 

Recommended Posts

  • 1
نشر

المشكلة تحدث في طبقة التضمين Embedding.
هذه الطبقة تأخذ وسيطين على الأقل الأول هو عدد ال tokens (المفردات) الموجودة في بياناتك أي (1 + maximum word index) والثاني هو dimensionality of the embeddings أي أبعاد التضمين.
يمكن اعتبار طبقة التضمين قاموس يقوم بربط أعداد صحيحة (كل عدد يمثل كلمة) بأشعة كثيفة.
"maps integer indices,(which stand for specific words) to dense vectors"
وبالتالي يأخذ كمدخل له عدد صحيح ثم يبحث عن هذا العدد في قاموسه ثم يرد الشعاع المقابل له.
Word index --> Embedding layer --> Corresponding word vector 
أنت ماذا فعلت؟! أنت قمت بتحديد عدد المفردات بالنص الخاص بك إلى 75000 كلمة فريدة، ثم قمت بتحديد 10000 كلمة في طبقة التضمين وهذا سينتج خطأ لأن الكلمات الموجودة في بياناتك أكثر بكثير وبالتالي لن يجد هذه الكلمات في قاموسه الداخلي وبالتالي ينتج خطأ.
لحل المشكلة يجب أن تتم مطابقتهما أي إذا حددت عدد الكلمات التي ستبقى في نصك في مرحلة ال tokenaization ب 75000 فيجب أن تحدد 75000 في طبقة التضمين أيضاً.
التصحيح:

df_train = pd.read_csv('/content/drive/MyDrive/imdbdataset/Completely_clean_data.csv')
df_train.drop(df_train.filter(regex="Unname"),axis=1, inplace=True)
df_test = pd.read_csv('/content/drive/MyDrive/imdbdataset/Completely_clean_data_test.csv')
df_test.drop(df_test.filter(regex="Unname"),axis=1, inplace=True)
max_words = 75000
tokenizer = Tokenizer(num_words=max_words)
# fitting
tokenizer.fit_on_texts(pd.concat([df_test['review'], df_train['review']]))
#max_len=int(df["review_len"].mean()) #231 # do you remember!!
train = tokenizer.texts_to_sequences(df_train['review'])
test = tokenizer.texts_to_sequences(df_test['review'])
train = pad_sequences(train, maxlen=200)
test = pad_sequences(test, maxlen=200)
print("the shape of data train :",train.shape)
print("the shape of data test :",test.shape)
# model
def modelBiLSTM():
  max_words = 75000
  #drop_lstm =0.4
  embeddings=128
  model = Sequential()
    # الإصلاح
  model.add(Embedding(max_words, embeddings))
  model.add(Bidirectional(LSTM(64, activation='tanh'))) # 2D output
  model.add(Dense(1, activation='sigmoid')) # binary output
  return model
model=modelBiLSTM()
model.summary()
# training
model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['acc'])
history=model.fit(train, train_label,validation_split=0.12, batch_size=32, epochs=8)

 

  • 1
نشر

قيمة vocab_size أو max_words أو num_words  تشير في طبقة ال embedding إلى عدد الكلمات الكلي التي تم تحويلها إلى قيم رقمية و الذي يجب أن يساوي  maximum integer index + 1. لاحظ شكل الطبقة:

tf.keras.layers.Embedding(
    input_dim,
    output_dim,
    embeddings_initializer="uniform",
    embeddings_regularizer=None,
    activity_regularizer=None,
    embeddings_constraint=None,
    mask_zero=False,
    input_length=None,
    **kwargs
)

والان لنأخذ مثال:

from numpy import array
from keras.preprocessing.text import one_hot
from keras.preprocessing.sequence import pad_sequences
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Flatten
from keras.layers.embeddings import Embedding
# تعريف المدخلات كملفات تحتوي على كلمات
docs = ['Well done!',
		'Good work',
		'Great effort',
		'nice work',
		'Excellent!',
		'Weak',
		'Poor effort!',
		'not good',
		'poor work',
		'Could have done better.']
# تحديد صنف لكل ملف من الملفات السابقة
labels = array([1,1,1,1,1,0,0,0,0,0])
# هنا قمنا بتحديد القيمة 50 كطول للبيانات المدخلة، بالتالي أي كلمة يتم تحويلها لقيمة رقمية مقابلة لها
# بأي حال من الأحوال يجب أن تكون القيمة أعلى من العدد الكلي للكلمات المختلفة حتى لا يحصل تصادم
vocab_size = 50
encoded_docs = [one_hot(d, vocab_size) for d in docs]
print(encoded_docs)
# كل ملف يحتوي على كلمات أقل من العدد الذي تم تحديده هنا 4 يتم إضافة أصفار فيه لتصبح كل المدخلات من نفس الطول 4
max_length = 4
padded_docs = pad_sequences(encoded_docs, maxlen=max_length, padding='post')
print(padded_docs)
# تعريف النموذج
model = Sequential()
model.add(Embedding(vocab_size, 8, input_length=max_length))
model.add(Flatten())
model.add(Dense(1, activation='sigmoid'))
# تنفيذ النموذج
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
# تلخيص النموذج
print(model.summary())
# تدريب النموذج
model.fit(padded_docs, labels, epochs=50, verbose=0)
# تقييم النموذج
loss, accuracy = model.evaluate(padded_docs, labels, verbose=0)
print('Accuracy: %f' % (accuracy*100))

لاحظ أننا قمنا بتمرير vocab_size إلي طبقة التضمين embedding layer بنفس الطول الذي تم تحديده مسبقاً لترميز البيانات، بالتالي يوجد تطابق ولا ينتج الخطأ السابق.

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...