【问题标题】:Normalization of a tensor array张量数组的归一化
【发布时间】:2018-02-18 02:19:11
【问题描述】:

专家。我是 DNN 和 Python 的新手。我正在尝试使用 tensorflow 来做一些 DNN 学习工作。在工作中,我遇到了一个我自己无法解决的问题。在一个步骤中,我想标准化一个称为“输入”的张量。归一化只是取向量的最大绝对值,并将向量的所有元素除以最大绝对值。但是出现了以下问题:

ValueError Traceback(最近一次调用最后一次) in ()

 55             tmp_index = tf.argmax(tmp_abs,0)
 56             tmp_index1 = tf.cast(tmp_index,dtype = tf.int32)
---> 57             inputs = inputs/tmp_abs[tmp_index1]
 58 
 59         if index != len(Layers)-1:

InvalidArgumentError:形状必须为 1 级,但对于 'hidden2_3/strided_slice'(操作:'StridedSlice')为 2 级,输入形状为:[?,1]、[1,1]、[1,1]、[ 1]。

任何建议将不胜感激。谢谢!

# input features and labels
x_ = tf.placeholder(name="input", shape=[None, 1], dtype=np.float32)
y_ = tf.placeholder(name="output", shape=[None, 1], dtype=np.float32)

# tf variables
Hidden = []

# Hidden Layers
for index, num_hidden in enumerate(Layers):
    with tf.name_scope("hidden{}".format(index+1)):
        if index == 0:
            weights = tf.Variable(tf.truncated_normal([Fea_Size,num_hidden], stddev = get_stddev(Fea_Size,num_hidden)))
            bias = tf.Variable(tf.zeros([num_hidden]))
        else:
            weights = tf.Variable(tf.truncated_normal([Layers[index-1], num_hidden], stddev = get_stddev(Layers[index-1], num_hidden)))
            bias = tf.Variable(tf.zeros([num_hidden]))

        inputs = x_ if index == 0 else Hidden[index-1]
        if index !=0:
            tmp_abs = tf.abs(inputs)
            tmp_index = tf.argmax(tmp_abs,0)
            tmp_index1 = tf.cast(tmp_index,dtype = tf.int32)
            inputs = inputs/tmp_abs[tmp_index1]

        if index != len(Layers)-1:
            Hidden.append(tf.nn.relu(tf.matmul(inputs,weights) + bias))
        else:
            nonlin_model = tf.nn.relu(tf.matmul(inputs,weights) + bias)

nonlin_loss = tf.reduce_mean(tf.pow(nonlin_model - y_, 2), name='cost')
train_step_nonlin = tf.train.GradientDescentOptimizer(0.01).minimize(nonlin_loss)

【问题讨论】:

    标签: python tensorflow


    【解决方案1】:

    问题在于您的 inputs 对于 axis 0 具有不变的形状。

    您可以改为使用:

    inputs = inputs/tf.reduce_max(tf.abs(inputs))
    

    tf.abs 返回inputs 的绝对值。 tf.reduce_max 返回最大值。

    这是一个对我有用的代码 sn-p:

    inputs = tf.placeholder(shape=[None, 1], dtype = tf.float32)
    inputs_normal = inputs/tf.reduce_max(tf.abs(inputs))
    
    all_pos = sess.run(inputs_normal, feed_dict={inputs:[[1],[2],[3]]})
    all_neg = sess.run(inputs_normal, feed_dict={inputs:[[-1],[-2],[-3]]})
    pos_neg = sess.run(inputs_normal, feed_dict={inputs:[[1],[2],[-3]]})
    

    以下是值:

    all_pos = array([[0.33333334],
                     [0.6666667 ],
                     [1.        ]], dtype=float32)
    
    all_neg = array([[-0.33333334],
                     [-0.6666667 ],
                     [-1.        ]], dtype=float32)
    
    pos_neg = array([[ 0.33333334],
                          [ 0.6666667 ],
                          [-1.        ]], dtype=float32)
    

    我已经为 2-D 张量展示了它,但它也应该适用于更高维度的张量。

    【讨论】:

    • 谢谢!这完美地解决了我的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-27
    • 2017-08-10
    • 2021-10-17
    • 1970-01-01
    • 1970-01-01
    • 2019-11-08
    • 2018-04-02
    相关资源
    最近更新 更多