尝试在 Lasagne 基本示例(稍作修改)上使用自己的数据集来制作用于人脸识别的神经网络
Trying to use own dataset on Lasagne basic example (slightly modified) to make neural network for face recognition
我正在做基本的烤宽面条示例:
https://github.com/Lasagne/Lasagne/blob/master/examples/mnist.py
我通过将其与另一个类似的示例相结合对其进行了轻微修改。
我正在尝试 运行 CNN 模型,我在其中向 CNN def 添加了一些额外的输入,但它应该没有任何不同。还将示例中输入层的默认值 28 更改为 60(对于高度和宽度),稍后在代码中使用 类,但最后一个网络中的代码 "hangs"行,这意味着代码仍然是 运行ning,但什么也没有发生。
Output when running the code. input_var 在主循环中这样定义:
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 数据集,例如。 X_train 的形状为 [images, channel, height, width]。其中 channel = 1 和 height, width = 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]
main 中的代码是 运行:
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 参数指定了任何大小,代码将在尝试再次编译神经网络时卡住。
好的,我想我可以在这里看到一些问题,但不确定您 运行 喜欢哪一个...
在read_images1()
中,X是numpy数组的python列表。它在哪里转换为单个 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()
我正在做基本的烤宽面条示例: https://github.com/Lasagne/Lasagne/blob/master/examples/mnist.py
我通过将其与另一个类似的示例相结合对其进行了轻微修改。
我正在尝试 运行 CNN 模型,我在其中向 CNN def 添加了一些额外的输入,但它应该没有任何不同。还将示例中输入层的默认值 28 更改为 60(对于高度和宽度),稍后在代码中使用 类,但最后一个网络中的代码 "hangs"行,这意味着代码仍然是 运行ning,但什么也没有发生。 Output when running the code. input_var 在主循环中这样定义:
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 数据集,例如。 X_train 的形状为 [images, channel, height, width]。其中 channel = 1 和 height, width = 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]
main 中的代码是 运行:
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 参数指定了任何大小,代码将在尝试再次编译神经网络时卡住。
好的,我想我可以在这里看到一些问题,但不确定您 运行 喜欢哪一个...
在
read_images1()
中,X是numpy数组的python列表。它在哪里转换为单个 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()