2017-09-14 3 views
0

J'essaie d'utiliser Mxnet-js library pour visualiser mon modèle Mxnet dans un navigateur. Je suis le fichier readme Mxnet-js git.Mxnet -js- Ecriture d'octets en chaîne

Ils ont fourni un script python. ./tool/model2json, pour convertir le modèle en fichier json. Quand je courais ce script avec mon modèle je reçois l'erreur:

TypeError: write() argument must be str, not bytes 

Obtenir ce sens faire d'erreur, car, comment puis-je écrire octet à un fichier qui est ouvert en mode chaîne. À la ligne

modèle = base64.b64encode (octets (open (sys.argv [3], 'rb'). Lecture()))

qu'ils lisent en octets mais en ligne

avec

ouverte (sys.argv 1, 'w') sous la forme fo:

ils sont l'ouverture du fichier en mode de chaîne et dans la ligne

fo.write (modèle)

ils écrivent des octets en chaîne.

Ai-je raté quelque chose ici? Pourquoi ils essaient d'écrireoctets à chaîne?

#!/usr/bin/env python 
"""Simple util to convert mxnet model to json format.""" 
import sys 
import json 
import base64 

if len(sys.argv) < 4: 
    print('Usage: <output.json> <symbol.json> <model.param> 
           [mean_image.nd] [synset]') 
    exit(0) 

symbol_json = open(sys.argv[2]).read() 
model = base64.b64encode(bytes(open(sys.argv[3], 'rb').read())) 
mean_image = None 
synset = None 

if len(sys.argv) > 4: 
    mean_image = base64.b64encode(bytes(open(sys.argv[4], 
             'rb').read())) 

if len(sys.argv) > 5: 
    synset = [l.strip() for l in open(sys.argv[5]).readlines()] 

with open(sys.argv[1], 'w') as fo: 

    fo.write('{\n\"symbol\":\n') 
    fo.write(symbol_json) 
    if synset: 
     fo.write(',\n\"synset\": ') 
     fo.write(json.dumps(synset)) 
    fo.write(',\n\"parambase64\": \"') 

    fo.write(model) 
    fo.write('\"\n') 
    if mean_image is not None: 
     fo.write(',\n\"meanimgbase64\": \"') 
     fo.write(mean_image) 
     fo.write('\"\n') 
fo.write('}\n') 

Répondre

1

TL; DR Utilisez-vous Python3? Si oui, utilisez Python2 et les choses devraient marcher!

Plus de détails: Le code ouvre le fichier de poids binaire du modèle, lit les données binaires, construit une séquence d'octets (type Python intégré) et le convertit en chaîne.

Maintenant, alors que Python 2 convertit implicitement Bytes en String, Python 3 ne le fait pas. Je suppose que vous utilisez Python 3, et votre conversion est incorrecte.

Pour vérifier votre course version python --version Si vous êtes en effet avec Python 3, vous pouvez essayer de la ligne de mise à jour 12 de model2json.py avoir une conversion explicite: model = str(base64.b64encode(bytes(open(sys.argv[3], 'rb').read()))) Notez que pour Python 3, vous devrez également lancer la Le serveur web local utilise une commande différente de celle indiquée sur le fichier readme.md: $ python3 -m http.server

Ma recommandation est que vous utilisiez Python 2 puisque tout ce repo est écrit pour cela, et en utilisant Python3 vous pourriez rencontrer d'autres problèmes.