我正在尝试使用一个简单的RNN来使用Physionet数据库预测帕金森的步态。我正在为RNN提供高度为240,宽度为16像素的图像。我还使用模型检查点和监视验证准确性来保存最佳权重。在尝试输入形状到RNN时,我得到的错误为
ValueError: Input 0 of layer sequential_13 is incompatible with the layer: expected ndim=3, found ndim=4. Full shape received: (None, None, None, None)
RNN模型:
model = Sequential()
model.add(SimpleRNN(24, kernel_initializer='glorot_uniform', input_shape=(64,240), return_sequences = True))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Flatten())
model.add(Dense(2))
model.add(Activation('softmax'))
opt = optimizers.RMSprop(learning_rate=0.001, decay=1e-6)
epoch=10
early_stopping = EarlyStopping(monitor='val_accuracy', patience=60, verbose=1, mode='auto')
checkpoint = ModelCheckpoint("model_parkinsons.h5",
monitor='val_accuracy', verbose=0, save_best_only=True,
save_weights_only=False, mode='auto', save_freq='epoch')
model.compile(loss='binary_crossentropy',
optimizer=opt,
metrics=['accuracy'])
批量大小:64
图片高度:240
a.shape
Output: (64, 16, 240, 1)
我尝试将输入形状馈送为a.shape[1:]
但是我得到的错误是预期的3维,但得到了4维。
请帮我解决这个问题。
在第一层中,您指定了网络的输入形状。此形状不包括您的批大小。因此,如果您指定"input_shape=(64,240)",这意味着您的最终输入将需要具有形状(batch_size, 64,240)。因为64是你的批大小,看起来肯定有什么地方出了问题。另外,你的输入有四个维度:(64,16,240,1),但是你的第一层需要三维输入。我不太明白你想用你的模型实现什么,但是如果你在你的模型中输入a[:,:,:, 0]而不是a,它应该工作。此外,你需要设置"input_shape=(16,240)"在第一层。如果您做了这两件事,那么您的模型将使用RNN一次处理图像的一列。这种方法对我来说没有任何意义(因为rnn不用于图像处理,至少不是以这种形式),但我没有看到任何其他方法来解释你已经做过的事情。