在 Tensorflow 中将 2D 卷积神经网络转换为 1D 卷积神经网络

时间:2021-03-24 21:18:08

标签: tensorflow conv-neural-network openvino

假设我提取了一些特征,它是 10x10 数据(可能是图像或倒谱图)。 通常我会把这个输入到我的 2DConv 中,然后我就会上路了。

我的问题是,如果我必须将它转换为 100 个输入的 1D,除了明显的部分我的过滤器不会检测周围的邻居而只会检测上一个和下一个来检测模式之外,我还会有什么缺点,这可能导致性能下降。

如果我不得不这样做,我会只是重塑,使用重塑层还是使用置换层?

谢谢

2 个答案:

答案 0 :(得分:0)

有关 2D/1D CNN 的优缺点,您可以参考此 detailed thread

在 TensorFlow 中,这些是构建 CNN 架构的过程:

  1. 如有必要,使用 tf.reshape() 对输入进行整形以匹配您打算构建的卷积层(例如,如果使用 2D 卷积,则将其整形为 3 维格式)

  2. 根据输入的维度,使用 tf.nn.conv1d()、tf.nn.conv2d() 或 tf.nn.conv3d 创建卷积层。

  3. 使用 tf.nn.maxpool() 创建一个极化层

  4. 重复步骤 2 和 3 以获得额外的卷积和池化层

  5. 重塑卷积层和池化层的输出,将其展平以准备全连接层

  6. 使用 tf.matmul() 函数创建一个全连接层,使用例如 tf.nn.relu() 添加激活并使用 tf.nn.dropout() 应用 dropout

  7. 再次使用 tf.matmul() 为类别预测创建最后一层

  8. 使用 TensorFlow 变量存储权重和偏差这些只是创建 CNN 模型的基本步骤,还有其他步骤来定义训练和评估、执行模型并对其进行调整

在 CNN 开发的第 2 步中,您使用 tf.nn.conv2d() 创建 2D 卷积层 - 此函数计算给定 4-D 输入和过滤张量的 2-D 卷积。

因此,如果您在具有 784 个特征的 MNIST 数据集示例中找到一维向量,则可以使用 tensorflow reshape 方法将一维向量转换为 conv2d() 函数所需的 4D 输入,Reshape 方法转换为匹配图片格式 [高度 x Width x Channel],那么Tensor input变成4-D:[Batch Size, Height, Width, Channel]:

x = tf.reshape(x, shape=[-1, 28, 28, 1])

其中 x 是占位符向量

x = tf.placeholder(tf.float32, [None, num_input])

您可以参考official Tensorflow documentation

答案 1 :(得分:0)

是的,您对 GNA 的看法是正确的,我们的英特尔 GNA 硬件本身仅支持 1D 卷积,而 2D 卷积是实验性的。

本文 (GNA Plugin - OpenVINO™ Toolkit) 指定了在卷积之前或之后添加 Permute 层的步骤。

您可以尝试两种方法,看看哪种方法适合您。

通常,TensorFlow 中的 1d 卷积是使用 2d 卷积包裹在 reshape 层中创建的,以在 2d 卷积之前添加 H 维,然后将其移除。

同时 MO 在重塑层之前和之后插入置换,因为它们改变了数据的解释。

相关问题