如何为一维信号(加速度计信号)选择张量的形状?由于张量形状,我不断收到值错误

Posted

技术标签:

【中文标题】如何为一维信号(加速度计信号)选择张量的形状?由于张量形状,我不断收到值错误【英文标题】:How to select shape of tensor for 1-D signal (accelrometer signal) ? I keep getting VlaueError due to tensor shape 【发布时间】:2018-10-21 16:29:08 【问题描述】:

我正在尝试为一维信号建模 CNN,但我无法理解排名错误。

我的程序是这样的:

#Weights
def init_weights(shape):
    init_random_dist = tf.truncated_normal(shape, stddev=0.1)
    return tf.Variable(init_random_dist)


#Bias
def init_bias(shape):
    init_bias = tf.constant(0.1,shape=shape)
    return tf.Variable(init_bias)

def conv1d(x,W):
    #x is input accelration data and W is corresponding weight
    x = tf.cast(x, tf.float32)
    tf.nn.conv1d(x,W,stride=1,padding='VALID')

def convolution_layer(input_x,shape):
    w = init_weights(shape)
    b = init_bias([shape[3]])
    return tf.nn.relu(conv1d(input_x,w)+b)

现在占位符

x = tf.placeholder(tf.float32,shape=[1,1,200,1])

y_true = tf.placeholder(tf.float32,shape=[None,6])

在使用con_layer_1 = convolution_layer(x,shape=[1,20,1,32]) 创建第一层时,我得到了ValueError 的排名,我无法对其进行调试。错误说明是:

ValueError: Shape must be rank 4 but is rank 5 for 'conv1d_20/Conv2D' (op: 'Conv2D') with input shapes: [1,1,1,200,1], [1,1,20,1,32].

【问题讨论】:

【参考方案1】:

nn.conv1d 的输入和权重形状不正确。 nn.conv1d 的输入形状的大小应为:[ batch_size, input_length, input_channels],权重矩阵的大小应为 [filter_size, inputs_channels, output_channels]。因此,您需要将代码更改为:

def convolution_layer(input_x,shape):
   w = init_weights(shape)
   b = init_bias([shape[2]])
   return tf.nn.relu(conv1d(input_x,w)+b)

x = tf.placeholder(tf.float32,shape=[1,200,1])

y_true = tf.placeholder(tf.float32,shape=[None,6])

con_layer_1 = convolution_layer(x,shape=[20,1,32]) 

注意:您应该尝试使用tf.layers API 来处理权重分配和所有操作。

【讨论】:

以上是关于如何为一维信号(加速度计信号)选择张量的形状?由于张量形状,我不断收到值错误的主要内容,如果未能解决你的问题,请参考以下文章

如何为 3 个不同的事件(信号量、pthread 条件和阻塞套接字接收)阻塞单个线程?

如何为 HTML5 视频设置音频延迟(不同步)

Matlab信号处理基础

如何收集未知的第一(批)维度的张量?

Keras多实例分类问题

加速度积分成位移的频域方法