Numpy 检查模型目标时出错:预期密集_39有3维,但得到了形状为(940,1)的数组

Numpy 检查模型目标时出错:预期密集_39有3维,但得到了形状为(940,1)的数组,numpy,neural-network,deep-learning,keras,keras-layer,Numpy,Neural Network,Deep Learning,Keras,Keras Layer,我试图训练这个卷积神经网络,但无法找出我最后一层的问题所在 model = Sequential() model.add(Conv1D(50, kernel_size=(1), activation='relu', input_dim=50)) model.add(Dense(32)) model.add(Dense(1)) model.summary() model.compile(loss=keras.losses.mean

我试图训练这个卷积神经网络,但无法找出我最后一层的问题所在

model = Sequential()
model.add(Conv1D(50, kernel_size=(1),
                 activation='relu',
                 input_dim=50))
model.add(Dense(32))
model.add(Dense(1))
model.summary()
model.compile(loss=keras.losses.mean_squared_error,
              optimizer=keras.optimizers.adam())

model.fit(X_train, y_train,
          batch_size=940,
          epochs=10,
          verbose=1,
          validation_data=(X_test, y_test))
型号:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv1d_26 (Conv1D)           (None, None, 50)          2550      
_________________________________________________________________
dense_38 (Dense)             (None, None, 32)          1632      
_________________________________________________________________
dense_39 (Dense)             (None, None, 1)           33        
=================================================================
Total params: 4,215.0
Trainable params: 4,215
Non-trainable params: 0.0
_________________________________________________________________
我总是收到以下错误消息:

ValueError:检查模型目标时出错:预期密集_39具有3维,但得到形状为940,1的数组


我怀疑问题在于,对于最后一层,我只有一个输出节点,因此输出维度减少到了两个

1D卷积需要以批大小、长度和通道的形式输入。 Keras会将其报告为无长度通道

因此,需要相应地传递输入_形状。如果数据中只有一个通道,则需要将其定义为:

model.add(Conv1D(50, kernel_size=(1),
             activation='relu',
             input_shape=(50,1)))
确保你的X_序列也遵循这一点,形状像NumberOfSamples,50,1

这将输出形状为NumberOfSamples的张量,50,50-前50个来自引入的长度,第二个来自层中定义的50个过滤器

在此之后,密集层通常需要平坦的数据,而不是二维数据

你可以像以前那样使用它们,但它们会保留额外的维度,而这似乎不是你的目的

如果最后只需要一个类,我猜,在使用密集层之前,需要将数据展平:

model.add(Flatten()) #this will transform (None, 50,50) into (None,2500)
model.add(Dense(32))
model.add(Dense(1))

然后,您的输出将确实具有与您的Y_序列940,1匹配的形状None,1

1D卷积期望以BatchSize、length、Channel的形式输入。 Keras会将其报告为无长度通道

因此,需要相应地传递输入_形状。如果数据中只有一个通道,则需要将其定义为:

model.add(Conv1D(50, kernel_size=(1),
             activation='relu',
             input_shape=(50,1)))
确保你的X_序列也遵循这一点,形状像NumberOfSamples,50,1

这将输出形状为NumberOfSamples的张量,50,50-前50个来自引入的长度,第二个来自层中定义的50个过滤器

在此之后,密集层通常需要平坦的数据,而不是二维数据

你可以像以前那样使用它们,但它们会保留额外的维度,而这似乎不是你的目的

如果最后只需要一个类,我猜,在使用密集层之前,需要将数据展平:

model.add(Flatten()) #this will transform (None, 50,50) into (None,2500)
model.add(Dense(32))
model.add(Dense(1))
那么您的输出将确实具有与您的Y_序列940,1匹配的形状None,1