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

ظهور الخطأ ValueError: Error when checkingModelTarget: expected dense_3 to haveFast (None, 1) but got array with shape (10000, 10)  في كيراس Keras

السؤال

نشر (معدل)

قمت ببناء النموذج التالي، لكن لم أفهم سبب الخطأ؟ حيث بعد أن دربته قمت بحفظه ثم قمت بإعادة تحميله و تنفيذ compile له. علماً أنني أتعامل مع مجموعة بيانات MINST الشهيرة.

K.set_image_dim_ordering('th')
numpy.random.seed(7)
from keras.datasets import mnist
# تحميل البيانات
(X_train, y_train), (X_test, y_test) = mnist.load_data()
# تحضير البيانات
X_train = X_train.reshape(X_train.shape[0], 1, 28, 28)
X_test = X_test.reshape(X_test.shape[0], 1, 28, 28)
X_train=X_train.astype('float32')/ 255.0
X_test=X_test.astype('float32')/ 255.0
#label ترميز ال
y_train = np_utils.to_categorical(y_train)
y_test = np_utils.to_categorical(y_test)
model = Sequential()
model.add(Convolution2D(32, 3, 3, input_shape=(1, 28, 28), activation='tanh'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Convolution2D(16, 3, 3, activation='tanh'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.4))
model.add(Flatten())
model.add(Dense(100, activation='tanh'))
model.add(Dense(y_test.shape[1], activation='softmax'))
# تجميع المعلومات
model.compile(loss='categorical_crossentropy', optimizer='rmsprop', metrics=['acc'])
# بناء النموذج
model = larger_model()
# تدريبه
model.fit(X_train, y_train, epochs=12, batch_size=128,validation_data=(X_test, y_test))
# تقييم النموذج
scores = model.evaluate(X_test, y_test)
print("Baseline Error: %.2f%%" % (100-scores[1]*100))
# حفظه
model_json = model.to_json()
with open('mnist_model.json', 'w') as f:
    f.write(model_json)
model.save_weights("mnist_weights.h5")
# تحميله
with open('mnist_model.json') as f:
    model_json = f.read()
model = model_from_json(model_json)
model.load_weights('mnist_weights.h5')
# تجميع المعلومات
model.compile(loss='sparse_categorical_crossentropy', optimizer='rmsprop', metrics=['acc'])
scores = model.evaluate(X_test, y_test)
print("Baseline Error: %.2f%%" % (100-scores[1]*100))

 

تم التعديل في بواسطة Chollet ML

Recommended Posts

  • 1
نشر

المشكلة تكمن في شكل ترميز البيانات وعدم استخدامك لدالة loss مناسبة لحسابها، وهذا الاختلاف ما بين sparse_categorical_crossentropy  و categorical_crossentropy حيث ان categorical_crossentropy تتوقع ان الترميز بين 0 و 1، وهو الشكل الذي قمت بالترميز اليه سابقا.

لذلك كل ما عليك هو تعديل 

loss='sparse_categorical_crossentropy'

لتصبح:

loss='categorical_crossentropy'

ويكون الكود السليم كالتالي:

K.set_image_dim_ordering('th')
numpy.random.seed(7)
from keras.datasets import mnist
# تحميل البيانات
(X_train, y_train), (X_test, y_test) = mnist.load_data()
# تحضير البيانات
X_train = X_train.reshape(X_train.shape[0], 1, 28, 28)
X_test = X_test.reshape(X_test.shape[0], 1, 28, 28)
X_train=X_train.astype('float32')/ 255.0
X_test=X_test.astype('float32')/ 255.0
#label ترميز ال
y_train = np_utils.to_categorical(y_train)
y_test = np_utils.to_categorical(y_test)
model = Sequential()
model.add(Convolution2D(32, 3, 3, input_shape=(1, 28, 28), activation='tanh'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Convolution2D(16, 3, 3, activation='tanh'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.4))
model.add(Flatten())
model.add(Dense(100, activation='tanh'))
model.add(Dense(y_test.shape[1], activation='softmax'))
# تجميع المعلومات
model.compile(loss='categorical_crossentropy', optimizer='rmsprop', metrics=['acc'])
# بناء النموذج
model = larger_model()
# تدريبه
model.fit(X_train, y_train, epochs=12, batch_size=128,validation_data=(X_test, y_test))
# تقييم النموذج
scores = model.evaluate(X_test, y_test)
print("Baseline Error: %.2f%%" % (100-scores[1]*100))
# حفظه
model_json = model.to_json()
with open('mnist_model.json', 'w') as f:
    f.write(model_json)
model.save_weights("mnist_weights.h5")
# تحميله
with open('mnist_model.json') as f:
    model_json = f.read()
model = model_from_json(model_json)
model.load_weights('mnist_weights.h5')
# تجميع المعلومات
model.compile(loss='categorical_crossentropy', optimizer='rmsprop', metrics=['acc'])
scores = model.evaluate(X_test, y_test)
print("Baseline Error: %.2f%%" % (100-scores[1]*100))

 

  • 1
نشر

الخطأ في استخدامك ل sparse_categorical_crossentropy في تجميع النموذج بعد أن قمت بتحميله. إن نموذجك الأساسي يستخدم categorical_crossentropy الذي يتعامل مع أهداف "target" مرمزة بترميز One-Hot. وهذا ماتم من خلال التابع np.utils.to_categorical بينما sparse_categorical_crossentropy تتوقع منك أن يكون ترميز الأهداف بالترميز الصحيح Integer Encoding ولهذا السبب يحتج كيراس لاستخدامك sparse_categorical_crossentropy. حيث يتوقع أبعاد (1, ؟) لل y_test، بينما أنت تقدم له أبعاد (10, ؟) لذا يجب أن تستخدم هنا categorical_crossentropy:

model.compile(
  ...,
  loss='categorical_crossentropy'
)

أو:

y_test = np.argmax(y_test)

وهناك مسألة مشابهة لها تجدها في هذا الرابط:
https://academy.hsoub.com/questions/16732-ظهور-الخطأ invalidargumenterror- logits-and-labels-must-have-the-same-first-dimension-في-كيراس-keras/

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...