【问题标题】:ValueError: Input 0 of layer "max_pooling1d" is incompatible with the layer: expected ndim=3, found ndim=4. Full shape received: (None, 51644, 29, 32)ValueError:层“max_pooling1d”的输入 0 与层不兼容:预期 ndim=3,发现 ndim=4。收到的完整形状:(无,51644、29、32)
【发布时间】:2021-12-04 14:18:37
【问题描述】:

我正在构建一个用于二进制分类的 CNN 1D 模型,我使用的文件是 csv 文件我该如何解决这种错误?....提前致谢

这是我的代码: enter image description here enter image description here

错误是: ValueError:层“max_pooling1d”的输入 0 与层不兼容:预期 ndim=3,发现 ndim=4。收到的完整形状:(无,51644、29、32) enter image description here

【问题讨论】:

  • 请贴出真实的文字代码,而不是截图。
  • import numpy as np import pandas as pd from sklearn.model_selection import train_test_split from keras.models import Sequential from keras.layers import Dense from keras.layers import Dropout from keras.layers import Flatten import tensorflow as tf from keras.layers.convolutional import Conv1D from keras.layers.convolutional import MaxPooling1D from sklearn.preprocessing import LabelEncoder,OneHotEncoder data = pd.read_csv('dataset.csv', low_memory=False) data = data.drop([64555], axis=0) y = data.label x = data.drop('label', axis=1)
  • model = Sequential() model.add(Conv1D(32, 5, padding='valid', input_shape=(train.shape[0], train.shape[1], 1), 激活='relu', strides=1 )) model.add(MaxPooling1D(pool_size=2, strides=1, padding='valid')) model.add(Conv1D(64, 5, padding='valid', activation=' relu', strides=1)) model.add(MaxPooling1D(pool_size=2, strides=1, padding='valid')) model.add(Dropout(0.2)) model.add(Dense(128, activation='relu ')) model.add(Dense(50, activation='relu')) model.add(Dense(10, activation='sigmoid')) model.compile(loss='categorical_crossentropy', optimizer='adam', 指标=['准确度'])
  • model.fit(train, train_label, epochs=3, batch_size=32) score = model.evaluate(test, test_label, batch_size=128)
  • 其实不是这样的,我是想贴出问题本身的代码。请编辑您的问题并将代码复制粘贴到那里。粘贴代码后选择代码并单击{} 按钮,代码将自行格式化。对于困难,请参阅此处的详细信息:meta.stackexchange.com/a/210852/659522 ...我也发布了答案,希望对您有所帮助....谢谢:)

标签: python tensorflow machine-learning keras deep-learning


【解决方案1】:

您的数据是 2D 的(类似图片),而您正在尝试使用接受 1D 对象(序列)的模型。您要么需要使用接受您要处理的数据类型的模型,要么需要转换数据以适合您的模型。

【讨论】:

  • 我的数据是 csv 文件(excel 表),但运行代码时出现此错误
  • 此评论与答案无关。
【解决方案2】:

input_shape(train_shape[0], train_shape[1], 1) 更改为(train_shape[1], 1)。当您使用Conv1D 时,假设您正在处理序列数据。所以在这种情况下,train_shape[0]batch_sizetrain_shape[1]number of time-steps,即sequence length,最后一个1 是每个时间戳中的number of features

重要的是,keras 不需要你输入batch_size,它会自动默认为None,输入形状会自动变为(None, train_shape[1], 1),这样它就可以与任何批量大小,因此无需输入第一个维度。但是如果你想自己输入batch size,那么使用batch_input_shape而不是input_shape

还要在输出层使用softmax 函数而不是sigmoid,因为输出层中有多个神经元。

【讨论】:

  • 我将输入形状更改为 (train.shape[1],1) 但我收到如下错误:ValueError: Shapes (None, 1) and (None, 23, 10) are incompatible与 (model.fit(train, train_label, epochs=3,)) 的行
  • @mohammadalani 我已经编辑了答案。
  • 我只有两个输出(正常或恶意软件),因此我使用了 sigmoid
  • @mohammadalani 但是您在输出密集层中添加了10 神经元,为什么?它要求您拥有10 课程。对于 二元 分类,如果您想使用 sigmoid,则仅使用 1 神经元,或者将 2 神经元与 softmax 一起使用。
  • 谢谢我用 2 个神经元编辑了这一行
猜你喜欢
  • 1970-01-01
  • 2020-03-20
  • 2021-10-08
  • 1970-01-01
  • 2020-11-16
  • 2021-01-24
  • 2020-11-15
  • 2023-03-17
  • 2020-08-01
相关资源
最近更新 更多