TensorFlow中的自定义卷积层

时间:2019-04-08 22:20:56

标签: python tensorflow keras neural-network conv-neural-network

让我们假设我要在神经网络中制作以下图层:我不希望将正方形卷积滤镜移到某些图像上,而是希望滤镜的形状为其他形状,例如矩形,圆形,三角形等等(这当然是一个愚蠢的示例;我想到的实际情况有所不同)。我该如何在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分配值似乎是可行的。但是我不知道这种方法是否会遇到性能问题。

1 个答案:

答案 0 :(得分:0)

只需使用常规转化层具有正方形滤镜,并且在每次权重更新后将一些值归零:

   g = tf.get_default_graph()
   sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})
   conv1_filter = g.get_tensor_by_name('conv1:0')
   sess.run(tf.assign(conv1_filter, tf.multiply(conv1_filter, my_mask)))

其中my_mask是一个与所需模式匹配的二进制张量(形状和类型与过滤器相同)。

编辑:如果您不熟悉tensorflow,可能会对使用上面的代码感到困惑。我建议您查看此example,尤其是模型is constructed的方式(如果您这样做,则可以将第一层过滤器作为“ conv1 / weights”访问)。另外,我建议切换到PyTorch:)