簡體   English   中英

使用Keras + Tensorflow訓練ConvNet時出現不兼容的形狀錯誤

[英]Incompatible shapes error while training ConvNet using Keras+Tensorflow

我正在嘗試構建一個簡單的卷積神經網絡,以將時間序列分為六類之一。 由於形狀不兼容錯誤,我在訓練網絡時遇到問題。

在以下代碼中, n_feats = 1000n_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, 1000)Y_train形狀為(30000, 1, 6) 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"]()]]

如果刪除MaxPool1DDropout圖層,則模型訓練就很好。 我沒有正確指定這些圖層嗎?

任何幫助,將不勝感激!

所以-問題在於兩個事實:

  1. 輸入形狀應為(number_of_examples, timesteps, features)要素(number_of_examples, timesteps, features) ,其中要素是每個時間步記錄的內容。 這意味着您應該將數據重塑為(number_of_examples, 1000, 1)因為您的時間序列具有1000個時間步長和1個功能。
  2. 解決分類任務時-您需要將輸入壓縮到向量(從序列中)。 我建議您在Dropout層之前使用Flatten

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM