【问题标题】:Error when checking input: expected conv1d_57_input to have 3 dimensions, but got array with shape (152, 64)检查输入时出错:预期 conv1d_57_input 有 3 个维度,但得到了形状为 (152, 64) 的数组
【发布时间】:2020-06-08 16:19:11
【问题描述】:

我收到此错误:

ValueError: 检查输入时出错:预期 conv1d_57_input 有 3 个维度,但得到的数组形状为 (152, 64)。

我的代码:

model = Sequential()

model.add(Conv1D(filters=64, kernel_size=3, activation='relu', input_shape=(152,64)))
model.add(Conv1D(filters=64, kernel_size=3, activation='relu'))
model.add(Dropout(0.5))
model.add(MaxPooling1D(pool_size=2))
model.add(Flatten())
model.add(Dense(100, activation='relu'))
model.add(Dense(4, activation='softmax'))

model.summary()

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

history = model.fit(trainingMatrix, labelTraining, validation_data=(validationMatrix, labelValidation), epochs=3)

变量描述:

trainingMatrix.shape = (152,64); 行与具有特征的样本和列相关联。

是重塑问题吗?

编辑:

我做了以下更改:

trainingMatrix = np.expand_dims(trainingMatrix, axis=3)
validationMatrix = np.expand_dims(validationMatrix, axis=3)

model = Sequential()
model.add(Conv1D(filters=64, kernel_size=3, activation='relu', input_shape=(64,1)))
model.add(Conv1D(filters=64, kernel_size=3, activation='relu'))
model.add(Dropout(0.5))
model.add(MaxPooling1D(pool_size=2))
model.add(Flatten())
model.add(Dense(100, activation='relu'))
model.add(Dense(4, activation='softmax'))
model.summary()

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

history = model.fit(trainingMatrix, labelTraining, validation_data=(validationMatrix, labelValidation), epochs=3)

我收到这个新错误:检查目标时出错:预期 dense_28 的形状为 (1,) 但得到的数组的形状为 (4,)

我的总结:

_________________________________________________________________
Layer (type)                 Output Shape              Param    
=================================================================
conv1d_51 (Conv1D)           (None, 62, 64)            256       
_________________________________________________________________
conv1d_52 (Conv1D)           (None, 60, 64)            12352     
_________________________________________________________________
dropout_15 (Dropout)         (None, 60, 64)            0         
_________________________________________________________________
max_pooling1d_15 (MaxPooling (None, 30, 64)            0         
_________________________________________________________________
flatten_16 (Flatten)         (None, 1920)              0         
_________________________________________________________________
dense_27 (Dense)             (None, 100)               192100    
_________________________________________________________________
dense_28 (Dense)             (None, 4)                 404       
=================================================================
Total params: 205,112
Trainable params: 205,112
Non-trainable params: 0

新代码和新错误:

trainingMatrix = np.expand_dims(trainingMatrix, axis=0)
validationMatrix = np.expand_dims(validationMatrix, axis=0)

model = Sequential()

model.add(Conv1D(filters=64, kernel_size=3, activation='relu', input_shape=(152,64,1)))
model.add(Conv1D(filters=64, kernel_size=3, activation='relu'))
model.add(Dropout(0.5))
model.add(MaxPooling1D(pool_size=2))
model.add(Flatten())
model.add(Dense(100, activation='relu'))
model.add(Dense(4, activation='softmax'))
model.summary()

ValueError: Input 0 is in compatible with layer conv1d_57: expected ndim=3, found ndim=4

下面的方案可行,但命中率太低。有没有人推荐一个配置来改进?我没有达到超过 20% 的准确率。 (使用 MLP 我得到了 90%)

trainingMatrix = np.expand_dims(trainingMatrix, axis=3)
validationMatrix = np.expand_dims(validationMatrix, axis=3)

model = Sequential()

model.add(Conv1D(filters=64, kernel_size=3, activation='relu', input_shape=(64,1)))
model.add(Conv1D(filters=64, kernel_size=3, activation='relu'))
model.add(Dropout(0.5))
model.add(MaxPooling1D(pool_size=2))
model.add(Flatten())
model.add(Dense(100, activation='relu'))
model.add(Dense(4, activation='softmax'))

model.summary()

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

history = model.fit(trainingMatrix, labelTraining, validation_data=(validationMatrix, labelValidation), epochs=1000)

我的 labelTraining 是:

1 0 0 0
1 0 0 0
...
0 1 0 0
0 1 0 0
...
0 0 0 1

还好吗?

【问题讨论】:

  • 152 你的样本数对吗?在这种情况下,将您的输入形状更改为input_shape=(64,)。您不应该提供输入形状的样本数量,Keras 会自动获取它。
  • 您是否尝试过重塑为 152,64,1 或 1,152,64?
  • @VivekMehta 我按照您的建议更改了代码,但出现其他错误:输入 0 与 conv1d_1 层不兼容:预期 ndim=3,发现 ndim=2
  • @3NiGMa 在这两种情况下我都会收到此错误:输入 0 与 conv1d_6 层不兼容:预期 ndim=3,发现 ndim=4

标签: python keras conv-neural-network


【解决方案1】:

感谢大家的帮助。遵循以 97% 的准确率运行的代码。

trainingMatrix = np.expand_dims(trainingMatrix, axis=3)
validationMatrix = np.expand_dims(validationMatrix, axis=3)

model = Sequential()

model.add(Conv1D(filters=64, kernel_size=3, activation='relu', input_shape=(64,1)))
model.add(Conv1D(filters=64, kernel_size=3, activation='relu'))
model.add(Flatten())
model.add(Dense(4, activation='softmax'))

model.summary()

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

history = model.fit(trainingMatrix, labelTraining, batch_size=batchSize, epochs=epochs, verbose=1, validation_data=(validationMatrix, labelValidation))

【讨论】:

    【解决方案2】:

    sparse_categorical_crossentropy & categorical_crossentropy

    sparse_categorical_crossentropy:

    在目标列包含多标签值且具有单个目标列时使用{表示标签可以大于1}

    分类交叉熵

    用于当目标 col 包含多标签值并且具有多目标 col{ 这意味着每个 col 目标值都是二进制的}

    将 sparse_categorical_crossentropy 替换为 categorical_crossentropy

    【讨论】:

      猜你喜欢
      • 2020-06-09
      • 2020-02-27
      • 2020-07-01
      • 2020-12-08
      • 1970-01-01
      • 2019-11-11
      • 2018-12-26
      • 2019-09-03
      • 1970-01-01
      相关资源
      最近更新 更多