• 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

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 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/

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية

يجب أن تكون عضوًا لدينا لتتمكّن من التعليق

انشاء حساب جديد

يستغرق التسجيل بضع ثوان فقط


سجّل حسابًا جديدًا

تسجيل الدخول

تملك حسابا مسجّلا بالفعل؟


سجّل دخولك الآن