2017-06-20 7 views
1

Ich habe einen google-cloud-ml Job, der das Laden von numpy .npz-Dateien von gs bucket erfordert. Ich folgte this example zum Laden von .npy-Dateien von gs, aber es funktionierte nicht für mich, da .npz-Dateien komprimiert sind.Wie lade ich npy-npz-Dateien in google-cloud-ml-Jobs oder aus Google Cloud Storage?

Hier ist mein Code:

from StringIO import StringIO 
import tensorflow as tf 
import numpy as np 
from tensorflow.python.lib.io import file_io 

f = StringIO(file_io.read_file_to_string('gs://my-bucket/data.npz')) 
data = np.load(f) 

Und hier ist die Fehlermeldung:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xa2 in position 10: invalid start byte

Offenbar zu str Codieren der Daten nicht korrekt ist, aber ich bin nicht sicher, wie zu adressieren Dies.

Kann jemand helfen? Vielen Dank!

Antwort

1

Es stellt sich heraus, dass ich das binäre Flag auf True in file_io.read_file_to_string() einstellen müssen.

Hier ist der Arbeitscode:

from io import BytesIO 
import tensorflow as tf 
import numpy as np 
from tensorflow.python.lib.io import file_io 

f = BytesIO(file_io.read_file_to_string('gs://my-bucket/data.npz', binary_mode=True)) 
data = np.load(f) 

Und das funktioniert für sowohl komprimierte als auch nicht komprimierte Dateien .npz.

1

Versuchen Sie es mit io.BytesIO statt, die mit Python den zusätzlichen Bonus wird nach vorne kompatibel hat 3:

import io 
import tensorflow as tf 
import numpy as np 
from tensorflow.python.lib.io import file_io 

f = io.BytesIO(file_io.read_file_to_string('gs://my-bucket/data.npz'), 
       binary_mode=True) 
data = np.load(f) 
+0

es versucht, aber funktioniert immer noch nicht - habe dieselbe Fehlermeldung erhalten. Trotzdem danke! – astromz

+0

Einstellung 'binary_mode = True' in' read_file_to_string' dann funktioniert Ihr Code. Vielen Dank. – astromz

+0

Ich habe gerade den Code bearbeitet, danke. Seltsamerweise lief es bei dem Test, den ich gemacht habe, gut, aber das sieht sowieso besser aus. – rhaertel80

0

Eine Alternative ist (man beachte den Unterschied zwischen den früheren Versionen TF und späteren):

import numpy as np 
from tensorflow.python.lib.io import file_io 
from tensorflow import __version__ as tf_version 

if tf_version >= '1.1.0': 
    mode = 'rb' 
else: # for TF version 1.0 
    mode = 'r' 

f_stream = file_io.FileIO('mydata.npz', mode) 
d = np.load(BytesIO(f_stream.read())) 

Auch für Beize Dateien:

import pickle 
d = pickle.load(file_io.FileIO('mydata.pickle', mode)) 
Verwandte Themen