首页 > 解决方案 > 为什么使用 Keras 和 Python 对图像分类任务进行 CNN 模型训练会出错

问题描述

我是图像处理和使用 keras 和 tensorflow 进行多图像分类的新手。我正在使用的代码如下:

   import tensorflow as tf
   from tensorflow.keras import datasets, layers, models
   import pandas as pd
   import numpy as np

数据集已经分为训练集和测试集。训练集和测试集是图像数组,标签取自 csv 文件。

   X_train = np.load('X_train_images.npy')
   X_test =  np.load('X_test_images.npy')
   Y_train = pd.read_csv('Y_train_Labels.csv',encoding='latin-1')
   Y_test =  pd.read_csv('Y_test_Labels.csv',encoding='latin-1')
 
   Y_train = Y_train['label'].to_numpy()
   Y_test = Y_test['label'].to_numpy()
   
   print(X_train.shape)
   print(X_test.shape)
   print(Y_train.shape)
   print(Y_test.shape)

所以数据集的形状是:

  (4000, 4, 4, 512)
  (1000, 4, 4, 512)
  (4000,)
  (1000,)

所以定义模型:

  batch_size=32
  epochs=10

  model=tf.keras.Sequential() 
  model.add(tf.keras.layers.Conv2D(32,kernel_size=(3,3),activation='relu',input_shape=(4,4,512)))
  model.add(tf.keras.layers.MaxPooling2D(pool_size=(2,2))) 
  #I'm adding two Dropout layers to prevent overfitting 
  model.add(tf.keras.layers.Dropout(0.25)) 
  model.add(tf.keras.layers.Flatten()) 
  model.add(tf.keras.layers.Dense(1024,activation='relu')) 
  model.add(tf.keras.layers.Dropout(0.5)) 
  model.add(tf.keras.layers.Dense(10,activation='softmax'))
  

编译模型然后训练它:

   model.compile(loss='categorical_crossentropy',     
                  optimizer=tf.keras.optimizers.Adam(lr=0.001,decay=1e-6), metrics=['accuracy']) 

   model.fit(X_train/255.0, tf.keras.utils.to_categorical(Y_train), 
             batch_size=batch_size, shuffle=False, epochs=epochs, 
             validation_data=(X_test/255.0, tf.keras.utils.to_categorical(Y_test)) 
            )

最后预测分数:

   predictions=model.predict(x_test) 
   scores = model.evaluate(x_test / 255.0, tf.keras.utils.to_categorical(y_test)
                          )

在训练模型时,我在以下位置收到输入形状错误:

    validation_data=(X_test/255.0, tf.keras.utils.to_categorical(Y_test)) 

错误是:

    ValueError: Shapes (32, 9) and (32, 10) are incompatible

我不明白为什么我会收到这个错误,因为我知道这是因为类的形状?

谢谢

标签: pythontensorflowmachine-learningimage-processingkeras

解决方案


这是数据和模型输入形状不匹配:您的输入是input_shape=(512,4,4)而训练数据具有形状batch, 4, 4, 512。如果模型的输入计划为该形状 - 更改您的数据numpy.transpose()以匹配模型的输入。否则更改您的模型输入。

输出的相同问题但由不同的问题引起:模型将输出生成为密集列表,而训练数据由类号编码。解决方案将输入数据转换为分类:

from tf.keras.utils import to_categorical
# define example
data = [1, 3, 2, 0, 3, 2, 2, 1, 0, 1]
data = array(data)
print(data)
# one hot encode
encoded = to_categorical(data)

查看详细信息教程


推荐阅读