首页 > 解决方案 > logits 和 label 的大小必须相同

问题描述

我尝试制作一个自定义网络来训练 ck+48,但我得到了错误日志,并且标签必须是可广播的。

这是我的网络代码:

def getModel(训练, input_shape = (48,48,3)):

  model = models.Sequential()
  
  model.add(layers.Conv2D(64, (3, 3), activation='relu', input_shape=input_shape))
  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.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='softmax'))
  model.add(layers.Dense(len(set(traing.classes))))
  print(model.summary())
 
  opt    = tf.keras.optimizers.Nadam(learning_rate=4e-5, epsilon=1e-6)
  loss   = tf.keras.losses.CategoricalCrossentropy(from_logits=True)#BinaryCrossentropy(from_logits=True) #False 
  metric = tf.keras.metrics.CategoricalAccuracy('accuracy')#BinaryAccuracy('accuracy')

  model.compile(optimizer=opt, loss=loss, metrics=[metric])

  return model

我用这个函数读取所有数据:

def getData(foldername, train_size=0.1, seed=1):
      data = ImageDataGenerator(validation_split=train_size, rescale = 1./255)
      train_generator = data.flow_from_directory( folder_name, 
                                                    target_size = (48, 48), 
                                              batch_size=64, 
                                              subset='training',
                                              seed=seed)
      valid_generator = data.flow_from_directory( folder_name, 
                                              target_size = (48, 48), 
                                              batch_size=64, 
                                              subset='validation',
                                              seed=seed,
                                              shuffle=False)

      
      return train_generator, valid_generator

"""
folderName = CK+48
structure
-CK+48
  -angry
    -image1
    -image2
  -suprised
  -disgust

"""

开始训练:

history =   model.fit(train_generator,
                            steps_per_epoch  = train_generator.n // train_generator.batch_size,
                            epochs=500,
                            )

和总结


Found 887 images belonging to 7 classes.
Found 94 images belonging to 7 classes.
Model: "sequential_10"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 conv2d_50 (Conv2D)          (None, 46, 46, 64)        1792      
                                                                 
 conv2d_51 (Conv2D)          (None, 44, 44, 64)        36928     
                                                                 
 max_pooling2d_20 (MaxPoolin  (None, 22, 22, 64)       0         
 g2D)                                                            
                                                                 
 conv2d_52 (Conv2D)          (None, 20, 20, 64)        36928     
                                                                 
 conv2d_53 (Conv2D)          (None, 18, 18, 64)        36928     
                                                                 
 max_pooling2d_21 (MaxPoolin  (None, 9, 9, 64)         0         
 g2D)                                                            
                                                                 
 conv2d_54 (Conv2D)          (None, 7, 7, 64)          36928     
                                                                 
 flatten_10 (Flatten)        (None, 3136)              0         
                                                                 
 dense_19 (Dense)            (None, 64)                200768    
                                                                 
 dense_20 (Dense)            (None, 7)                 455       
                                                                 
=================================================================
Total params: 350,727
Trainable params: 350,727
Non-trainable params: 0
_________________________________________________________________
None


错误


InvalidArgumentError:  logits and labels must be broadcastable: logits_size=[1375,7] labels_size=[55,7]
     [[node categorical_crossentropy/softmax_cross_entropy_with_logits
 (defined at /usr/local/lib/python3.7/dist-packages/keras/backend.py:5010)
]] [Op:__inference_train_function_16550]

Errors may have originated from an input operation.
Input Source operations connected to node categorical_crossentropy/softmax_cross_entropy_with_logits:
In[0] categorical_crossentropy/softmax_cross_entropy_with_logits/Reshape:   
In[1] categorical_crossentropy/softmax_cross_entropy_with_logits/Reshape_1:


我在互联网上搜索了这个错误,尤其是stackoverflow,有很多这种类型的错误,但我无法解决问题。

感谢您的帮助。

标签: pythontensorflow

解决方案


推荐阅读