升级到tensorflow 2.9后,我收到以下错误消息 当调用 model.fit() 时 tf 2.8 没有错误。 拟合一直在运行,但令人担忧。
2022-06-21 12:42:58.930086: W tensorflow/core/common_runtime/forward_type_inference.cc:231] Type inference failed. This indicates an invalid graph that escaped type checking. Error message: INVALID_ARGUMENT: expected compatible input types, but input 1:
type_id: TFT_OPTIONAL
args {
type_id: TFT_PRODUCT
args {
type_id: TFT_TENSOR
args {
type_id: TFT_BOOL
}
}
}
is neither a subtype nor a supertype of the combined inputs preceding it:
type_id: TFT_OPTIONAL
args {
type_id: TFT_PRODUCT
args {
type_id: TFT_TENSOR
args {
type_id: TFT_LEGACY_VARIANT
}
}
}
while inferring type of node 'calculate/cond/output/_10'
知道什么可能导致此问题或如何解决它吗?
这应该是评论而不是答案,但我对此没有足够的声誉。我在此处 https://www.tensorflow.org/guide/migrate/evaluator 和此处 https://www.tensorflow.org/guide 的张量流指南的输出类型中出现了相同类型的错误消息/迁移/migrate_feature_columns 。您可以在点击链接后搜索“类型推断失败”,轻松找到出现错误的行。
在撰写本文时,这似乎仍然是一个悬而未决的问题。对于那些将来可能阅读本文的人,请密切关注 TensorFlow 和 Keras 存储库上发布的相关问题。尽管对于像 这样的陈述存在一些一些阻力...只是一个警告,但您可以安全地忽略它。给定执行的代码没有任何错误消息。,目前,一个人可能想按照 Keras 团队的建议忽略此警告:
我认为这应该是可以重现的,而不涉及任何 Keras 逻辑,此时 TF 人员肯定会关注它。但无论如何,正如之前所说,这只是一个警告,并不是什么严重的事情。你可以忽略它。
我已经解决了代码中的类似错误,这就是我的做法。
我认为问题在于在运行 tf graph 时使用
@tf.function
或使用任何带有条件的函数。就我而言,在 model.fit 方法期间。
问题表明无效的图逃脱了类型检查。当在
@tf.function
代码中使用 if-else 语句时,keras API 会将 if-else 条件转换为 tf.cond
(AutoGraph 将 if-statement 转换为 tf.cond().),但是,在 model.fit() 期间,tensorflow 会发出警告使用 elif
时,但如果您想避免该错误,请删除带有正常 if-else 语句的 elif
语句,我认为这可能会解决这个问题。
错误前函数的实现,并用于损失函数,该函数用于
mode.compile
和后来的model.fit
方法
import tensorflow as tf
class RescaleImage():
def __init__(self) -> None:
super().__init__()
@tf.function
def normalize(self, x:tf.Tensor, min_val: float=0.0, max_val: float=1.0)->tf.Tensor:
min_val = tf.cast(min_val,tf.float32)
max_val = tf.cast(max_val, tf.float32)
if tf.reduce_max(x)>1.0 and tf.reduce_min(x)>=0.0:
if min_val==0.0 and max_val==1.0:
x = x/255.0
elif min_val==-1.0 and max_val==1.0:
x = (x - 127.5)/127.5
elif tf.reduce_max(x)<=1.0 and tf.reduce_min(x)>=-1.0 and tf.reduce_min(x)<0.0:
if min_val==0.0 and max_val==1.0:
x = (x+1.0)/2.0
elif min_val==0.0 and max_val==255.0:
x = (x+1.0)*255.0/2.0
elif tf.reduce_max(x)<=1.0 and tf.reduce_min(x)>=0.0:
if min_val==-1.0 and max_val==1.0:
x = (x-0.5)/0.5
elif min_val==0.0 and max_val==255.0:
x = x*255.0
return x
@tf.function
def normalize_individual(self, x:tf.Tensor, min_val: float=0.0, max_val: float=1.0)->tf.Tensor:
min_val = tf.cast(min_val,tf.float32)
max_val = tf.cast(max_val, tf.float32)
if tf.reduce_max(x)>1.0 and tf.reduce_min(x)>=0.0:
factor = (max_val-min_val)/(tf.math.reduce_max(x)-tf.math.reduce_min(x))
x = factor*(x - tf.math.reduce_min(x))+min_val
elif tf.reduce_max(x)<=1.0 and tf.reduce_min(x)>=-1.0 and tf.reduce_min(x)<0.0:
if min_val==0.0 and max_val==1.0:
x = (x+1.0)/2.0
elif min_val==0.0 and max_val==255.0:
x = (x+1.0)*255.0/2.0
elif tf.reduce_max(x)<=1.0 and tf.reduce_min(x)>=0.0:
if min_val==-1.0 and max_val==1.0:
x = (x-0.5)/0.5
elif min_val==0.0 and max_val==255.0:
x = x*255.0
return x
解决错误后的代码(使用正常的if语句):
import tensorflow as tf
class RescaleImage():
def __init__(self) -> None:
super().__init__()
@tf.function
def normalize(self, x:tf.Tensor, min_val: float=0.0, max_val: float=1.0)->tf.Tensor:
min_val = tf.cast(min_val,tf.float32)
max_val = tf.cast(max_val, tf.float32)
if tf.reduce_max(x)>1.0 and tf.reduce_min(x)>=0.0:
if min_val==0.0 and max_val==1.0:
x = x/255.0
if min_val==-1.0 and max_val==1.0:
x = (x - 127.5)/127.5
if tf.reduce_max(x)<=1.0 and tf.reduce_min(x)>=-1.0 and tf.reduce_min(x)<0.0:
if min_val==0.0 and max_val==1.0:
x = (x+1.0)/2.0
if min_val==0.0 and max_val==255.0:
x = (x+1.0)*255.0/2.0
if tf.reduce_max(x)<=1.0 and tf.reduce_min(x)>=0.0:
if min_val==-1.0 and max_val==1.0:
x = (x-0.5)/0.5
if min_val==0.0 and max_val==255.0:
x = x*255.0
return x
@tf.function
def normalize_individual(self, x:tf.Tensor, min_val: float=0.0, max_val: float=1.0)->tf.Tensor:
min_val = tf.cast(min_val,tf.float32)
max_val = tf.cast(max_val, tf.float32)
if tf.reduce_max(x)>1.0 and tf.reduce_min(x)>=0.0:
factor = (max_val-min_val)/(tf.math.reduce_max(x)-tf.math.reduce_min(x))
x = factor*(x - tf.math.reduce_min(x))+min_val
if tf.reduce_max(x)<=1.0 and tf.reduce_min(x)>=-1.0 and tf.reduce_min(x)<0.0:
if min_val==0.0 and max_val==1.0:
x = (x+1.0)/2.0
if min_val==0.0 and max_val==255.0:
x = (x+1.0)*255.0/2.0
if tf.reduce_max(x)<=1.0 and tf.reduce_min(x)>=0.0:
if min_val==-1.0 and max_val==1.0:
x = (x-0.5)/0.5
if min_val==0.0 and max_val==255.0:
x = x*255.0
return x