首页 > 解决方案 > 如何在 keras 中创建滑动二维自动编码器?

问题描述

我正在开发一个针对 MNIST 数据集的玩具 Keras/Tensorflow 项目。我想构建类似于 2D 卷积网络的东西,但我想生成一个密集的向量表示,而不是一堆过滤器。

这是我用来为输入的 3x3 子样本创建自动编码器的模型示例:

model = Sequential()
model.add(Flatten(input_shape=(3, 3)))
model.add(Dense(32, activation='elu'))
model.add(Dense(4, activation='elu'))
model.add(Dense(32, activation='elu'))
model.add(Dense(9, activation='sigmoid'))
model.add(Reshape((3, 3)))

使用这个模型,我知道拓扑接近于我的 3x3 内核。我想弄清楚的是如何在我的 2D 图像上复制/平铺该模型的前三层。我想拥有 Conv2d 层的所有功能,例如步幅/填充,但我不清楚是否/如何用整个多层“子模型”替换该层的内核。

我想要的一些属性:

  1. “内核”需要在平铺实例之间共享,这样我们只需要训练一个内核。
  2. 不管我们如何定义这个内核,如果它可以在 keras 层中表示就好了
  3. 它具有 Conv2d 的所有采样功能,例如填充/步幅/扩张

我尝试过的一些事情:

标签: tensorflowkeras

解决方案


你很幸运,因为有一个tensorflow函数可以完全满足你的要求。你正在寻找tf.image.extract_patches. 您可以将其放在一个tf.keras.layers.Lambda层中以将其包裹在tf.keras.layer.Layer. 一种更清洁的方法是tf.keras.layers.Layer,但它需要更多的努力。有关如何执行此操作的更多信息,请参阅文档tf.keras.layers.Lamba


推荐阅读