我正在进行Lasagne的基础示例:https://github.com/Lasagne/Lasagne/blob/master/examples/mnist.py
我对其稍作修改,将其与另一个类似的示例结合。
我试图运行CNN模型,我在CNN定义中添加了一些额外的输入,但这应该不会有任何不同。我还将示例中输入层默认值28改为60(用于高度和宽度),类别会在代码后面使用,但代码在最后一个网络行“挂起”,这意味着代码仍在运行,但没有任何事情发生。运行代码时的输出。 在主循环中,input_var定义如下:
input_var = T.tensor4('input_var')
其余代码如下:
def build_cnn(classes, height, width, input_var=None): print("输入层,高度:{},宽度:{},输入变量:{}".format(height, width, input_var)) network = lasagne.layers.InputLayer(shape = (None, 1, height, width), input_var=input_var) print("卷积层,32个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的形状为[图像数,通道数,高度,宽度]。其中通道数为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错误({0]): {1}".format(errno, strerror) except: print "意外错误:", sys.exc_info()[0] raise c = c + 1 return [X, y, folder_names]
在主函数中运行的代码如下:
def main(model='mlp', num_epochs=100): # 加载数据集 print("正在加载数据...") 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("构建模型并编译函数...") 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) #代码在此点卡住,永远运行,不做任何事情。 #也没有收到任何错误消息。 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) #这一部分引起了问题。 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错误({0]): {1}".format(errno, strerror) except: print "意外错误:", 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: 到包含人员子文件夹的文件夹的路径。 :param sz: 图像文件的大小 :return: 返回图像列表、标签和名称 """ 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错误({0]): {1}".format(errno, strerror) except: print "意外错误:", sys.exc_info()[0] raise c = c + 1 return [X, y, folder_names]
如果我运行程序时设置sz = None且na = True,那么它就能工作。如果给sz参数传递任何大小,代码在尝试编译神经网络时再次卡住。
回答: