【发布时间】:2019-04-08 22:20:56
【问题描述】:
假设我想在神经网络中创建以下层:我希望过滤器的形状为其他形状,而不是在某个图像上移动的方形卷积滤波器,例如矩形、圆形、三角形等(这当然是一个愚蠢的例子;我想到的真实情况是不同的)。我将如何在 TensorFlow 中实现这样的层?
我发现可以通过扩展tf.keras.layers.Layer 在 Keras 中定义自定义层,但是文档非常有限,没有太多示例。通过例如扩展tf.keras.layer.Layer 来实现卷积层的python 实现可能也会有所帮助,但似乎卷积层是用C 实现的。这是否意味着我必须在C 中实现我的自定义层才能获得任何合理的速度还是 Python TensorFlow 操作就足够了?
编辑:如果我可以定义一个权重张量也许就足够了,但是我可以自定义张量中相同为零的条目并且一些权重出现在这个张量的多个位置,那么我应该能够手工构建卷积层和其他层。我将如何做到这一点,并在训练中包含这些变量?
Edit2:让我添加更多说明。我们可以以从头开始构建具有一个输出通道的 5x5 卷积层为例。如果输入是 10x10(加上填充,所以输出也是 10x10)),我想通过创建一个大小为 100x100 的矩阵来做到这一点。然后我会在这个矩阵的正确位置填写 25 个权重(所以有些条目是零,有些条目是相等的,即所有 25 个权重都会出现在这个矩阵的许多位置)。然后我将输入与该矩阵相乘以获得输出。所以我的问题是双重的: 1. 我如何在TensorFlow 中做到这一点? 2. 这会不会非常低效,是否推荐其他方法(假设我想稍后自定义此过滤器的外观,因此标准conv2d 不够好)。
Edit3:使用稀疏张量并通过先前定义的tf.Variable 分配值似乎是可行的。但是我不知道这种方法是否会遇到性能问题。
【问题讨论】:
-
您可以使用 PyTorch 的
unfold功能在 PyTorch 中构建非常高效的卷积层(不幸的是,我不知道 Tensorflow 中有类似的东西),但我不知道这是否适合您。跨度> -
谢谢,也许吧,但这对于我心中的真实例子来说可能还不够好,但我会研究一下。我真的在寻找一种尽可能多地定制的方法,最好是在 tensorflow 中。但请看我的编辑
-
有些部分我不清楚:
but where I can customize entries in the tensor that are identically zero- 你说的where是什么意思?在哪里,好像在代码中的哪里?identically zero是什么?你只是想把这个张量中的一些权重归零?下一部分:some weights showing up in multiple places in this tensor- 您的意思是共享权重还是具有相同的值?这些权重的形状是什么(矩阵、3d 张量,如 2D 卷积中的滤波器)?澄清这些会有所帮助(如果我们在同一页面上,可能会在 12 小时左右对您有所帮助)。 -
很抱歉给您带来了困惑。我正在想象从头开始构建一个卷积层(为简单起见,假设一个通道)。在这种情况下,如果过滤器的大小为 5x5,则只有 25 个不同的权重。但是,如果我们将此操作写为矩阵乘法,这些相同的权重会出现在矩阵中的许多地方,而该矩阵中的许多其他元素为零(因为矩阵中只有 25 个条目耦合到一个输出)。这就是我上面那些 cmets 的意思。
-
我现在计划这样做,首先通过 tf.Variable 定义 25 个权重,然后创建一个 tf.Tensor 并将这些权重放入正确的条目中,其他条目为零,然后使用matmul 将输入与此矩阵相乘。我想知道这是推荐的方法还是我忽略了某些东西。
标签: python tensorflow keras neural-network conv-neural-network