当前位置: 首页 > 面试题库 >

张量流中的基本一维卷积

吕胤
2023-03-14
问题内容

好的,我想在Tensorflow中对时间序列数据进行一维卷积。tf.nn.conv2d根据这些
票证和手册,显然可以支持此操作。唯一的要求是设置strides=[1,1,1,1]。听起来很简单!

但是,即使在非常小的测试用例中,我也无法弄清楚该如何做。我究竟做错了什么?

让我们进行设置。

import tensorflow as tf
import numpy as np
print(tf.__version__)
>>> 0.9.0

好的,现在在两个小的数组上生成基本的卷积测试。我将通过使用1的批量大小来简化该操作,并且由于时间序列是一维的,因此我的“图像高度”将为1。并且由于它是单变量时间序列,因此显然“通道”的数量也是1,所以这很简单,对吧?

g = tf.Graph()
with g.as_default():
    # data shape is "[batch, in_height, in_width, in_channels]",
    x = tf.Variable(np.array([0.0, 0.0, 0.0, 0.0, 1.0]).reshape(1,1,-1,1), name="x")
    # filter shape is "[filter_height, filter_width, in_channels, out_channels]"
    phi = tf.Variable(np.array([0.0, 0.5, 1.0]).reshape(1,-1,1,1), name="phi")
    conv = tf.nn.conv2d(
        phi,
        x,
        strides=[1, 1, 1, 1],
        padding="SAME",
        name="conv")

繁荣。错误。

ValueError: Dimensions 1 and 5 are not compatible

好的,首先,我不知道在 任何 维度上该如何发生,因为我已指定在卷积OP中填充参数。

但很好,也许对此有限制。我一定对文档感到困惑,并且在张量的错误轴上设置了这种卷积。我将尝试所有可能的排列:

for i in range(4):
    for j in range(4):
        shape1 = [1,1,1,1]
        shape1[i] = -1
        shape2 = [1,1,1,1]
        shape2[j] = -1
        x_array = np.array([0.0, 0.0, 0.0, 0.0, 1.0]).reshape(*shape1)
        phi_array = np.array([0.0, 0.5, 1.0]).reshape(*shape2)
        try:
            g = tf.Graph()
            with g.as_default():
                x = tf.Variable(x_array, name="x")
                phi = tf.Variable(phi_array, name="phi")
                conv = tf.nn.conv2d(
                    x,
                    phi,
                    strides=[1, 1, 1, 1],
                    padding="SAME",
                    name="conv")
                init_op = tf.initialize_all_variables()
            sess = tf.Session(graph=g)
            sess.run(init_op)
            print("SUCCEEDED!", x_array.shape, phi_array.shape, conv.eval(session=sess))
            sess.close()
        except Exception as e:
            print("FAILED!", x_array.shape, phi_array.shape, type(e), e.args or e._message)

结果:

FAILED! (5, 1, 1, 1) (3, 1, 1, 1) <class 'ValueError'> ('Filter must not be larger than the input: Filter: (3, 1) Input: (1, 1)',)
FAILED! (5, 1, 1, 1) (1, 3, 1, 1) <class 'ValueError'> ('Filter must not be larger than the input: Filter: (1, 3) Input: (1, 1)',)
FAILED! (5, 1, 1, 1) (1, 1, 3, 1) <class 'ValueError'> ('Dimensions 1 and 3 are not compatible',)
FAILED! (5, 1, 1, 1) (1, 1, 1, 3) <class 'tensorflow.python.framework.errors.InvalidArgumentError'> No OpKernel was registered to support Op 'Conv2D' with these attrs
     [[Node: conv = Conv2D[T=DT_DOUBLE, data_format="NHWC", padding="SAME", strides=[1, 1, 1, 1], use_cudnn_on_gpu=true](x/read, phi/read)]]
FAILED! (1, 5, 1, 1) (3, 1, 1, 1) <class 'tensorflow.python.framework.errors.InvalidArgumentError'> No OpKernel was registered to support Op 'Conv2D' with these attrs
     [[Node: conv = Conv2D[T=DT_DOUBLE, data_format="NHWC", padding="SAME", strides=[1, 1, 1, 1], use_cudnn_on_gpu=true](x/read, phi/read)]]
