toco_from_protos: команда не найдена

Я использую эту следующую ссылку, чтобы преобразовать мою модель Tensorflow в модель tf lite https://www.tensorflow.org/lite/convert/python_api, здесь я следую инструкциям по экспорту GraphDef из файла, но я получаю следующую ошибку

    "TOCO failed. See console for info.\n%s\n%s\n" % (stdout, stderr))
     tensorflow.lite.python.convert.ConverterError: TOCO failed. See console for info.
    /bin/sh: toco_from_protos: command not found

Я установил последнюю версию tenorflow v1.13.1


person chin87    schedule 02.04.2019    source источник
comment
ты решил проблему?   -  person lelloman    schedule 09.06.2019
comment
Нет, не совсем, проблема в настройке пути, он не может найти путь на моей машине, пытался установить путь, но не работал, преобразовал его с другой машины   -  person chin87    schedule 11.06.2019
comment
Не могли бы вы дать мне подсказку, как конвертировать? Эта проблема сводит меня с ума :(   -  person lelloman    schedule 11.06.2019
comment
@lelloman сконвертирован на машине одного из моих коллег, каким-то образом его тензорный поток был в рабочем состоянии, вы можете использовать другую машину или найти кого-то, кто не обновил старую версию   -  person chin87    schedule 12.06.2019
comment
Спасибо, в конце концов я решил, используя образ докера, теперь, когда я попробовал, я не думаю, что когда-нибудь снова установлю тензорный поток в системе   -  person lelloman    schedule 12.06.2019


Ответы (2)


Проблема

Tensorflow обращается к конкретному двоичному файлу для преобразования файла .pb (хранящегося в protobuf) в модель tflite. Двоичный файл - это «toco_from_protos», и сообщение об ошибке предполагает, что интерпретатор оболочки (в данном случае «/ bin / sh») не может найти двоичный файл («toco_from_proto»).

Вам необходимо указать путь к файлу toco_from_proto в переменной среды PATH.

Как это сделать

Сначала проверьте, существует ли файл. Вы можете использовать команду "найти", например:

$ locate toco_from_proto
/home/user/anaconda3/envs/tensorflow/bin/toco_from_protos
/home/user/anaconda3/envs/tensorflow/lib/python3.6/site-packages/tensorflow/lite/toco/python/toco_from_protos.py
/home/user/anaconda3/envs/tensorflow/lib/python3.6/site-packages/tensorflow/lite/toco/python/__pycache__/toco_from_protos.cpython-36.pyc

В моем случае я использую Anaconda для управления средами. Таким образом, двоичный файл находится в двоичном пути (папке bin) контейнера среды (в данном случае tenorflow).

Чтобы обеспечить правильное выполнение двоичного файла, включите путь к файлу toco_from_protos внутри переменной среды PATH. Если вы используете систему на базе Linux, вы можете сделать что-то вроде:

$ export PATH=$PATH:/home/user/anaconda3/envs/tensorflow/bin

Если вы используете программу IDE (например, Pycharm), вы можете вызвать сценарий запуска IDE, используя ту же консоль, которую вы использовали для экспорта переменной PATH. Например:

$ export PATH=$PATH:/home/user/anaconda3/envs/tensorflow/bin
$ /opt/pycharm-community-2018.1.4/bin/pycharm.sh

Новое изменение значения PATH остается только в этом окне консоли, поэтому, если вы хотите сделать изменение постоянным, включите предложение экспорта в файл '~ / .bashrc'.

person goe    schedule 01.08.2019
comment
привет, кажется, что даже после добавления bin virtualenv в переменную $ PATH Tensorflow (2.0) не может найти toco_from_protos, знаете ли вы, что происходит? - person Igor Hoogerwoord; 29.11.2019
comment
Я не тестировал Tensorflow 2.0, поэтому не уверен, как он работает с путями, извините. Убедитесь, что компиляция двоичного файла toco_from_protos, на который вы указываете, совместима с используемой вами библиотекой Tensorflow. - person goe; 11.12.2019

У меня была такая же проблема, и я решил использовать официальный образ докера, на хост-машине установлена ​​свежая версия Ubuntu 18.04.

docker run --runtime=nvidia -v /path/to/my/project:/mapped/docker/path -it tensorflow/tensorflow:latest-gpu bash

Затем запустите скрипт преобразования внутри докера:

model = load_model() # keras model
output_names = [node.op.name for node in model.outputs]
input_names = [node.op.name for node in model.inputs]
with tf.keras.backend.get_session() as sess:
    sess.run(tf.global_variables_initializer())
    frozen_def = tf.graph_util.convert_variables_to_constants(sess, sess.graph_def, output_names)
    converter = tf.lite.TFLiteConverter.from_session(sess, model.inputs, model.outputs)
    tflite_model = converter.convert()
    open("converted_model.tflite", "wb").write(tflite_model)

На момент написания tensorflow/tensorflow:latest-gpu это версия 1.13.1

person lelloman    schedule 12.06.2019