I referred to some sites to use Chainer.
-Chainer's NIN allows you to deep-learn and recognize your own image set
However, when I ran train_imagenet.py to learn my own image, the following error occurred.
error
cPickle.UnpicklingError: invalid load key,
The relevant part is the non-Pickle processing by the function called pickle.load in the code below.
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'))
The value of the argument args.mean is a file called mean.npy, so if you look for the source of this file ...
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)
It seems that the object created by the numpy.ndarray function is output to a file called mean.npy by the pickle.dump function. In other words, the entity of mean.npy is like a byte stream of a NumPy array.
So, instead of reading mean.npy as non-Pickle in train_imagenet.py, I modified it to read it as a NumPy array.
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 when read as non-Pickle.UnpicklingError
mean_image = np.load(args.mean) #Read as a NumPy array
Then I managed to read it.