【问题标题】:Why CNN model training for an Image classification task with Keras and Python giving erros为什么使用 Keras 和 Python 对图像分类任务进行 CNN 模型训练会出错
【发布时间】:2020-12-06 16:54:13
【问题描述】:

我是图像处理和使用 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

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

谢谢

【问题讨论】:

  • 看起来形状不匹配:您的图层签名input_shape=(512,4,4),您正在尝试输入(batch, 4, 4, 512)

标签: python tensorflow machine-learning image-processing keras


【解决方案1】:

这是数据和模型输入形状不匹配:您的输入是 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)

检查detailstutorial

【讨论】:

  • 我更新了形状,但新的错误是:ValueError: Shapes (32, 1) and (32, 10) are incompatible
  • 您的模型生成 10 个值的数组,除了一个“1”之外的所有值都为零,表示预测类别。您的火车数据提供 1 个数字 - 类别索引。将它们转换为分类:to_categorical(data)
  • 谢谢你,但是当我纠正一个错误时,另一个错误又来了。现在使用 tf.keras.utils.to_categorical(Y_train) 转换为类别时出现索引错误。 IndexError:索引 -9223372036854775808 超出轴 1 的范围,大小为 8
  • 检查您是否正确读取了数据文件中的值。如果数据集中有 10 个类,它们应该在 [0...9] 范围内。注意你的“编码”参数。
  • 数据应该没有 NaN。如果您的数据与任何所需的类不对应,请不要将其包含到您的数据集中。或者将编号为“其他”的类设为“其他”并将所有的 NaN 放在那里。但这可能会导致训练出现问题:您可能会获得低准确率且无法收敛。
猜你喜欢
  • 2019-05-17
  • 2017-07-18
  • 2018-08-31
  • 2023-03-04
  • 1970-01-01
  • 2019-11-25
  • 2018-09-25
  • 2018-12-15
  • 2021-11-30
相关资源
最近更新 更多