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

ظهور الخطأ ValueError: Shapes (32, 1) and (32, 2) are incompatible أثناء تدريب نموذج في Keras

Meezo ML

السؤال

اعمل على تصنيف الصور minst في keras على google colab ولكن قمت ببعض التعديلات على الداتا أي فقط صنفين 0 أو 1 ولكن يظهر لي الخطأ التالي
الكود:

import numpy as np
import pandas as pd
from keras.models import Sequential
from keras.layers import Dense , Activation, Dropout
from keras.models import Sequential
from keras.utils.np_utils import to_categorical
from keras.datasets import mnist
(x_train, y_train),(x_test, y_test) = mnist.load_data()
y_train[y_train<=5]=0
y_train[y_train>5]=1
y_train=y_train.astype('int64')
print(x_train.shape, y_train.shape)
image_size = x_train.shape[1]
input_size = image_size * image_size
x_train = np.reshape(x_train, [-1, input_size])
x_train = x_train.astype('float32') / 255
x_test = np.reshape(x_test, [-1, input_size])
x_test = x_test.astype('float32') / 255
batch_size = 32
hidden_units = 256
model = Sequential()
model.add(Dense(hidden_units, input_shape=(input_size,)))
model.add(Activation('relu'))
model.add(Dropout(0.45))
model.add(Dense(hidden_units))
model.add(Activation('relu'))
model.add(Dropout(0.45))
model.add(Dense(2))
model.add(Activation('softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(x_train, y_train, epochs=5, batch_size=batch_size)
الخطأ
(60000, 28, 28) (60000,)
Epoch 1/5

---------------------------------------------------------------------------

ValueError                                Traceback (most recent call last)

<ipython-input-22-3c7ca6e80a5b> in <module>()
     32 model.add(Activation('softmax'))
     33 model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
---> 34 model.fit(x_train, y_train, epochs=5, batch_size=batch_size)

9 frames

/usr/local/lib/python3.7/dist-packages/tensorflow/python/framework/func_graph.py in wrapper(*args, kwargs)
    984           except Exception as e:  # pylint:disable=broad-except
    985             if hasattr(e, "ag_error_metadata"):
--> 986               raise e.ag_error_metadata.to_exception(e)
    987             else:
    988               raise

ValueError: in user code:

    /usr/local/lib/python3.7/dist-packages/keras/engine/training.py:830 train_function  *
        return step_function(self, iterator)
    /usr/local/lib/python3.7/dist-packages/keras/engine/training.py:813 run_step  *
        outputs = model.train_step(data)
    /usr/local/lib/python3.7/dist-packages/keras/engine/training.py:771 train_step  *
        loss = self.compiled_loss(
    /usr/local/lib/python3.7/dist-packages/keras/engine/compile_utils.py:201 __call__  *
        loss_value = loss_obj(y_t, y_p, sample_weight=sw)
    /usr/local/lib/python3.7/dist-packages/keras/losses.py:142 __call__  *
        losses = call_fn(y_true, y_pred)
    /usr/local/lib/python3.7/dist-packages/keras/losses.py:246 call  *
        return ag_fn(y_true, y_pred, **self._fn_kwargs)
    /usr/local/lib/python3.7/dist-packages/tensorflow/python/util/dispatch.py:206 wrapper  
        return target(*args, **kwargs)
    /usr/local/lib/python3.7/dist-packages/keras/losses.py:1631 categorical_crossentropy
        y_true, y_pred, from_logits=from_logits)
    /usr/local/lib/python3.7/dist-packages/tensorflow/python/util/dispatch.py:206 wrapper
        return target(*args, **kwargs)
    /usr/local/lib/python3.7/dist-packages/keras/backend.py:4827 categorical_crossentropy
        target.shape.assert_is_compatible_with(output.shape)
    /usr/local/lib/python3.7/dist-packages/tensorflow/python/framework/tensor_shape.py:1161 assert_is_compatible_with
        raise ValueError("Shapes %s and %s are incompatible" % (self, other))

    ValueError: Shapes (32, 1) and (32, 2) are incompatible

 

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

Recommended Posts

  • 1

الخطأ هو  أن شكل الخرج Y في البيانات هو (,60000) يجب أن يكون شكل الخرج في البيانات مطابق لشكل الخرج في الموديل حيث شكل الخرج في الموديل الذي تقوم بتدريبه هو (32,2) وشكل المخرجات التي تظهر في خرج البيانات باعتبار انها 0 أو 1 هو (32,1) لذلك يجيب تغير الموديل لإخراج قيمة واحدة بدلاً من 2 واستخدام تابع التفعيل sigmoid مع تابع الخسارة binary_crossentropy
أي يصبح الكود كالتالي:

import numpy as np
import pandas as pd
from keras.models import Sequential
from keras.layers import Dense , Activation, Dropout
from keras.models import Sequential
from keras.utils.np_utils import to_categorical
from keras.datasets import mnist
(x_train, y_train),(x_test, y_test) = mnist.load_data()
y_train[y_train<=5]=0
y_train[y_train>5]=1
y_train=y_train.astype('int64')
print(x_train.shape, y_train.shape)
image_size = x_train.shape[1]
input_size = image_size * image_size
x_train = np.reshape(x_train, [-1, input_size])
x_train = x_train.astype('float32') / 255
x_test = np.reshape(x_test, [-1, input_size])
x_test = x_test.astype('float32') / 255
batch_size = 32
hidden_units = 256
model = Sequential()
model.add(Dense(hidden_units, input_shape=(input_size,)))
model.add(Activation('relu'))
model.add(Dropout(0.45))
model.add(Dense(hidden_units))
model.add(Activation('relu'))
model.add(Dropout(0.45))
#إصلاح
model.add(Dense(1))
#إصلاح
model.add(Activation('sigmoid'))
#إصلاح
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(x_train, y_train, epochs=5, batch_size=batch_size)

 

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

  • 1

الخطأ هو في شكل البيانات الدالخة للنموذج مع شكل النموذج نفسه، يوجد عدم تطابق ظاهر في شكل البيانات، يمكننا حل هذه المشكلة هو تطبيق نفس ما قمت بفعله في بيانات التدريب على بيانات الإختبار، و المحافظة على نفس شكل الطبقة الأخيرة في النموذج model.add(Dense(2)):

import numpy as np
import pandas as pd
from keras.models import Sequential
from keras.layers import Dense , Activation, Dropout
from keras.models import Sequential
from keras.utils.np_utils import to_categorical
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)
y_train[y_train<=5]=0
y_train[y_train>5]=1

#تطبيق نفس طريقة بيانات التدريب على بيانات الإختبار
y_test[y_test<=5]=0
y_test[y_test>5]=1

y_train=y_train.astype('int64')
print(x_train.shape, y_train.shape,x_test.shape, y_test.shape)
image_size = x_train.shape[1]
input_size = image_size * image_size
x_train = np.reshape(x_train, [-1, input_size])
x_train = x_train.astype('float32') / 255
x_test = np.reshape(x_test, [-1, input_size])
x_test = x_test.astype('float32') / 255
print(x_train.shape, y_train.shape,x_test.shape, y_test.shape)
batch_size = 32
hidden_units = 256

# 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 = Sequential()
model.add(Dense(hidden_units, input_shape=(input_size,)))
model.add(Activation('relu'))
model.add(Dropout(0.45))
model.add(Dense(hidden_units))
model.add(Activation('relu'))
model.add(Dropout(0.45))
model.add(Dense(2))
model.add(Activation('softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(x_train, y_train, epochs=5, batch_size=batch_size)

لاحظ للتعديل كان فقط بإضافة:

y_test[y_test<=5]=0

y_test[y_test>5]=1

والتي تقوم بتحويل كل صنف قيمته أقل من أو يساوي 5 إلى 0 و كل القيم غير ذلك إلى 1. ومن ثم قمنا بنداء الدالة to_categorical:

y_train = to_categorical(y_train)

y_test = to_categorical(y_test)

والنموذج يظل كما هو يستخدم categorical_crossentropy كدالة خطأ واخر طبقة في النموذج تحتوي على 2nodes.

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

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...