Op 类型未在 DESKTOP 上以二进制 运行 注册 'cond_true_5'
Op type not registered 'cond_true_5' in binary running on DESKTOP
我在 tf2.6 版本中通过禁用 eager execution 保存了模型。下面是用于保存和 运行
的片段
import tensorflow as tf
tf.compat.v1.disable_eager_execution()
x = tf.keras.Input(shape=(224, 224, 3), batch_size=None)
x1=tf.keras.Input(1, dtype=tf.int32)
print(type(x1), type(x)) #<class 'tensorflow.python.framework.ops.Tensor'> <class 'tensorflow.python.framework.ops.Tensor'>
y = tf.cond(tf.less(x1,5), lambda :tf.keras.layers.ReLU()(x), lambda :tf.keras.layers.LeakyReLU(alpha=0.1)(x))
model=tf.keras.models.Model(inputs=[x,x1], outputs=[y])
model.save("cond.h5")
model.summary()
运行
import tensorflow as tf
import numpy as np
from tensorflow.keras.models import load_model
tf.compat.v1.disable_eager_execution()
model=load_model('cond.h5')
x = np.ones((1, 224,224,3), dtype=np.float32)
x1 = np.zeros((1, 1), dtype=np.int32)
z=model.predict([x,x1], batch_size=1)
错误:
tensorflow.python.framework.errors_impl.InvalidArgumentError:Op 类型未在 anilm 上以二进制 运行 注册 'cond_true_5'。确保在此过程中 Op 和 Kernel 已注册到二进制 运行 中。请注意,如果您正在加载使用来自 tf.contrib 的操作的已保存图形,则应在导入图形之前访问(例如)tf.contrib.resampler
,因为在首次访问模块时会延迟注册 contrib 操作。在构建 NodeDef 'tf_op_layer_cond/cond/then/_0'
时
我认为 tf.cond
操作引起了问题,因为它不是 Keras
层。您可以尝试将操作包装在 Lambda
层中:
import tensorflow as tf
tf.compat.v1.disable_eager_execution()
x = tf.keras.Input(shape=(224, 224, 3), batch_size=None)
x1 = tf.keras.Input(1, dtype=tf.int32)
y = tf.keras.layers.Lambda(lambda x: tf.cond(tf.less(x[0], 5), lambda: tf.keras.layers.ReLU()(x[1]), lambda: tf.keras.layers.LeakyReLU(alpha=0.1)(x[1])))([x1, x])
model = tf.keras.models.Model(inputs=[x, x1], outputs=[y])
model.save("cond.h5")
model.summary()
不过我还是会推荐自定义层。
我在 tf2.6 版本中通过禁用 eager execution 保存了模型。下面是用于保存和 运行
的片段import tensorflow as tf
tf.compat.v1.disable_eager_execution()
x = tf.keras.Input(shape=(224, 224, 3), batch_size=None)
x1=tf.keras.Input(1, dtype=tf.int32)
print(type(x1), type(x)) #<class 'tensorflow.python.framework.ops.Tensor'> <class 'tensorflow.python.framework.ops.Tensor'>
y = tf.cond(tf.less(x1,5), lambda :tf.keras.layers.ReLU()(x), lambda :tf.keras.layers.LeakyReLU(alpha=0.1)(x))
model=tf.keras.models.Model(inputs=[x,x1], outputs=[y])
model.save("cond.h5")
model.summary()
运行
import tensorflow as tf
import numpy as np
from tensorflow.keras.models import load_model
tf.compat.v1.disable_eager_execution()
model=load_model('cond.h5')
x = np.ones((1, 224,224,3), dtype=np.float32)
x1 = np.zeros((1, 1), dtype=np.int32)
z=model.predict([x,x1], batch_size=1)
错误:
tensorflow.python.framework.errors_impl.InvalidArgumentError:Op 类型未在 anilm 上以二进制 运行 注册 'cond_true_5'。确保在此过程中 Op 和 Kernel 已注册到二进制 运行 中。请注意,如果您正在加载使用来自 tf.contrib 的操作的已保存图形,则应在导入图形之前访问(例如)tf.contrib.resampler
,因为在首次访问模块时会延迟注册 contrib 操作。在构建 NodeDef 'tf_op_layer_cond/cond/then/_0'
我认为 tf.cond
操作引起了问题,因为它不是 Keras
层。您可以尝试将操作包装在 Lambda
层中:
import tensorflow as tf
tf.compat.v1.disable_eager_execution()
x = tf.keras.Input(shape=(224, 224, 3), batch_size=None)
x1 = tf.keras.Input(1, dtype=tf.int32)
y = tf.keras.layers.Lambda(lambda x: tf.cond(tf.less(x[0], 5), lambda: tf.keras.layers.ReLU()(x[1]), lambda: tf.keras.layers.LeakyReLU(alpha=0.1)(x[1])))([x1, x])
model = tf.keras.models.Model(inputs=[x, x1], outputs=[y])
model.save("cond.h5")
model.summary()
不过我还是会推荐自定义层。