我正在尝试创建用于分析ECG信号的多通道一维CNN。我有258个12导联心电图,长度为300个样本,因此我的输入尺寸为(258,300,12)。
model = Sequential()
model.add(Conv1D(filters=64, kernel_size=10, activation='relu', input_shape=(n_timesteps,n_features), padding='same'))
model.add(MaxPooling1D(pool_size=2))
model.add(Conv1D(filters=64, kernel_size=10, activation='relu', padding='same'))
model.add(MaxPooling1D(pool_size=2))
model.add(Conv1D(filters=64, kernel_size=10, activation='relu', padding='same'))
model.add(MaxPooling1D(pool_size=2))
model.add(Conv1D(filters=64, kernel_size=10, activation='relu', padding='same'))
model.add(MaxPooling1D(pool_size=2))
model.add(Flatten())
model.add(Dense(100, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(num_classes, activation='softmax'))
model.summary()
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
history = model.fit(X_train, y_train, epochs=10, batch_size=20, verbose=1, validation_split = 0.2)
我正在运行上面的代码,并收到以下错误
ValueError:检查目标时出错:预期density_8的形状为(2,),但数组的形状为(1,)
感谢您的帮助!
答案 0 :(得分:0)
因此,您正在解决二进制分类问题。
错误消息表明我们的模型期望标签的形状为(2,)
,并且我认为您正在使用num_classes=2
。但是,您提供的标签为1
或0
或(1,)
。要解决此错误,您需要更改模型的输出密集层,并且该层应具有一个具有sigmoid
激活功能的神经元。
model.add(Dense(num_classes, activation='sigmoid')) # num_classes=1
答案 1 :(得分:0)
您正在尝试像这样训练模型,
model.fit(X_train, y_train, epochs=10, batch_size=20, verbose=1, validation_split = 0.2)
y_train
的形状类似于(n, 1)
,其中n
是用于训练的样本数。
现在,您正在使用最后一层构建模型,
model.add(Dense(num_classes, activation='softmax'))
从错误消息中,可以推断出您正在设置num_classes=2
。因此,最后一层将具有2
个节点。这样的模型期望y_train
的形状为(n,2)
。但是您正在使用形状为y_train
的{{1}}。
为解决错误,您可以将最后一层更改为
(n,1)
请注意,激活功能应更改为num_classes = 1
model.add(Dense(num_classes, activation='sigmoid'))
。