我正在使用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
请帮助我解决这种情况!
谢谢
答案 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)
您发布的代码有两个主要问题:
输入形状不一致:
该错误表明您的模型期望输入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)
不一致的输出形状:您的模型是使用loss=categorical_crossentropy
进行训练的。进行这种损失的训练意味着您应该对训练数据进行一次热编码。因此,如果您有x个类,则trainY中的每个样本都需要使用length=x
转换为数组。但是,在您的情况下,模型输出单个输出:
model.add(Dense(1, activation='softmax'))
,因此您应将loss=binary_crossentropy
用于“ loss = mse”的分类问题,例如,用于回归问题。