我对keras Conv3D层有疑问。我的输入是具有4个通道的3D体积(图像加上分割蒙版)。
现在Iam想知道conv3D层应如何设置才能正常工作?当我写的时候:
Conv3D(64, (3, 3, 3), activation='relu', padding='same')(inputs)
或
Conv3D(64, 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)
据我了解,内核深度应与图像深度或通道数相同。
现在Iam想知道正确的方法是什么,以及为什么过滤器形状具有5个尺寸。我本来希望有4个(高度,宽度,深度,内核数)
预先感谢
干杯
M
答案 0 :(得分:0)
我认为您对“层输出”应该是正确的期望,但是我认为您可能会将内部层“内核”的形状与该层的处理结果混淆。下面,我提供了一个示例代码,其中包含一些相关数量的打印输出。我相信,如果您查看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.