Python Keras更具有3个以上通道的Conv3D

Python Keras更具有3个以上通道的Conv3D,python,keras,Python,Keras,我有一个关于keras Conv3D层的问题。我的输入是带有4个通道的3D体积(图像加上分割遮罩) 现在我想知道如何设置conv3D层才能正常工作?当我写作时: Conv3D(64, (3, 3, 3), activation='relu', padding='same')(inputs) 或 然后打印出过滤器形状,上面写着: (3,3,3,4,64) 当我写作时: Conv3D(64, (3, 3, 4), activation='relu', padding='same')(input

我有一个关于keras Conv3D层的问题。我的输入是带有4个通道的3D体积(图像加上分割遮罩)

现在我想知道如何设置conv3D层才能正常工作?当我写作时:

Conv3D(64, (3, 3, 3), activation='relu', padding='same')(inputs)  

然后打印出过滤器形状,上面写着:

(3,3,3,4,64)

当我写作时:

Conv3D(64, (3, 3, 4), activation='relu', padding='same')(inputs) 
但是,过滤器形状是:

(3,3,4,4,64)

据我所知,内核深度应该与图像深度或通道数相同

现在我想知道什么是正确的方法,为什么过滤器形状有5维。我希望有4个(高、宽、深、粒数)

提前感谢,

干杯


我认为您对“层输出”应该是什么的期望是正确的,但我认为您可能混淆了内部层“内核”的形状与该层处理的结果。下面,我提供了一个示例代码,其中包含一些相关数量的打印输出。我相信,如果您查看myModel.summary()的输出,就会看到您期望的结果。请注意,Keras使用“无”作为样本尺寸是根据实际输入数据确定的。我希望这有帮助

%tensorflow_version 2.x

import tensorflow as tf
import numpy as np

output_units=7

input_data = tf.keras.layers.Input(shape=(16, 16, 16, 4))
c3d = tf.keras.layers.Conv3D(output_units, (3,3,3), padding='same', name='c3d') (input_data)
x = tf.keras.layers.Flatten()(c3d)
x = tf.keras.layers.Dense(1)(x)
myModel =  tf.keras.models.Model(inputs=input_data, outputs=x)

myModel.summary()

x_train = np.random.random((20,16,16,16,4))
y_train = np.random.random((20,1))

myModel.compile(optimizer='rmsprop', loss='mse')
myModel.fit(x_train,y_train,epochs=1)

print(x_train.shape)
print(y_train.shape)

mmy = myModel.get_layer(name='c3d')
print(mmy.kernel.shape)  # This shouldn't be confused with the layer output from the myModel.summary() above.

谢谢你的回复!据我所知,您的示例中有一个具有4个通道的卷,并且您将过滤器大小定义为(3,3,3)。我想这就是我困惑的原因。为什么(3,3,4)不覆盖所有4个频道?或者卷积是分别在每个通道上执行的?我相信每个通道都用一组单独的权重进行处理,然后将这些权重与所有其他通道的权重组合,最终结果显示在给定的输出单元中。对于每个输出单元,该过程基本上是重复的。因此,在我提供的例子中,7个输出单元中的每一个都将以这种方式导出贡献。因此,所有四个通道都会被自动考虑(即使您只是在“内核”中指定空间维度,它基本上在卷中滑动),我希望这会有所帮助。
%tensorflow_version 2.x

import tensorflow as tf
import numpy as np

output_units=7

input_data = tf.keras.layers.Input(shape=(16, 16, 16, 4))
c3d = tf.keras.layers.Conv3D(output_units, (3,3,3), padding='same', name='c3d') (input_data)
x = tf.keras.layers.Flatten()(c3d)
x = tf.keras.layers.Dense(1)(x)
myModel =  tf.keras.models.Model(inputs=input_data, outputs=x)

myModel.summary()

x_train = np.random.random((20,16,16,16,4))
y_train = np.random.random((20,1))

myModel.compile(optimizer='rmsprop', loss='mse')
myModel.fit(x_train,y_train,epochs=1)

print(x_train.shape)
print(y_train.shape)

mmy = myModel.get_layer(name='c3d')
print(mmy.kernel.shape)  # This shouldn't be confused with the layer output from the myModel.summary() above.