我用Keras框架创建了一个模型。我能够将模型部署到iOS设备上并成功地进行推理。然而,在我更新Keras(1.1.0)和Tensorflow(0.11.0)并重新训练我的模型之后,当我试图在设备上运行新模型时,我收到了以下错误。
Running model failed: Invalid argument: No OpKernel was registered to support Op 'Less' with these attrs
[[Node: while/Less = Less[T=DT_INT32](while/Merge, while/Less/Enter)]]
下面是我如何定义模型的
inputs = Input(shape=(look_back, feature_count))
encoded = LSTM(50, return_sequences=True)(inputs)
encoded = LSTM(25, return_sequences=True)(encoded)
encoded = LSTM(10)(encoded)
decoded = RepeatVector(look_back)(encoded)
decoded = LSTM(feature_count, return_sequences=True)(decoded)
sequence_autoencoder = Model(input=inputs, output=decoded)
sequence_autoencoder.compile(optimizer='RMSprop', loss='mse')
sequence_autoencoder.fit(X_train, X_train,
nb_epoch = epochs,
batch_size = 32,
verbose=1)
如何删除'Less' op?
这是由移动TensorFlow中的op注册错误引起的。详细信息:https://github.com/tensorflow/tensorflow/issues/4863
在移动平台上,包括Less
和Add
在内的一些运营商基本上应该注册DT_FLOAT32
和DT_INT32
,但由于漏洞,他们实际上只注册了DT_FLOAT32
。
我不确定这个bug是什么时候引入的。也许它是在您使用的最后一个工作版本之后引入的。也有可能旧版本的Keras使用浮点数Less
op.
无论如何,根本原因已经找到了。希望下个版本能尽快解决。在优雅的修复之前,您可以尝试在问题中发布的一些解决方案。你必须重新编译TensorFlow库,并进行一些代码更改,就像他们在Mul
中所做的那样:
#if defined(__ANDROID_TYPES_SLIM__)
// We only register the first type when we have multi-argument calls in the
// case where we're trying to reduce executable size, but it turns out that the
// int32 version of this op is needed, so explicitly include it.
REGISTER(BinaryOp, CPU, "Mul", functor::mul, int32);
#endif // __ANDROID_TYPES_SLIM__