[PYTHON] CPickle.UnpicklingError in Chainer

Ich habe auf einige Websites verwiesen, um Chainer zu verwenden.

Als ich jedoch train_imagenet.py ausführte, um mein eigenes Bild zu lernen, trat der folgende Fehler auf.

Error


cPickle.UnpicklingError: invalid load key, 

Der entsprechende Teil ist die Nicht-Pickle-Verarbeitung durch die Funktion pickle.load des Codes von ↓

train_imagenet.py


# Prepare dataset
train_list = load_image_list(args.train, args.root)
val_list = load_image_list(args.val, args.root)
mean_image = pickle.load(open(args.mean, 'rb'))

Der Wert des Arguments args.mean ist eine Datei mit dem Namen mean.npy. Wenn Sie also nach der Quelle dieser Datei suchen ...

compute_mean.py


#!/usr/bin/env python
import argparse
import os
import sys

import numpy
from PIL import Image
import six.moves.cPickle as pickle


parser = argparse.ArgumentParser(description='Compute images mean array')
parser.add_argument('dataset', help='Path to training image-label list file')
parser.add_argument('--root', '-r', default='.',
                    help='Root directory path of image files')
parser.add_argument('--output', '-o', default='mean.npy',
                    help='path to output mean array')
args = parser.parse_args()

sum_image = None
count = 0
for line in open(args.dataset):
    filepath = os.path.join(args.root, line.strip().split()[0])
    image = numpy.asarray(Image.open(filepath)).transpose(2, 0, 1)
    if sum_image is None:
        sum_image = numpy.ndarray(image.shape, dtype=numpy.float32)
        sum_image[:] = image
    else:
        sum_image += image
    count += 1
    sys.stderr.write('\r{}'.format(count))
    sys.stderr.flush()

sys.stderr.write('\n')

mean = sum_image / count
pickle.dump(mean, open(args.output, 'wb'), -1)

Es scheint, dass das von der Funktion numpy.ndarray erstellte Objekt von der Funktion pickle.dump in eine Datei namens mean.npy ausgegeben wird. Mit anderen Worten, die Entität von mean.npy ist wie ein Bytestrom eines NumPy-Arrays.

Anstatt mean.npy in train_imagenet.py als Nicht-Pickle zu lesen, habe ich es so geändert, dass es als NumPy-Array gelesen wird.

train_imagenet.py


# Prepare dataset
train_list = load_image_list(args.train, args.root)
val_list = load_image_list(args.val, args.root)
# mean_image = pickle.load(open(args.mean, 'rb'))← cPickle, wenn es als Nicht-Pickle gelesen wird.UnpicklingError
mean_image = np.load(args.mean) #Als NumPy-Array lesen

Dann habe ich es geschafft, es zu lesen.

Recommended Posts

CPickle.UnpicklingError in Chainer
DQNs Hintergrund + Deep Q-Network in Chainer geschrieben
So erstellen Sie Daten für CNN (Chainer)