#tensorflow #keras
#tensorflow #keras
Вопрос:
У меня была модель, созданная с помощью Keras framework. Я смог развернуть модель на устройстве 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’?
Ответ №1:
Это вызвано ошибкой регистрации op в мобильном TensorFlow. Подробности:https://github.com/tensorflow/tensorflow/issues/4863
В принципе, некоторые операторы, включая Less
и Add
, должны быть зарегистрированы для DT_FLOAT32
и DT_INT32
на мобильной платформе, но из-за ошибки они фактически зарегистрированы только для DT_FLOAT32
.
Я не уверен, когда была введена эта ошибка. Возможно, это было введено после последней рабочей версии, которую вы использовали. Также возможно, что старая версия Keras использовала float 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__