【问题标题】:1 dimenstional convolution error in using tensorflow使用张量流时的一维卷积误差
【发布时间】:2020-05-14 13:56:55
【问题描述】:

我正在使用 tensorflow 研究一维卷积。

代码:

import numpy as np    
import tensorflow as tf

\#####raw data, input length is 24, and feature_len is 6

batch = np.ceil((np.random.rand(24, 6)*10))-5

\#####filter for convoltion, filter width is 3, filter input dim is 6, output dim is 18

eye_filter = tf.constant(np.eye(3*6).reshape(3,6,18).reshape(3,6,18))

\#####here error happened

conv = tf.nn.conv1d(input=batch, filters=eye_filter, stride=1, padding='SAME')

错误信息:

InvalidArgumentError Traceback(最近调用 最后的) /usr/local/lib/python3.6/dist-packages/tensorflow_core/python/framework/ops.py 在 _create_c_op(graph, node_def, inputs, control_inputs) 1606
尝试: -> 1607 c_op = c_api.TF_FinishOperation(op_desc) 1608 除了errors.InvalidArgumentError as e:

InvalidArgumentError:形状必须为 4 级,但为 3 级 'conv1d_1' (op: 'Conv2D') 输入形状:[24,1,6], [1,3,6,18]。

在处理上述异常的过程中,又发生了一个异常:

ValueError Traceback(最近调用 最后)10帧 /usr/local/lib/python3.6/dist-packages/tensorflow_core/python/framework/ops.py 在 _create_c_op(graph, node_def, inputs, control_inputs) 1608
除了 errors.InvalidArgumentError as e: 1609 # 转换为 ValueError 用于向后兼容。 -> 1610 raise ValueError(str(e)) 1611 1612 return c_op

ValueError: Shape 必须是 4 级,但 'conv1d_1' 是 3 级(操作: 'Conv2D') 输入形状:[24,1,6], [1,3,6,18]。

当我将过滤器重设为 3 时,为什么过滤器等级为 4?
为什么我做 conv1d 的时候 op name 是 Conv2D?

如何查看以上两个张量(原始数据和过滤器)的卷积结果?

【问题讨论】:

    标签: tensorflow convolution


    【解决方案1】:

    它期望您的输入张量为“Rank 4”,这意味着它有 4 个维度,但您在技术上给出了一个二维数组。

    根据以下 API 文档,从技术上讲,Conv1d 使用 Conv2d,如您所见: conv1d api doc

    您的输入数据数组长度为 24,特征通道有 6 个。 TF 卷积函数可以对输入数组进行操作。 这意味着您的数据还必须有一个索引,以便从您要选择的一批输入中找到哪个元素。我从您的示例中猜测您只想传递一个输入。要解决此问题,您需要重塑张量以具有此额外维度,但长度为 1。

    真的,conv1d 只需要您的输入为 3 级,但它会透明地插入长度为 1 的新维度,因此它是 2d(想象一下分辨率为 1920x1 的显示器。技术上是 2d,但只有 1 个像素高)。然后将其传递给 conv2d

    不要将数据保存为 np 数组,而是使用this function,然后将其重新整形为 [Nth item (length 1)][Width (length 24)][Channel (length 6)]

    以下是我将如何重写您的代码:

    import numpy as np    
    import tensorflow as tf
    
    #####raw data, input length is 24, and feature_len is 6
    
    batch = np.ceil((np.random.rand(24, 6)*10))-5
    batch = tf.convert_to_tensor(batch, dtype=int32)
    batch = tf.reshape(batch, shape=[1, 24, 6], dtype=int32)
    
    #####filter for convoltion, filter width is 3, filter input dim is 6, output dim is 18
    
    eye_filter = tf.constant(np.eye(3*6).reshape(3,6,18).reshape(3,6,18))
    
    #####here error happened
    
    # I added the optional data_format parameter
    conv = tf.nn.conv1d(input=batch, data_format='NWC', filters=eye_filter, stride=1, padding='SAME')
    

    我从 conv1d api 文档中选择了关于 data_format 参数的特定形状排序,该参数默认为“NWC”或 Nth_item 宽度通道。在 conv2d 中,它具有“NCHW”或类似名称。我会确保你理解它是如何工作的,这样在未来你就不会从一个你没想到的数组中得到奇怪的结果。

    如果您想查看张量输出,您需要制作图表并在会话中运行它。或者您可以打开急切执行。

    sess = tf.Session()
    print(sess.run(conv))
    sess.close()
    

    eager execution

    通常,您会使用会话来提高计算速度,并使用急切执行来调试、学习或验证数据是否正确导入。

    【讨论】:

      猜你喜欢
      • 2017-03-18
      • 1970-01-01
      • 2018-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-01
      • 2020-07-16
      • 1970-01-01
      相关资源
      最近更新 更多