簡體   English   中英

在 Keras 中對 4D 數據執行 Conv2D

[英]Performing Conv2D on 4D data in Keras

我有尺寸為24*64*64*10 (不包括批量大小)。

我想將輸入拆分為64*64*10維度的 24 個輸入,對每個輸入執行Conv2D ,然后將它們連接起來以再次獲取 4D 數據以進行進一步處理。

有關實施的任何幫助都會有所幫助。 我正在與 Keras 合作。

編輯:我嘗試使用以下代碼來執行 2D 卷積

num_ch= 24
input= Input(shape=(64,64,10,num_ch))
print(input.shape)
branch_out= []
for i in range(num_ch):
    out= Lambda(lambda x: x[:,:,:,:,i] )(input)
    print(out.shape)
    out= Conv2D(10, kernel_size=(3,3),strides= (1,1), padding='same', data_format= 'channels_last')(input)
    branch_out.append(out)

我收到以下錯誤:

(?, 64, 64, 10, 24)
(?, 64, 64, 10)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-83-51977f4edbba> in <module>
      7     out= Lambda(lambda x: x[:,:,:,:,i] )(input)
      8     print(out.shape)
----> 9     out= Conv2D(10, kernel_size=(3,3),strides= (1,1), padding='same', data_format= 'channels_last')(input)
     10     branch_out.append(out)

~/anaconda3/lib/python3.7/site-packages/keras/engine/base_layer.py in __call__(self, inputs, **kwargs)
    412                 # Raise exceptions in case the input is not compatible
    413                 # with the input_spec specified in the layer constructor.
--> 414                 self.assert_input_compatibility(inputs)
    415 
    416                 # Collect input shapes to build layer.

~/anaconda3/lib/python3.7/site-packages/keras/engine/base_layer.py in assert_input_compatibility(self, inputs)
    309                                      self.name + ': expected ndim=' +
    310                                      str(spec.ndim) + ', found ndim=' +
--> 311                                      str(K.ndim(x)))
    312             if spec.max_ndim is not None:
    313                 ndim = K.ndim(x)

ValueError: Input 0 is incompatible with layer conv2d_25: expected ndim=4, found ndim=5

你在這一行有一個錯字:

out= Conv2D(10, kernel_size=(3,3),strides= (1,1), padding='same', data_format= 'channels_last')(input)

將其更改為:

out= Conv2D(10, kernel_size=(3,3),strides= (1,1), padding='same', data_format= 'channels_last')(out)

太晚了,但對於那些有同樣問題的人來說......
我認為您可以將其傳遞給 Conv 層(也許我錯了!)。 下面的代碼是來自 keras 的一個例子: 鏈接

>>> # With extended batch shape [4, 7]:  
>>> input_shape = (4, 7, 28, 28, 3)
>>> x = tf.random.normal(input_shape)
>>> y = tf.keras.layers.Conv2D(
... 2, 3, activation='relu', input_shape=input_shape[2:])(x)
>>> print(y.shape)
(4, 7, 26, 26, 2)

或者另一種方法是使用TimeDistributed層。 看看這個鏈接

model = Sequential()
model.add(TimeDistributed(Conv2D(5, (3,3), padding='same'), input_shape=(10, 100, 100, 3)))

model.summary()

模型總結:

Layer (type)                 Output Shape              Param #   
=================================================================
time_distributed_2 (TimeDist (None, 10, 100, 100, 5)   140       
=================================================================
Total params: 140
Trainable params: 140
Non-trainable params: 0
_________________________________________________________________

暫無
暫無

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

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