Tensorflow: Logits and Label का आकार समान होना चाहिए

Sep 03 2020

वर्तमान में मैं Google / Udacity के Tensorflow कोर्स में एक प्रोजेक्ट का प्रयास कर रहा हूं, जो निम्न प्रकार से अर्जित डेटासेट का उपयोग कर रहा है:

_URL = "https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgz"

zip_file = tf.keras.utils.get_file(origin=_URL,
                                   fname="flower_photos.tgz",
                                   extract=True)

दुर्भाग्य से, मैं निम्नलिखित त्रुटि में भाग गया:

InvalidArgumentError:  logits and labels must have the same first dimension, got logits shape [100,5] and labels shape [500]
     [[node sparse_categorical_crossentropy/SparseSoftmaxCrossEntropyWithLogits/SparseSoftmaxCrossEntropyWithLogits (defined at <ipython-input-43-02964d57939c>:8) ]] [Op:__inference_test_function_3591]

मैं अन्य पदों पर देखा, लेकिन यह अभी भी पता लगाने के लिए थोड़ा मुश्किल लग रहा था। मेरा प्रारंभिक विचार यह है कि मैं गलत नुकसान फ़ंक्शन का उपयोग कर सकता हूं।

यहाँ कोड समस्याओं में चल रहा है:

image_gen = ImageDataGenerator(rescale = 1./255, horizontal_flip=True, zoom_range=0.5, rotation_range=45, width_shift_range=0.15, height_shift_range=0.15)

train_data_gen = image_gen.flow_from_directory(batch_size=BATCH_SIZE, directory = train_dir, shuffle=True, target_size=(IMG_SHAPE,IMG_SHAPE),class_mode='binary')

image_gen = ImageDataGenerator(rescale = 1./255)

val_data_gen = image_gen.flow_from_directory(batch_size=BATCH_SIZE, directory = val_dir, shuffle=True, target_size=(IMG_SHAPE,IMG_SHAPE))


model = tf.keras.models.Sequential([
                                    tf.keras.layers.Conv2D(16, (3,3), activation='relu', input_shape=(150,150,3)),
                                    tf.keras.layers.MaxPooling2D(2,2),
                                    tf.keras.layers.Conv2D(32, (3,3), activation='relu'),
                                    tf.keras.layers.MaxPooling2D(2,2),
                                    tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
                                    tf.keras.layers.MaxPooling2D(2,2),
                                    tf.keras.layers.Dropout(0.5),
                                    tf.keras.layers.Flatten(),
                                    tf.keras.layers.Dense(512, activation='relu'),
                                    tf.keras.layers.Dense(5),
                                    
])

model.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])
model.summary()

बैच का आकार 100 है और इनपुट आयाम 150,150 है। सारांश इस प्रकार है: मॉडल: "क्रमिक_4"


परत (प्रकार) आउटपुट आकृति परम #

conv2d_12 (Conv2D) (कोई नहीं, 148, 148, 16) 448


max_pooling2d_12 (मैक्सपूलिंग (कोई नहीं, 74, 74, 16) 0


conv2d_13 (Conv2D) (कोई नहीं, 72, 72, 32) 4640


max_pooling2d_13 (मैक्सपूलिंग (कोई नहीं, 36, 36, 32) 0


conv2d_14 (Conv2D) (कोई नहीं, 34, 34, 64) 18496


अधिकतम_पुलिंग 2d_14 (मैक्सपूलिंग (कोई नहीं, 17, 17, 64) 0


dropout_4 (ड्रॉपआउट) (कोई नहीं, 17, 17, 64) 0


flatten_4 (फ्लैटन) (कोई नहीं, 18496) 0


dense_8 (घना) (कोई नहीं, 512) 9470464


dense_9 (घने) (कोई नहीं, 5) 2565

कुल पारम: 9,496,613 ट्रेन योग्य पारम: 9,496,613 गैर-ट्रेन योग्य पारम: 0

क्या गलत हो सकता है पर कोई विचार?

जवाब

1 MarcoCerliani Sep 03 2020 at 03:59

अपने जनरेटर में class_mode पर ध्यान दें

'int': इसका मतलब है कि लेबल पूर्णांक के रूप में एन्कोड किए गए हैं (उदाहरण के लिए sparse_categorical_crossentroprop नुकसान)। 'श्रेणीबद्ध' का अर्थ है कि लेबल एक श्रेणीबद्ध वेक्टर के रूप में एन्कोड किए गए हैं (उदाहरण के लिए gradorical_crossentropy नुकसान)। 'बाइनरी' का मतलब है कि लेबल (केवल 2 हो सकते हैं) फ्लोट 32 स्केलर के रूप में मान 0 या 1 (उदाहरण के लिए बाइनरी_क्रॉसट्रॉपी) के साथ एन्कोडेड हैं। कोई नहीं (कोई लेबल नहीं)।

ऐसा लगता है कि आपको ट्रेन और सत्यापन जनरेटर दोनों के लिए 'बाइनरी' के बजाय 'int' की आवश्यकता है