首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ValueError:形状必须为0级,但对于“cond_11/开关”是1级(op:'Switch')

ValueError:形状必须为0级,但对于“cond_11/开关”是1级(op:'Switch')
EN

Stack Overflow用户
提问于 2017-12-10 14:13:42
回答 1查看 13.8K关注 0票数 7

实际上,我们不能在if语句中使用tf.var作为bool,而不能使用tf.cond。我为标准化输入数据编写了这段代码,并得到了令人困惑的错误,在哪里做错了?

代码语言:javascript
复制
   def global_contrast_normalize(X, scale=1., subtract_mean=True,use_std=False,
       sqrt_bias=0., min_divisor=1e-8):
       mean=tf.reduce_mean(X,axis=1)
       if subtract_mean:
         X = X - mean[:, numpy.newaxis]  # Makes a copy.
      else:
         X = tf.copy.copy(X)
      if X.get_shape()[1]==1:
        #ddof = 0
        mean, var = tf.nn.moments(X, axes=[1])

        normalizers = tf.sqrt(sqrt_bias + var) / scale

      else:
        normalizers = tf.sqrt(sqrt_bias + tf.reduce_sum((X ** 2),axis=1)) / scale
        Normalizers= tf.Variable(normalizers,'float32')
        M=tf.Variable(min_divisor,'float32')

      tf.cond( tf.less_equal(Normalizers,M),lambda:tf.assign(Normalizers,  [1]),lambda:tf.assign(Normalizers,normalizers))
      X /= Normalizers[:, tf.newaxis]  # Does not make a copy.
      return X

错误:

在_call_cpp_shape_fn_impl raise (err.message)中 ValueError: Shape必须是0级,但对于输入形状为1、1的“cond_11/Switch”(op:‘Switch“),则为1级。

EN

回答 1

Stack Overflow用户

发布于 2017-12-11 22:01:10

错误是指出预期输入是标量(秩0),但形状为(1,1)。通常,您可以通过将输入重塑为标量值(使用tf.reshape(Normalizers, []))来解决这一问题。

在这种情况下,您似乎希望有条件地设置规范化器的值,具体取决于它们是否是<= M。tf.where正是这样做的。

(注意,您不必将规范化器或min_divisor转换为tf.Variable)

Tf.where的示例用法:

代码语言:javascript
复制
def global_contrast_normalize(...):
  ...   
  comparison = tf.less_equal(normalizers,M)
  normalizers = tf.where(comparison, tf.ones_like(normalizers), normalizers
  X /= normalizers[:, tf.newaxis]
  return X
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47739707

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档