【发布时间】:2021-07-19 20:25:44
【问题描述】:
我正在使用 Python 中的 TF/Keras 进行卷积神经网络的机器学习项目,我的目标是将图像分割成块,分别对每个块运行卷积,然后将其重新组合在一起.
我不知道该怎么做是为 3D 数组的每个切片运行卷积。
例如,如果我有一个大小为 (500,100,100) 的张量,我想对大小为 (100 x 100) 的所有 500 个切片进行单独的卷积。我正在自定义 Keras 层中实现这一点,并希望这些是可训练的权重,我尝试了一些不同的方法:
- 使用
map.fn()为数组的每个切片运行卷积- 这似乎没有分别为每一层附加权重。
- 使用
DepthwiseConv2D层:- 这适用于第一次调用层,但当我使用更多过滤器第二次调用层时失败,因为它想在之前的每个过滤层上执行
depthwise卷积 - 这当然不是我想要的,因为我想为前一层的每组过滤器进行一次卷积。
- 这适用于第一次调用层,但当我使用更多过滤器第二次调用层时失败,因为它想在之前的每个过滤层上执行
感谢任何想法,因为我真的被困在这里。谢谢!
【问题讨论】:
-
不确定我是否完全理解您的问题,但是如果您有一个形状为 (500,100,100) 的张量并且想要输入该张量的某个子集,以同时分离 conv2d 层,您可以这样做通过在同一级别定义 conv2d 层。例如,如果要将张量提供给 5 个单独的 conv2d 层,则应创建其输出为 (500,100,100) 的层的 5 个分支到 5 个 lambda 层,这些层提取形状 (100,100,100) 的补丁并将它们中的每一个连接到分离 conv2d 层,然后连接它们的输出。
-
@Kaveh 感谢您的回复!这是有道理的,但我不完全确定如何实现这一点。我尝试使用 map.fn() 每次都应用 lambda 函数:
out = tf.map_fn(Lambda(lambda x: self.Conv2Dee(x)),img)其中“img”是我的张量堆栈,“Conv2Dee”是我编写的自定义卷积函数,但出现以下错误:The following Variables were created within a Lambda layer (lambda) but are not tracked by said layer: The layer cannot safely ensure proper Variable reuse across multiple calls, and consquently this behavior is disallowed for safety...
标签: python tensorflow keras deep-learning neural-network