FAILED! (1, 5, 1, 1) (1, 3, 1, 1) <class 'ValueError'> ('Filter must not be larger than the input: Filter: (1, 3) Input: (5, 1)',)
FAILED! (1, 5, 1, 1) (1, 1, 3, 1) <class 'ValueError'> ('Dimensions 1 and 3 are not compatible',)
FAILED! (1, 5, 1, 1) (1, 1, 1, 3) <class 'tensorflow.python.framework.errors.InvalidArgumentError'> No OpKernel was registered to support Op 'Conv2D' with these attrs
     [[Node: conv = Conv2D[T=DT_DOUBLE, data_format="NHWC", padding="SAME", strides=[1, 1, 1, 1], use_cudnn_on_gpu=true](x/read, phi/read)]]
FAILED! (1, 1, 5, 1) (3, 1, 1, 1) <class 'ValueError'> ('Filter must not be larger than the input: Filter: (3, 1) Input: (1, 5)',)
FAILED! (1, 1, 5, 1) (1, 3, 1, 1) <class 'tensorflow.python.framework.errors.InvalidArgumentError'> No OpKernel was registered to support Op 'Conv2D' with these attrs
     [[Node: conv = Conv2D[T=DT_DOUBLE, data_format="NHWC", padding="SAME", strides=[1, 1, 1, 1], use_cudnn_on_gpu=true](x/read, phi/read)]]
FAILED! (1, 1, 5, 1) (1, 1, 3, 1) <class 'ValueError'> ('Dimensions 1 and 3 are not compatible',)
FAILED! (1, 1, 5, 1) (1, 1, 1, 3) <class 'tensorflow.python.framework.errors.InvalidArgumentError'> No OpKernel was registered to support Op 'Conv2D' with these attrs
     [[Node: conv = Conv2D[T=DT_DOUBLE, data_format="NHWC", padding="SAME", strides=[1, 1, 1, 1], use_cudnn_on_gpu=true](x/read, phi/read)]]
FAILED! (1, 1, 1, 5) (3, 1, 1, 1) <class 'ValueError'> ('Dimensions 5 and 1 are not compatible',)
FAILED! (1, 1, 1, 5) (1, 3, 1, 1) <class 'ValueError'> ('Dimensions 5 and 1 are not compatible',)
FAILED! (1, 1, 1, 5) (1, 1, 3, 1) <class 'ValueError'> ('Dimensions 5 and 3 are not compatible',)
FAILED! (1, 1, 1, 5) (1, 1, 1, 3) <class 'ValueError'> ('Dimensions 5 and 1 are not compatible',)

嗯 好的,看来现在有两个问题。首先,ValueError我想是关于沿错误的轴应用滤镜的,尽管有两种形式。

但是,随后我可以沿其应用过滤器的轴也令人困惑-
请注意,它实际上构造的图形具有输入形状(5,1,1,1,1)和过滤器形状(1,1,1,3)。从文档的AFAICT来看,这应该是一个筛选器,以批次为例,一个“像素”和一个“通道”,输出3个“通道”。那么,当其他人不起作用时,为什么一个人起作用呢?

无论如何,有时在构建图形时它不会失败。有时它会构造图;然后我们得到了tensorflow.python.framework.errors.InvalidArgumentError。从一些令人困惑的github票证中,我收集到这可能是由于
我在CPU而不是GPU上运行的事实,反之亦然 卷积运算仅针对32位浮点数而不是64位浮点数进行定义的事实。如果任何人都可能会引发一些光
轴我应该对准 什么 上,为了与卷积内核时间序列,我会非常感激。


问题答案:

不好意思地说,但是您的第一个代码几乎是正确的。你只是倒置xphitf.nn.conv2d

g = tf.Graph()
with g.as_default():
    # data shape is "[batch, in_height, in_width, in_channels]",
    x = tf.Variable(np.array([0.0, 0.0, 0.0, 0.0, 1.0]).reshape(1, 1, 5, 1), name="x")
    # filter shape is "[filter_height, filter_width, in_channels, out_channels]"
    phi = tf.Variable(np.array([0.0, 0.5, 1.0]).reshape(1, 3, 1, 1), name="phi")
    conv = tf.nn.conv2d(
        x,
        phi,
        strides=[1, 1, 1, 1],
        padding="SAME",
        name="conv")

更新:
从版本r0.11开始,TensorFlow现在支持使用1D卷积tf.nn.conv1d。我以前在粘贴到这里的stackoverflow文档中(现在已绝种)做了一个使用它们的指南:

一维卷积指南

考虑一个基本示例,该示例的长度10和尺寸输入16。批量大小为32。因此,我们有一个带有输入shape的占位符[batch_size, 10, 16]

