neural-network - 我可以在 Keras 中使用带有卷积神经网络的矩形图像吗?
问题描述
假设我想使用 Keras 的Convolutional2D
函数来构建一个 CNN,输入图像可以是大小[224, 320, 3]
而不是类似的大小[224, 224, 3]
吗?
我应该将图像保持为矩形格式还是将它们缩放为正方形?我试过把它们做成正方形,但质量大大降低+边缘有重要数据。
如果我用矩形输入图像构建它,它最终会破坏这条线吗?
我还想在 CNN 的末端附加一个解码器,以输出相同形状的图像(本质上是一个带有矩形图像而不是正方形的 VAE)。
解决方案
我可以在任意矩形上使用 Conv2D 吗?
简短的回答是肯定的。使用正方形的一个重要原因是,如果高度和宽度完全相同,那么 maxpooling/strides/padding 的数学运算很容易。它只是让它变得容易。在 224 的情况下,您可以使用 conv2d 和 padding=same,然后多次使用 maxpool 以将高度和宽度从 224 减小到 112,然后是 56、28、14,最后是 7。
当您使用 224x320 的输入图像执行此操作时,缩小的进度如下:224x320、112x160、56x80、28x40、14x20、7x10。没什么大不了的,而且效果很好。相反,如果图像是 224x300,那么在第二维没有很好地划分之前它不会走得太远。
这是自动编码器编码器端的张量流中的一些代码
import tensorflow as tf
import numpy as np
encoder = tf.keras.models.Sequential([
tf.keras.layers.InputLayer([224,320,3]),
tf.keras.layers.Conv2D(filters=16, kernel_size=5, padding='same', activation='tanh'),
tf.keras.layers.MaxPool2D(2),
tf.keras.layers.Conv2D(filters=16, kernel_size=5, padding='same', activation='tanh'),
tf.keras.layers.MaxPool2D(2),
tf.keras.layers.Conv2D(filters=16, kernel_size=5, padding='same', activation='tanh'),
tf.keras.layers.MaxPool2D(2),
tf.keras.layers.Conv2D(filters=16, kernel_size=5, padding='same', activation='tanh'),
tf.keras.layers.MaxPool2D(2),
tf.keras.layers.Conv2D(filters=16, kernel_size=5, padding='same', activation='tanh'),
tf.keras.layers.MaxPool2D(2),
tf.keras.layers.Conv2D(filters=32, kernel_size=5, padding='same', activation='tanh'),
])
data = np.zeros([1,224,320,3], dtype=np.float32)
print( encoder.predict(data).shape )
输出是
(1, 7, 10, 32)
反过来可以用来做解码器
推荐阅读
- javascript - Stripe JS 是否可以调用使用 Javascript 创建文件?
- android - adb connect 连接被拒绝
- android - FabricViewStateManager:在没有 StateWrapper 的情况下调用 setState
- aws-sdk - 尝试使用 AWS SDK 获取数据库描述时出现 cURL 错误 6
- crystal-lang - 为什么我不能在 Int32 上更改 self 的值
- r - 使用 R 在静态图像上插入标记(图钉)
- javascript - Youtube api Search Video + Get Video Views in 1 api Request only
- postgresql - Postgres:更新重型应用程序性能与读取相同的技术?
- javascript - 如何使用扩展程序更改 Chrome 中后退按钮的功能和外观?
- reactjs - reactjs: Es6 无法理解语法