मैं एक साधारण सीएनएन क्लासिफायरियर मॉडल बनाने की कोशिश कर रहा हूं। मेरी प्रशिक्षण छवियों (BATCH_SIZEx227x227x1) और लेबल (BATCH_SIZEx7) डेटासेट के लिए, मैं ImageDataGenerator के माध्यम से बैचों में मॉडल को खिलाए गए numpy ndarrays का उपयोग कर रहा हूं। मैं जिस हानि फ़ंक्शन का उपयोग कर रहा हूं वह tf.nn.sparse_categorical_crossentropy है। समस्या तब उत्पन्न होती है जब मॉडल प्रशिक्षित करने का प्रयास करता है; मॉडल (मेरे सरलीकृत प्रयोगों के लिए यहां बैच आकार १ है) [१, ७] के आकार को आउटपुट करता है और लेबल आकार [७] है।

मैं लगभग सकारात्मक हूं मुझे इसका कारण पता है, लेकिन मुझे यकीन नहीं है कि इसे कैसे ठीक किया जाए। मेरी परिकल्पना यह है कि sparse_categorical_crossentropy मेरे लेबल के आयामों को निचोड़ रहा है (उदाहरण के लिए जब BATCH_SIZE 2 है, इनपुट, ग्राउंड-ट्रुथ लेबल आकार [2, 7] से [14] तक निचोड़ा हुआ है), जिससे मेरे लिए लेबल को ठीक करना असंभव हो गया है आकार, और लॉगिट आकार को ठीक करने के मेरे सभी प्रयास निष्फल रहे हैं।

मैंने मूल रूप से np.expand_dims के साथ लेबल के आकार को ठीक करने का प्रयास किया। लेकिन नुकसान फ़ंक्शन हमेशा लेबल को समतल करता है, चाहे मैं आयामों का विस्तार कैसे भी करूं।

उसके बाद, मैंने बाहरी पहले आयाम से छुटकारा पाने के लिए अपने मॉडल के अंत में tf.keras.layers.Flatten() जोड़ने का प्रयास किया, लेकिन इसका कोई प्रभाव नहीं पड़ा; मुझे अभी भी वही सटीक त्रुटि मिली है। उसके बाद, सभी आयामों को निचोड़ने के लिए tf.keras.layers.Reshape((-1,)) का उपयोग करने का प्रयास किया। हालांकि, इसके परिणामस्वरूप एक अलग त्रुटि हुई:

in sparse_categorical_crossentropy logits = array_ops.reshape(output, [-1, int(output_shape[-1])]) TypeError: int नॉन-इंट लौटाया (कोई नहीं टाइप करें)

प्रश्न: मैं लॉग के आकार को sparse_categorical_crossentropy द्वारा लौटाए गए लेबल के समान आकार के लिए कैसे स्क्वैश कर सकता हूं?

 ### BUILD SHAPE OF THE MODEL ###

 model = tf.keras.Sequential([
   tf.keras.layers.Conv2D(32, (3,3), padding='same', activation=tf.nn.relu, 
                          input_shape=(227,227,1)),
   tf.keras.layers.MaxPooling2D((2,2), strides=2),
   tf.keras.layers.Conv2D(64, (3,3), padding='same', activation=tf.nn.relu),
   tf.keras.layers.MaxPooling2D((2,2), strides=2),
   tf.keras.layers.Flatten(),
   tf.keras.layers.Dense(128, activation=tf.nn.relu),
   tf.keras.layers.Dense(7, activation=tf.nn.softmax), # final layer with node for each classification
   #tf.keras.layers.Reshape((-1,))
])

# specify loss and SGD functions
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy')

### TRAIN THE MODEL ###
#specify training metadata
BATCH_SIZE = 1
print("about to train")
# train the model on the training data
num_epochs = 1 
model.fit_generator(generator.flow(train_images, train_labels, batch_size=BATCH_SIZE), epochs=num_epochs)

--- पूर्ण त्रुटि ट्रेस ---

Traceback (most recent call last):
  File "classifier_model.py", line 115, in <module>
    model.fit_generator(generator.flow(train_images, train_labels, batch_size=BATCH_SIZE), epochs=num_epochs)
  File "/Users/grammiegramco/Desktop/projects/HiRISE/lib/python3.6/site-packages/tensorflow/python/keras/engine/training.py", line 1426, in fit_generator
    initial_epoch=initial_epoch)
  File "/Users/grammiegramco/Desktop/projects/HiRISE/lib/python3.6/site-packages/tensorflow/python/keras/engine/training_generator.py", line 191, in model_iteration
    batch_outs = batch_function(*batch_data)
  File "/Users/grammiegramco/Desktop/projects/HiRISE/lib/python3.6/site-packages/tensorflow/python/keras/engine/training.py", line 1191, in train_on_batch
    outputs = self._fit_function(ins)  # pylint: disable=not-callable
  File "/Users/grammiegramco/Desktop/projects/HiRISE/lib/python3.6/site-packages/tensorflow/python/keras/backend.py", line 3076, in __call__
    run_metadata=self.run_metadata)
  File "/Users/grammiegramco/Desktop/projects/HiRISE/lib/python3.6/site-packages/tensorflow/python/client/session.py", line 1439, in __call__
    run_metadata_ptr)
  File "/Users/grammiegramco/Desktop/projects/HiRISE/lib/python3.6/site-packages/tensorflow/python/framework/errors_impl.py", line 528, in __exit__
    c_api.TF_GetCode(self.status.status))
tensorflow.python.framework.errors_impl.InvalidArgumentError: logits and labels must have the same first dimension, got logits shape [1,7] and labels shape [7]
     [[{{node loss/dense_1_loss/SparseSoftmaxCrossEntropyWithLogits/SparseSoftmaxCrossEntropyWithLogits}}]]
2
ConfusedPerson 25 मई 2019, 06:21

1 उत्तर

सबसे बढ़िया उत्तर

नहीं, आपको कारण सब गलत लगा। आप एक-हॉट एन्कोडेड लेबल दे रहे हैं, लेकिन sparse_categorical_crossentropy पूर्णांक लेबल की अपेक्षा करता है, क्योंकि यह स्वयं एक-हॉट एन्कोडिंग करता है (इसलिए, विरल)।

एक आसान उपाय यह होगा कि हानि को categorical_crossentropy में बदल दिया जाए, न कि विरल संस्करण। यह भी ध्यान दें कि y_true आकार (7,) के साथ गलत है, यह (1, 7) होना चाहिए।

7
Dr. Snoopy 25 मई 2019, 10:14