batch_size = 32
x = tf.placeholder(tf.float32, [batch_size, 10, 16])

然后,我们创建一个宽度为3的过滤器,并以16通道作为输入,并同时输出16通道。

filter = tf.zeros([3, 16, 16])  # these should be real values, not 0

最后,我们应用tf.nn.conv1d跨距和填充:- 跨距 :整数s - 填充
:这与2D相似,您可以在SAME和之间进行选择VALIDSAME将输出相同的输入长度,而VALID不会添加零填充。

在我们的示例中,跨度为2,有效填充为空白。

output = tf.nn.conv1d(x, filter, stride=2, padding="VALID")

输出形状应为[batch_size, 4, 16]
使用padding="SAME",我们的输出形状为[batch_size, 5, 16]



 类似资料:
  • 我正在制作这个CNN模型 ''' 但这是给我一个错误:-InvalidArgumentError:负尺寸造成的减去2从1'{{nodeconv2d_115/Conv2D}}=Conv2D[T=DT_FLOAT,data_format="NHWC",膨胀=[1,1,1,1],explicit_paddings=[],填充="VALID",步幅=[1,2,2,1],use_cudnn_on_gpu=t

  • 我试图在张量流图中使用条件随机场损失。 我正在执行序列标记任务: 我有一系列元素作为输入。每个元素可以属于三个不同类中的一个。类以一种热编码方式表示:属于类0的元素由向量[表示。 我的输入标签(y)有大小(xx)。 我的网络产生相同形状的日志。 假设我所有的序列都有长度4。 这是我的代码: 我得到以下错误: 文件“/usr/local/lib/python2.7/dist-packages/ten

  • 我正在实现一个依赖于3D卷积的模型(对于类似于动作识别的任务),我想使用批量规范化(参见 下面的代码引用了TensorFlow r0.12,它显式地引用了变量——我的意思是我没有使用tf。承包商。学习tf以外的内容。承包商。图层。batch\u norm()函数。我这样做是为了更好地理解事情是如何运作的,并且有更多的实现自由度(例如,变量摘要)。 我将通过首先编写完全连接层的示例,然后编写2D卷积

  • 目前正在尝试学习卷积网络的Tensorflow MNIST教程,我可以使用一些帮助来理解该死的张量的维度。 所以我们有28x28像素的图像。 卷积将为每个5x5补丁计算32个特征。 让我们暂时接受这一点,并在以后问自己为什么是32个功能和为什么是5x5补丁。 其重量张量的形状为5、5、1、32。前两个维度是面片大小,下一个维度是输入通道数,最后一个维度是输出通道数。 W_conv1weight_v

  • 真的很难理解keras中卷积1d层的输入维度: 输入形状 带形状的三维张量:(采样、步长、input\u dim)。 输出形状 带形状的三维张量:(采样、新的\u步骤、nb\u过滤器)。由于填充,步骤值可能已更改。 我希望我的网络接受价格的时间序列(101,按顺序)并输出4个概率。我当前的非卷积网络做得相当好(训练集为28000)如下所示: 为了改进这一点,我想从具有长度为10的局部感受野的输入层

  • 问题内容: 我安装了最新版本的Python和最新版本的。然后我在PyCharm中安装了一些模块(Numpy,Pandas等),但是当我尝试安装Tensorflow时却没有安装,并且出现了错误消息: 找不到满足TensorFlow要求的版本(来自版本:)找不到与TensorFlow匹配的发行版。 然后我尝试从命令提示符安装TensorFlow,并得到了相同的错误消息。但是,我确实成功安装了tflea

  • 问题内容: 现在,我想要一个形状为(2,3)的数组,其中 实现这一目标的正确方法是什么?一种麻木的方式推广到更大的数组(也许甚至更高的维度)。 请注意区别,以这样的问题这样,在索引的数组包含元组。这不是我要的。 编辑 这个问题的更一般的表述是: data.shape ==(s0,s1,..,sn) indexs.shape ==(s0,s1,…,sn-1,K) 因此,它们具有所有维度,但最后一个相

  • 本文向大家介绍tensorflow多维张量计算实例,包括了tensorflow多维张量计算实例的使用技巧和注意事项,需要的朋友参考一下 两个三维矩阵的乘法怎样计算呢?我通过实验发现,tensorflow把前面的维度当成是batch,对最后两维进行普通的矩阵乘法。也就是说,最后两维之前的维度,都需要相同。 首先计算shape为(2, 2, 3)乘以shape为(2, 3, 2)的张量。 运行结果: