Ich habe auf einige Websites verwiesen, um Chainer zu verwenden.
Bildklassifizierung mit Chainer, einem Deep-Learning-Framework von PFN (Neural Net 1 mit Chainer)
Mit der NIN von Chainer können Sie Ihren Bildsatz gründlich lernen und erkennen
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.