【发布时间】:2018-01-29 16:19:58
【问题描述】:
我正在尝试构建一个简单的卷积神经网络来将时间序列分类为六类之一。由于不兼容的形状错误,我在训练网络时遇到问题。
在以下代码中,n_feats = 1000、n_classes = 6。
Fs = 100
input_layer = Input(shape=(None, n_feats), name='input_layer')
conv_layer = Conv1D(filters=32, kernel_size=Fs*4, strides=int(Fs/2), padding='same', activation='relu', name='conv_net_coarse')(input_layer)
conv_layer = MaxPool1D(pool_size=4, name='c_maxp_1')(conv_layer)
conv_layer = Dropout(rate=0.5, name='c_dropo_1')(conv_layer)
output_layer = Dense(n_classes, name='output_layer')(conv_layer)
model = Model(input_layer, output_layer)
model.compile(loss='categorical_crossentropy', optimizer='rmsprop', metrics=['accuracy'])
print(model.summary())
这是模型摘要。
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_layer (InputLayer) (None, None, 1000) 0
_________________________________________________________________
conv_net_coarse (Conv1D) (None, None, 32) 12800032
_________________________________________________________________
c_maxp_1 (MaxPooling1D) (None, None, 32) 0
_________________________________________________________________
c_dropo_1 (Dropout) (None, None, 32) 0
_________________________________________________________________
output_layer (Dense) (None, None, 6) 198
=================================================================
Total params: 12,800,230
Trainable params: 12,800,230
Non-trainable params: 0
_________________________________________________________________
None
当我运行时,model.fit(X_train, Y_train),其中X_train 形状是(30000, 1, 1000) 和Y_train 形状是(30000, 1, 6),我得到不兼容的形状错误:
InvalidArgumentError (see above for traceback): Incompatible shapes: [32,0,6] vs. [1,6,1]
[[Node: output_layer/add = Add[T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/gpu:0"](output_layer/Reshape_2, output_layer/Reshape_3)]]
[[Node: metrics_1/acc/Mean/_197 = _Recv[client_terminated=false, recv_device="/job:localhost/replica:0/task:0/cpu:0", send_device="/job:localhost/replica:0/task:0/gpu:0", send_device_incarnation=1, tensor_name="edge_637_metrics_1/acc/Mean", tensor_type=DT_FLOAT, _device="/job:localhost/replica:0/task:0/cpu:0"]()]]
如果我删除 MaxPool1D 和 Dropout 层,模型训练得很好。我没有正确指定这些层吗?
任何帮助将不胜感激!
【问题讨论】:
-
您有一个时间序列还是多个时间序列?因为现在你有
30000长度为1的序列和1000特征。我说的对吗? -
我有 30000 个样本和 1000 个特征。所以基本上我有一个形状矩阵
30000 X 1000。如果我使用这个 2D 矩阵作为输入,Keras 会给我一个错误,说需要 3 个维度。因此我将它改造成30000 X 1 X 1000。与输出相同。 -
你想把一个序列切成块还是一次性输入整个序列?
-
我想对长度为1000的整个序列进行分类。我不想将它进一步切成块。
-
好的 - 所以
1000是一个序列的长度,对吧?
标签: python tensorflow neural-network keras conv-neural-network