【问题标题】:ValueError: Error when checking input: expected conv2d_1_input to have 4 dimensions, but got array with shape (595, 10083)ValueError:检查输入时出错:预期 conv2d_1_input 有 4 个维度,但得到了形状为 (595、10083) 的数组
【发布时间】:2020-03-03 13:24:31
【问题描述】:

我正在尝试使用 Keras 构建 CNN 模型。这是我的代码:

import keras
import tensorflow as tf
from keras.layers import Dense
from keras.models import Sequential
from keras.models import load_model
from keras.callbacks import EarlyStopping  
from sklearn.model_selection import train_test_split
from __future__ import print_function
import pandas as pd
import numpy as np
from keras.datasets import cifar10
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, Flatten
from keras.layers import Conv2D
from google.colab import drive
drive.mount('/content/drive')
                  ...

# Define x_train...data
x_data=df.iloc[:,1:10084].values-25 
# x_data = np.array(x_data).tolist()  
y_data=df[['type1','type2']].values
X_train, X_test, y_train, y_test = train_test_split(x_data, y_data,test_size=0.2)

model.fit(X_train, y_train,
          batch_size=100,
          epochs=100,
          verbose=1,
          validation_data=(X_test, y_test),
          callbacks=[history])

返回错误

ValueError: 检查输入时出错:预期 conv2d_1_input 有 4 个维度,但得到的数组形状为 (595, 10083)

参考其他问题后,我尝试使用

重塑数据数组的维度
X_train = X_train[np.newaxis, :, :, :]

将其更改为 3 维并返回错误:

ValueError: 检查输入时出错:预期 conv2d_1_input 有 4 个维度,但得到的数组形状为 (1, 595, 10083)

我应该如何将数据的维度增加到4?

【问题讨论】:

  • 这是什么数据?
  • 细节太多,评论可能不适合,请查看this获取数据
  • 为什么不使用 RNN?如果你想要一个 CNN,你需要一个 1D CNN。
  • 感谢@gmds 它在我的数据上表现不佳,因为我将时间序列形式的各种特征合并为一个,所以我想看看它是如何进行的CNN
  • @gmds 我将Conv2D 更改为Conv1D 并得到了这个ValueError: Error when checking input: expected conv2d_1_input to have shape (744, 10183, 1) but got array with shape (595, 10083, 1)

标签: python pandas numpy keras neural-network


【解决方案1】:

模型的第一层,即 2D 卷积,期望(我相信)具有多个通道的 2D 图像数据。比如:

(img_height, img_width, num_channels).

此外,您需要为“批次”或“样本”提供另一个维度。因此最终的形状将是:

(num_samples, img_height, img_width, num_channels)。

因此,您需要根据我从您的代码中推断出的信息,将您的输入数据重塑为上述模式,并根据我所指出的各种维度进行解释。

您可能会查看诸如 np.reshape 和 np.expand_dims 之类的函数,具体取决于您输入数据的格式。

您可以像这样创建一些测试数据:

x_train = np.random.random((4,32,32,3))

# then try out the model prediction

model.predict(x_train)  

这是四张 32x32 尺寸和 3 个通道的图像,用于验证您的处理。

在进行实际拟合时,您还需要创建适合 y_train 的内容。

我希望这会有所帮助。

【讨论】:

  • 谢谢@ad2004 我没有使用图像数据——使用二维卷积是否正确?如何将数据形状更改为(num_samples, img_height, img_width, num_channels)?这样做是否有限制,或者我可以简单地以[a,b, c, d] 格式分配随机数?例如,温带数据中的num_samples num_channels 是什么?抱歉我的问题太多了
  • @nilsinelabore 。您使用的模型需要与您正在使用的数据类型保持一致。如果您的代码中已经定义的“模型”旨在处理图像数据,那么它可能不适合您的情况。您可能想探索与 1D 数据/时间序列相关的示例 - Keras 文档中有一些示例:keras.io/getting-started/sequential-model-guide 以及其他地方。我希望这会有所帮助。
  • 同意。数据涉及将多个时间序列特征组合为一个。我使用RNN 认为它就像一个时间序列,但由于各种功能的巨大差异而表现不佳。因此我正在尝试CNN。非常感谢
猜你喜欢
  • 2018-01-09
  • 2018-11-09
  • 1970-01-01
  • 2019-08-25
  • 2022-01-15
  • 1970-01-01
  • 2021-11-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多