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