python - 为什么使用 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
我不明白为什么我会收到这个错误,因为我知道这是因为类的形状?
谢谢
解决方案
这是数据和模型输入形状不匹配:您的输入是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)
推荐阅读
- mysql - 编辑了错误的播放器
- python - Gmail 草稿:无法删除附件
- python-3.x - 无法将 github 库克隆到 python
- javascript - 编写一个不使用 *,+ 或 pow 的函数返回数字的平方
- mysql - Debezium kafka 连接连接器未成功更新
- mysql - 根据数字标准汇总项目
- platform - 如何在 Commercetools 平台中设置 ProductType 属性的默认值?
- excel - 激活包含代码的工作簿
- c++ - 如何从列表中对(自定义)字符串进行排序
- laravel - VerifyCsrfToken.php 中的令牌不匹配异常