python - TensorFlow 中的自定义卷积层

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

假设我想在神经网络中创建以下层:我希望过滤器的形状不是在某些图像上移动的方形卷积滤波器,而是其他形状,比如矩形、圆形、三角形等(这当然是一个愚蠢的例子;我想到的真实案例是不同的)。我将如何在 TensorFlow 中实现这样一个层?

我发现可以通过扩展 tf.keras.layers.Layer 在 Keras 中定义自定义层,但是文档非常有限,没有很多示例。通过例如扩展 tf.keras.layer.Layer 实现卷积层的 python 可能也有帮助,但似乎卷积层是用 C 实现的。这是否意味着我有在 C 中实现我的自定义层以获得任何合理的速度,或者 Python TensorFlow 操作是否足够?

编辑:如果我可以只定义一个权重张量就足够了,但是我可以在张量中自定义完全为零的条目并且一些权重出现在这个张量的多个位置,那么我应该能够手动构建一个卷积层和其他层。我将如何做到这一点,并将这些变量也包含在训练中?

Edit2:让我添加更多说明。我们可以举个例子,从头开始构建一个带有一个输出 channel 的 5x5 卷积层。如果输入是 10x10(加上填充所以输出也是 10x10)),我会想象通过创建一个大小为 100x100 的矩阵来做到这一点。然后我将在该矩阵的正确位置填写 25 个权重(因此一些条目为零,而一些条目相等,即所有 25 个权重将出现在该矩阵的许多位置)。然后我将输入与该矩阵相乘以获得输出。所以我的问题是双重的: 1. 我如何在 TensorFlow 中执行此操作? 2. 这会不会非常低效,是否推荐一些其他方法(假设我想稍后自定义此过滤器的外观,因此标准 conv2d 不够好)。

Edit3:使用稀疏张量并通过先前定义的 tf.Variable 赋值似乎是可行的。但是我不知道这种方法是否会遇到性能问题。

最佳答案

只需使用常规转化。带有方形过滤器的图层,并在每次权重更新后将一些值清零:

   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 :)

关于python - TensorFlow 中的自定义卷积层,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55582569/

相关文章:

Python Matplotlib : "ImportError: cannot import name flatten"

python - 如何在 pandas 中调用函数

Python Folium Choropleth map KeyError : None

python - 将此函数从递归转换为迭代

tensorflow - 如何清除 Tensorflow-Keras GPU 内存?

python - tflearn 创建多个模型

python - 在使用 TensorFlow 实现的 AlexNet 中输入数据时出现维度错误

tensorflow - Keras 的 AUC(曲线 ='PR' )和 Scikit-learn 的 average_precision_score 有什么区别?

python - Keras `fit_generator` 验证准确度低,但 `fit` 验证准确度低

python - 拟合模型时如何在keras/tensorflow中使用多线程?