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

ظهور الخطأ التالي ValueError: Shapes (None, 1) and (None, 6) are incompatible أثناء تعاملي مع مهمة تصنيف متعدد Multi-Classification

Meezo ML

السؤال

قمت ببناء نموذج تصنيف متعدد على مجمةعة بيانات x-ray scans لكن لا أفهم سبب الخطأ التالي في الكود:

# الكود
model = Sequential()
model.add(Conv2D(512, (3, 3), input_shape=X_train.shape[1:]))
model.add(Activation('tanh'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(128, (3, 3)))
model.add(Activation('tanh'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(1000))
model.add(Dense(64))
model.add(Dense(6))
model.add(Activation('softmax'))
model.compile(optimizer='rmsprop',loss='categorical_crossentropy',metrics=['acc'])
model.fit(X_train, y_label, batch_size=64, epochs=20, validation_split=0.2)
-------------------------------------------------------------------------------------------------
ValueError: Shapes (None, 1) and (None, 6) are incompatible

 

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

Recommended Posts

  • 3

في مسائل التصنيف المتعدد يجب أن تكون حذراً مع اختيار دالة الخسارة، والمشكلة هنا هي في اختيارك لدالة الخسارة، فعندما تكون بيانات y_true مرمزة بترميز One-Hot يجب أن نختار categorical_crossentropy أما إذا كانت بيانات y_true تتبع ترميزاً عادياً (أي كل صنف تم تمثيله بعدد صحيح 1,2,3...,class_n) فهنا يجب أن نختار دالة الخسارة sparse_categorical_crossentropy.

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

  • 1

بما أنك إخترت categorical_crossentropy لحساب نسبة الخسارة و من اخر طبقة في النموذج أتوقع أن القيم المصنفة تتبع ل6 أصناف مختلفة، لذا وجب تحويل قيم y إلى الترميز المقابل لها ويمكننا فعل ذلك بإستخدام to_categorical لاحظ للمثال التالي و الذي يقوم بتنفيذ عملية تدريب بإستخدام Conv2D على مجموعة بيانات MNIST وهي بيانات صورية ل10 أصناف تمثل الأرقام من 0 إلى 9:

import numpy as np
from tensorflow import keras
from tensorflow.keras import layers
from keras.datasets import mnist

(x_train, y_train),(x_test, y_test) = mnist.load_data()
print(x_train.shape, y_train.shape,x_test.shape, y_test.shape)
x_train = np.reshape(x_train, (-1, 28, 28, 1))
x_test = np.reshape(x_test, (-1, 28, 28, 1))
print(x_train.shape, y_train.shape,x_test.shape, y_test.shape)
# y تطبيق على قيم one hot encoding
y_train = to_categorical(y_train)
y_test = to_categorical(y_test)
print(x_train.shape, y_train.shape,x_test.shape, y_test.shape)

model = keras.Sequential(
    [
        keras.Input(shape=(28, 28, 1)),
        layers.Conv2D(32, kernel_size=(3, 3), activation="relu"),
        layers.MaxPooling2D(pool_size=(2, 2)),
        layers.Conv2D(64, kernel_size=(3, 3), activation="relu"),
        layers.MaxPooling2D(pool_size=(2, 2)),
        layers.Flatten(),
        layers.Dropout(0.5),
        layers.Dense(10, activation="softmax"),
    ]
)

model.compile(loss="categorical_crossentropy", optimizer="adam", metrics=["accuracy"])
model.fit(x_train, y_train,epochs=1, validation_split=0.1)

لاحظ مكان التعليق، قمنا بتحويل 1D y values ل 2D وهي عملية one hot encoding وهو التمثيل المقابل لقيم الأصناف لنقوم بعملية التدريب و التأكد.

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

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...