在使用 sklearn 和 keras 构建 CNN 时需要帮助理解形状错误吗?

Posted

技术标签:

【中文标题】在使用 sklearn 和 keras 构建 CNN 时需要帮助理解形状错误吗?【英文标题】:Need help in understanding shape error while Building a CNN with sklearn and keras? 【发布时间】:2021-10-12 22:20:27 【问题描述】:

我尝试加载我的数据集并设计一个 CNN,但是当我尝试训练我的模型时出现了这个错误,我想知道如何解决这个问题?

ValueError: The channel dimension of the inputs should be defined. Found None.

这就是我拆分数据的方式

xtrain, xtest, ytrain, ytest = trian_test_split(images_total, 
                                                image_labels,
                                                stratify=image_labels,
                                                random_state=1234,
                                                test_size=0.2)

xvalid, xtest, yvalid, ytest= trian_test_split(xtest, 
                                                ytest,
                                                stratify=ytest,
                                                random_state=1234,
                                                test_size=0.5)


def read_img(path, label):
  file = tf.io.read_file(path)
  img = tf.image.decode_png(file)
  img = tf.image.resize(img, (32, 32))
  return img, label

train_dataset = tf.data.Dataset.from_tensor_slices((xtrain, ytrain))
train_dataset = train_dataset.map(read_img).batch(batch_size)

valid_dataset = tf.data.Dataset.from_tensor_slices((xvalid, yvalid))
valid_dataset = valid_dataset.map(read_img).batch(batch_size)

test_dataset = tf.data.Dataset.from_tensor_slices((xtest, ytest))
test_dataset = test_dataset.map(read_img).batch(batch_size)

这是我的模型

num_classes = 26

model = tf.keras.Sequential([
  tf.keras.layers.experimental.preprocessing.Resizing(32, 32),
  tf.keras.layers.experimental.preprocessing.Rescaling(1./255),
  tf.keras.layers.Conv2D(32, 3, activation='relu'),
  tf.keras.layers.MaxPooling2D(),
  tf.keras.layers.Conv2D(32, 3, activation='relu'),
  tf.keras.layers.MaxPooling2D(),
  tf.keras.layers.Conv2D(32, 3, activation='relu'),
  tf.keras.layers.MaxPooling2D(),
  layers.Dropout(0.2),
  tf.keras.layers.Flatten(),
  tf.keras.layers.Dense(128, activation='relu'),
  tf.keras.layers.Dense(num_classes)
])
model.compile(
  optimizer='adam',
  loss=tf.losses.SparseCategoricalCrossentropy(from_logits=True),
  metrics=['accuracy'])


model.fit(train_dataset, epochs=5, validation_data=valid_dataset)

当我尝试拟合此模型时出现错误,我无法修复此问题

【问题讨论】:

你在调用 model.fit 时是否也传递了 y 标签? @Nagakiran 不,我该怎么做?抱歉,我对此很陌生 【参考方案1】:

您在调用时没有将 y 标签传递给模型,模型需要 x 和 y 标签进行相应的训练, Here i added an example

请稍等片刻,浏览keras io 中有关 keras 架构和文档的视频,这些视频将提供有关深度学习建模的更多信息

熟悉了所有之后,跳到建模

model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=3)

【讨论】:

谢谢你的帮助,我在解决这个问题后浏览了这些视频,因为这对我来说非常重要,我使用这种方法并且有一个错误说'ValueError:'images'必须有3 或 4 个维度。当我不能用'xtrain.reshape'重塑它时,因为xtrain是一个列表@Nagakiran 哈哈,你的模型实际上是 3 维的,你能分享 xtrain 和 ytrain 的形状吗@khashayarehteshami xtrain 和 ytrain 形状都是 '(16640,)',它们都是列表 那是未经批准的行为,您需要跟踪训练数据的生成,似乎您需要在新轴上堆叠,请回溯以获得 3 维,因为这些是图像,它们应该遵循 3d 形状:- | @khashayarehteshami 谢谢,我会找出发生了什么以及为什么它会出现在列表中

以上是关于在使用 sklearn 和 keras 构建 CNN 时需要帮助理解形状错误吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 sklearn 管道缩放 Keras 自动编码器模型的目标值?

使用 Keras 和 sklearn GridSearchCV 交叉验证提前停止

基于sklearn和keras的数据切分与交叉验证

在带有 sklearn/Keras 的神经网络上使用 skopt 进行超参数优化

在keras中复制sklearn的MLPClassifier()

Keras 神经网络和 SKlearn SVM.SVC