从 TensorFlow GitHub repository 复制 retrain.py 后
然后在 PyCharm
中打开它,在第 794 和 802 行 PyCharm
显示以下警告:
Type 'Variable' doesn't have expected attribute '__sub__'
如果有帮助,这里是截图:
谁能解释一下:
这是什么意思?
如何解决这个问题或抑制警告?
显然 PyCharm 认为 layer_weights
没有属性 "__sub__"
,但这意味着什么以及为什么 __sub__
属性是必要的?函数 variable_summaries()
不引用属性 __sub__
(从第 735 行开始复制/粘贴):
def variable_summaries(var):
"""Attach a lot of summaries to a Tensor (for TensorBoard visualization)."""
with tf.name_scope('summaries'):
mean = tf.reduce_mean(var)
tf.summary.scalar('mean', mean)
with tf.name_scope('stddev'):
stddev = tf.sqrt(tf.reduce_mean(tf.square(var - mean)))
tf.summary.scalar('stddev', stddev)
tf.summary.scalar('max', tf.reduce_max(var))
tf.summary.scalar('min', tf.reduce_min(var))
tf.summary.histogram('histogram', var)
# end of function
有人可以解释为什么属性 __sub__
是必需的吗?
看完this帖子,我的印象是可以添加一条评论来抑制这个警告,可能是这样的:
@type whatGoesHere: ??
@attribute __sub__: comment here?? # is this correct?
@param whatGoesHere: ??
这样的事情可行吗,评论应该是什么?
我不想禁用 PyCharm 的警告,因为我发现它们在很多情况下都很有用。有人可以提供一些关于上述内容的启示,以避免在 PyCharm 中禁用此警告吗?
- 编辑:
谢谢舒的解释。目前,这似乎是在 PyCharm 中处理此问题而不完全禁用该检查的最佳方法:
# this comment is necessary to suppress an unnecessary PyCharm warning
# noinspection PyTypeChecker
variable_summaries(layer_weights)
如果最终有人能告诉我更好的选择,那就太好了。
最佳答案
-
运算符在 variable_summaries
内的 var
上调用:
stddev = tf.sqrt(tf.reduce_mean(tf.square(var - mean)))
通常 Python 会在计算表达式 var - mean
时寻找 var
的 __sub__
方法。但是,tf.Variable
实例包裹在 state_ops.variable_op_v2
中以支持 GPU/CPU 上的 Ops,并且没有 __sub__
方法Python 通常会期望的。
因此,此警告是 TensorFlow 在 Tensorflow 对象上大量自定义标准 Python 运算符的方式所固有的,以便在使用 Tensorflow OP 启用 GPU/CPU 计算时支持我们习惯的表达式。
我想说你可以安全地忽略任何 Tensorflow 对象上的这个警告。不幸的是,我不知道如何在 PyCharm 中抑制此警告。
关于python - PyCharm TensorFlow 警告 - 类型 'Variable' 没有预期的属性 '__sub__',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48824351/