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

السؤال

نشر

قمت ببناء النموذج التالي، لكن أتلقى رسالة الخطأ التالية، فما هي المشكلة:

from keras.datasets import imdb
from keras import preprocessing
max_features = 1000
(x_train, y_train), (x_test, y_test) = imdb.load_data(
num_words=max_features)
x_train = preprocessing.sequence.pad_sequences(x_train) 
x_test = preprocessing.sequence.pad_sequences(x_test)
from keras.models import Sequential
from keras.layers import Flatten, Dense,Embedding
model = Sequential()
model.add(Embedding(1000, 8))
model.add(Flatten())
model.add(Dense(64, activation='tanh'))
model.add(Dense(1, activation='sigmoid')) 
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['acc'])
history = model.fit(x_train, y_train,
epochs=3,
batch_size=64,
validation_split=0.2)
--------------------------------------------------------------------------------------------------
ValueError: The last dimension of the inputs to `Dense` should be defined. Found `None`.

 

Recommended Posts

  • 1
نشر

عند بناء النماذج، يجب أن تقوم دوماً بتحديد حجم الإدخال الذي ستتعامل معه شبكتك، وأنت هنا لم تقم بتحديده فظهرت المشكلة. حقيقةً وبشكل عام، عند بناء الشبكات العصبية ينبغي علينا تحديد حجم الدخل لكل طبقة لكن كيراس تغنيك عن ذلك فيكفي أن تعطيها حجم الإدخال لأول طبقة وهي ستستنتج حجم الإدخال لباقي الطبقات. حسناً أنت تتعامل مع مهمة NLP ولديك بيانات كل عينة فيها عبارة عن مستند نصي مؤلف من عدد مختلف من الكلمات،وكونك قمت بتحميلها من كيراس فهي تكون مرمزة بأعداد صحيحة مسبقاً (كل كلمة يقابلها عدد صحيح) وبالتالي قمت أولاً بحشوها لكي تكون جميعها بنفس الحجم (خطوة إجبارية) لكنك لم تحدد الطول الأعظمي لل padseq وبالتالي سيختار افتراضياً طول أطول مستند (في حالتك فإن أطول مستند طوله 2494) أي كل عينات بياناتك سيكون حجمها 2494 (بعد الحشو بأصفار) وبالتالي يكون حجم الإدخال لديك هو (عدد العينات,عدد الفيتشرز) وعدد الفيتشرز هنا أو "السمات" features هو طول التسلسلات أي 2494. لذا يجب أن تقوم بتحديده لشبكتك. طبعاً عدد العينات لامشكلة في عدم تحديده فأيضاً يستطيع كيراس استنتاجه. وبالتالي يكون حل مشكلتك إما باستخدام الوسيط input_length كونك تتعامل مع طبقة NLP أو من خلال input_shape كالتالي:

from keras.datasets import imdb
from keras import preprocessing
max_features = 1000
# حدد حجم الإدخال الذي تريده
maxlen = 20
(x_train, y_train), (x_test, y_test) = imdb.load_data(
num_words=max_features)
# حدد طول التسلسل الذي تريده
x_train = preprocessing.sequence.pad_sequences(x_train,maxlen=maxlen) 
x_test = preprocessing.sequence.pad_sequences(x_test, maxlen=maxlen)
from keras.models import Sequential
from keras.layers import Flatten, Dense,Embedding
model = Sequential()
# قم الآن بتعريف حجم طبقة الإدخال لشبكتك
model.add(Embedding(1000, 8, input_shape=(maxlen,))) 
# أو  
# model.add(Embedding(1000, 8, input_length=maxlen)) 
model.add(Flatten())  
model.add(Dense(64, activation='tanh'))
model.add(Dense(1, activation='sigmoid')) 
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['acc'])
history = model.fit(x_train, y_train,
epochs=3,
batch_size=64,
validation_split=0.2)

,طبعاً يفضل أن تمرر لتابع ال padseq طول التسلسل (الطول الأعظمي الذي تريده) لكي لايقوم باستخدام الطول الأكبر، فهذا قد يسبب لك مشاكل في التدريب (بطء شديد لاتخاذك طول كبير جداً)

  • 1
نشر (معدل)

في بداية بناء أي نموذج، عليك أن تقوم بتحديد شكل المدخلات للنموذج في أول طبقة وذلك حتى يستطيع أن يتعامل مع شكل البيانات المدخلة. في باقي الطبقات بعد الطبقة الاولى، لست بحاجة الى تعريف شكل المدخلات بنفسك، وذلك لانه يقوم بتمرير البيانات من طبقة الى الاخرى دون الاحتياج الى اى تدخل خارجي.

لتعريف المدخلات للنموذج، نقوم بتمرير ال parameter التالي:

input_shape(input-shape)

حيث يوضع بين الاقواس شكل البيانات المدخلة، وهذا يتم فقط في أول طبقة من النموذج.

يجب عليك أن تنظر الي شكل البيانات المدخلة والتي تكون محكومة بشكل ال dataset، هنا أنت تستخدم imdb dataset ، لو تفحصت في شكلها، سجد أن حجم ال feature الذي تحتوية هو 2494، يمكنك أدخالهم مره واحدة لكن هذا قد يسبب بطئ في النموذج، لذلك سنقوم بتقسيمها الي 50.  لذلك للتغلب على المشكلة الظاهرة، يمكننها تعديلها في الكود لتصبح كالتالي

from keras.datasets import imdb
from keras import preprocessing
max_features = 1000
datalength = 50 #حجم البيانات المدخلة
(x_train, y_train), (x_test, y_test) = imdb.load_data(
num_words=max_features)
x_train = preprocessing.sequence.pad_sequences(x_train,datalength=datalength) 
x_test = preprocessing.sequence.pad_sequences(x_test, datalength=datalength)
from keras.models import Sequential
from keras.layers import Flatten, Dense,Embedding
model = Sequential()  
model.add(Embedding(1000, 8, input_length=datalength)) #تعريف حجم البيانات المدخلة
model.add(Flatten())  
model.add(Dense(64, activation='tanh'))
model.add(Dense(1, activation='sigmoid')) 
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['acc'])
history = model.fit(x_train, y_train,
epochs=3,
batch_size=64,
validation_split=0.2)

:

تم التعديل في بواسطة Ahmed Sharshar

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...