Попытка использовать собственный набор данных на базовом примере Lasagne (слегка измененный) для создания нейронной сети для распознавания лиц
Я делаю основной пример лазаньи: https://github.com/Lasagne/Lasagne/blob/master/examples/mnist.py
который я немного изменил, объединив его с другим похожим примером.
Я пытаюсь запустить модель CNN, где я добавил дополнительный вклад в определение CNN, но он не должен отличаться. Также изменено значение по умолчанию 28 для входного слоя в примере на 60 (для высоты и ширины), классы используются позже в коде, но код "зависает" в этой последней строке сети, что означает, что код все еще работает, но ничего не происходит. Вывод при запуске кода. Input_var определяется как таковой в mainloop:
input_var = T.tensor4('input_var')
остальная часть кода:
def build_cnn(classes, height, width, input_var=None):
print("Input layer, with height: {}, width: {} and input var: {}".format(height, width, input_var))
network = lasagne.layers.InputLayer(shape = (None, 1, height, width),
input_var=input_var)
print("Convolutional layer with 32 kernels of size 5x5")
network = lasagne.layers.Conv2DLayer(network,
num_filters = 32,
filter_size = (5, 5),
nonlinearity = lasagne.nonlinearities.rectify,
W = lasagne.init.HeNormal(gain = 'relu'))
РЕДАКТИРОВАТЬ: Хорошо, основываясь на том, что я пробовал до сих пор, кажется, что это мой собственный набор данных, который является проблемой. Я изменил свой набор данных, чтобы он соответствовал набору данных MNIST, где ex. X_train имеет форму [изображения, канал, высота, ширина]. Где канал = 1 и высота, ширина = 60. Код для их получения:
def load_images():
dataset_path = os.path.abspath("C:/Users/laende/Dropbox/Skole UiS/4. semester/Master/Master/data/test_database")
[bilder, label, names] = read_images1(dataset_path, (28, 28))
label = np.array(label)
bilder = bilder / np.float32(256)
bilder = bilder[:, newaxis, :, :]
X_train1, X_test1, Y_train1, Y_test1 = train_test_split(bilder, label, test_size = 0.2)
list_of_labels = list(xrange(max(label) + 1))
classes = len(list_of_labels)
return X_train1, X_test1, Y_train1, Y_test1, classes
где read_images1:
def read_images1(path, sz = None, channel = None):
c = 0
X = []
y = []
folder_names = []
for dirname, dirnames, filenames, in os.walk(path):
for subdirname in dirnames:
subject_path = os.path.join(dirname, subdirname)
folder_names.append(subdirname)
for filename in os.listdir(subject_path):
try:
im = cv2.imread(os.path.join(subject_path, filename), cv2.IMREAD_GRAYSCALE)
if (sz is not None):
im = cv2.resize(im, sz)
X.append(np.asarray(im, dtype = np.uint8))
y.append(c)
except IOError, (errno, strerror):
print "I/O error ({0]): {1}".format(errno, strerror)
except:
print "unexpected error:", sys.exc_info()[0]
raise
c = c + 1
return [X, y, folder_names]
Код в главном, который запускается:
def main(model='mlp', num_epochs=100):
# Load the dataset
print("Loading data...")
mnist = 1
if mnist == 1:
classes = 10
X_train, y_train, X_val, y_val, X_test, y_test = load_dataset()
dataset = {
'train': {'X': X_train, 'y': y_train},
'test': {'X': X_test, 'y': y_test}}
shape = dataset['train']['X'][0].shape
else:
X_train, X_test, y_train, y_test, classes = load_images()
dataset = {
'train': {'X': X_train, 'y': y_train},
'test': {'X': X_test, 'y': y_test}}
shape = dataset['train']['X'][0].shape
input_var = T.tensor4('inputs')
target_var = T.ivector('targets')
print("Building model and compiling functions...")
if model == 'mlp':
network = build_mlp(height=int(shape[1]),
width=int(shape[2]),
channel=int(shape[0]),
classes=int(classes),
input_var=input_var)
если mnist = 1 (в основном), код работает нормально, если я пытаюсь использовать свой собственный набор данных, он застревает в build_mlp (аналогично исходной проблеме с cnn):
def build_mlp(classes, channel, height, width, input_var=None):
neurons = int(height * width)
network = lasagne.layers.InputLayer(shape = (None, channel, height, width),
input_var=input_var)
network = lasagne.layers.DropoutLayer(network, p = 0.2)
#Code gets stuck on this point, running forever, doing nothing.
#No error messages received either.
network = lasagne.layers.DenseLayer(
network,
num_units = neurons,
nonlinearity = lasagne.nonlinearities.rectify,
W = lasagne.init.GlorotUniform())
РЕДАКТИРОВАТЬ 2: После того, как я некоторое время боролся с этим, я обнаружил, что изменение размера изображения, выполненное в read_images1(), вызвало проблему:
def read_images1(path, sz = None, channel = None):
c = 0
X = []
y = []
folder_names = []
for dirname, dirnames, filenames, in os.walk(path):
for subdirname in dirnames:
subject_path = os.path.join(dirname, subdirname)
folder_names.append(subdirname)
for filename in os.listdir(subject_path):
try:
im = cv2.imread(os.path.join(subject_path, filename), cv2.IMREAD_GRAYSCALE)
#This part caused the problems.
if (sz is not None):
im = cv2.resize(im, sz)
X.append(np.asarray(im, dtype = np.uint8))
y.append(c)
except IOError, (errno, strerror):
print "I/O error ({0]): {1}".format(errno, strerror)
except:
print "unexpected error:", sys.exc_info()[0]
raise
c = c + 1
return [X, y, folder_names]
Если я не пропустил изменение размера и использовал размеры изображений по умолчанию, которые были в папках, нейронная сеть могла компилироваться. У кого-нибудь есть идеи почему? Я обновил read_images1() для этого:
def read_images1(path, sz = None, na = False):
"""
:param path: sti til mappe med underliggende mapper tilhørende personer.
:param sz: Størrelse på bildefilene
:return: returnerer liste av bilder, labels og navn
"""
c = 0
X = []
y = []
folder_names = []
for dirname, dirnames, filenames, in os.walk(path):
for subdirname in dirnames:
subject_path = os.path.join(dirname, subdirname)
folder_names.append(subdirname)
for filename in os.listdir(subject_path):
try:
im = cv2.imread(os.path.join(subject_path, filename), cv2.IMREAD_GRAYSCALE)
if (sz is not None):
im = cv2.resize(im, dsize=sz, interpolation = cv2.INTER_LANCZOS4)
if (na == True):
im = im[newaxis, :, :]
X.append(np.asarray(im, dtype = np.uint8))
y.append(c)
except IOError, (errno, strerror):
print "I/O error ({0]): {1}".format(errno, strerror)
except:
print "unexpected error:", sys.exc_info()[0]
raise
c = c + 1
return [X, y, folder_names]
Если я запускаю программу с sz = None и na = True, то это работает. Если для параметра sz задан какой-либо размер, код застревает, пытаясь снова скомпилировать нейронную сеть.
1 ответ
Хорошо, я думаю, что я вижу несколько проблем здесь, не знаю, с какой вы сталкиваетесь...
В
read_images1()
, X - это список питонов для массивов. Где он конвертируется в один массив numpy? Попробуйте добавитьX = numpy.asarray(X)
, Вам также нужно изменить его на (n_images, n_channels, width, height), где я предполагаю, что n_channels=1 для градаций серого. Сеть ожидает 4D вход, а не 3D.Этот код
list_of_labels = list(xrange(max(label) + 1)); classes = len(list_of_labels)
предполагает, что метки являются последовательными числами от 0 до N. Являются ли они?Ваш
build_mlp(classes, height, width, input_var=None)
довольно сильно отличается от исходного примераbuild_mlp(input_var=None)
, Исходный пример явно работает, поэтому все, что не так, связано с различиями. Одно из больших отличий заключается в том, что вы продолжаете присваивать одну и ту же переменную, как этоnetwork = lasagne.layers.DenseLayer(network, ...)
где оригинал имеет разные переменные для каждого слояl_hid1 = lasagne.layers.DenseLayer(l_in_drop, ...)
Кроме того, если он зависает во время
build_mlp()
тогда ясно, что проблема не в том, как вы читаете изображения. Попробуйте использовать оригинальную версиюbuild_mlp()
с вашими изображениями. Попробуйте запустить его самостоятельно. Пропустить чтение изображения, просто позвонитеbuild_mlp()
с постоянными параметрами.