喀拉拉邦输入形状错误

时间:2020-03-24 00:27:26

标签: python machine-learning conv-neural-network

我正在使用Keras构建CNN,并且具有以下代码段:

model = Sequential()
model.add(Conv1D(filters=64, kernel_size=3, activation='relu', input_shape=(50,)))
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(20, activation='relu'))
model.add(Dense(1, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(trainX, trainY, epochs=10, batch_size=32, verbose=0)

运行此命令后,出现以下错误:

ValueError:输入0与层conv1d_1不兼容:预期ndim = 3,找到ndim = 2

enter image description here

数据集的形状为: enter image description here

请帮助我解决这种情况!

谢谢

2 个答案:

答案 0 :(得分:1)

转换图层希望您输入的是图像类型。因此,您需要指定/重塑形状以包括通道尺寸。 您的频道数量是1。

model = Sequential()
model.add(Conv1D(filters=64, kernel_size=3, activation='relu', input_shape=(50,1, )))

然后,您还需要相应地调整输入的形状。 它的形状应为(批处理大小,num_features,通道)

所以假设您的X是一个numpy数组

trainX = X[:30730].reshape(-1, 50, 1)

答案 1 :(得分:0)

您发布的代码有两个主要问题:

  1. 输入形状不一致: 该错误表明您的模型期望输入dim=3,但是您将其传递给dim=2。 的确如此,因为cov1d层期望获得 3d 张量(#samples,#steps,#features)。您的训练数据具有shape=(30730,50),因此#samples=30730#steps=50#features=1也是如此。 #samples隐式传递(在运行时确定),因此,请修复以下几行:

    model = Sequential()
    model.add(Conv1D(filters=64, kernel_size=3, activation='relu', input_shape=(50,)))
    

    收件人:

    model = Sequential()
    model.add(Conv1D(filters=64, kernel_size=3, activation='relu', input_shape=(50,1)))
    

    此外,您应该通过添加尺寸来相应地调整训练数据的形状:

    trainX = X[:30730].reshape(-1, 50, 1)
    
  2. 不一致的输出形状:您的模型是使用loss=categorical_crossentropy进行训练的。进行这种损失的训练意味着您应该对训练数据进行一次热编码。因此,如果您有x个类,则trainY中的每个样本都需要使用length=x转换为数组。但是,在您的情况下,模型输出单个输出: model.add(Dense(1, activation='softmax')),因此您应将loss=binary_crossentropy用于“ loss = mse”的分类问题,例如,用于回归问题。