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

السؤال

نشر

قمت ببناء نموذج تصنيف متعدد لمجموعة بيانات MINST لكن يظهر لي هذا الخطأ، فما هي المشكلة:

from keras import layers
from keras import models
model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(10, activation='softmax'))
from keras.datasets import mnist
import keras
from tensorflow.keras.utils import to_categorical
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
train_images = train_images.reshape((60000, 28, 28, 1))
train_images = train_images.astype('float32') / 255
test_images = test_images.reshape((10000, 28, 28, 1))
test_images = test_images.astype('float32') / 255
train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)
model.compile(optimizer='rmsprop',
loss=keras.metrics.CategoricalCrossentropy(),
metrics=["acc"])
model.fit(train_images, train_labels, epochs=5, batch_size=64)
test_loss, test_acc = model.evaluate(test_images, test_labels)

 

Recommended Posts

  • 1
نشر

الخطأ هنا من المكان الذي تستورد فيه دالة التكلفة CategoricalCrossentropy، فهذه الدالة يمكن استخدامها كدالة تكلفة وكمعيار لقياس الدقة. ففي حالة كنت تريد استخدامها كدالة تكلفة يجب عليك استيرادها من الموديول losses أما إذا أردت استخدامها كمعيار فعيلك استيرادها من الموديول metrices أي يصبح نموذجك كالتالي:

from keras import layers
from keras import models
model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(10, activation='softmax'))
from keras.datasets import mnist
import keras
from tensorflow.keras.utils import to_categorical
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
train_images = train_images.reshape((60000, 28, 28, 1))
train_images = train_images.astype('float32') / 255
test_images = test_images.reshape((10000, 28, 28, 1))
test_images = test_images.astype('float32') / 255
train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)
model.compile(optimizer='rmsprop',
loss=keras.losses.CategoricalCrossentropy(),
metrics=["acc"])
model.fit(train_images, train_labels, epochs=5, batch_size=64)
test_loss, test_acc = model.evaluate(test_images, test_labels) # 99%

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

  • 1
نشر

 ValueError: No gradients provided for any variable تعني أنك لم تقم باستدعاء أي دالة تكلفة loss function لتقييم النواتج، ورغم استدعاءك ل  CategoricalCrossentropy الا انك لم تستدعها لتكون دالة تكلفة وانما لقياس الدقة، وهنا ظهر الخطأ، قد يكون قد حصل لديك لبس نتيجة امكانية استخدام  CategoricalCrossentropy كدالة للدقة أو كدالة تكلفة.

كل ما عليك فعله هو اعادة استخدامها لتصبح دالة تكلفة، أو استخدام أي دالة تكلفة أخرى تريد، كالتالي:

from keras import layers
from keras import models
model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(10, activation='softmax'))
from keras.datasets import mnist
import keras
from tensorflow.keras.utils import to_categorical
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
train_images = train_images.reshape((60000, 28, 28, 1))
train_images = train_images.astype('float32') / 255
test_images = test_images.reshape((10000, 28, 28, 1))
test_images = test_images.astype('float32') / 255
train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)
model.compile(optimizer='rmsprop',
loss=keras.losses.CategoricalCrossentropy(),#هنا
#أو يمكنك استبدالها بأي دالة تكلفة أخري كالتالي:
# loss=keras.losses.SparseCategoricalCrossentropy()
metrics=["acc"])
model.fit(train_images, train_labels, epochs=5, batch_size=64)
test_loss, test_acc = model.evaluate(test_images, test_labels) # 99%

 

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...