Theano/Lasagne/Nolearn 神经网络图像输入

数据挖掘 分类 Python 神经网络 图像分类
2022-02-24 16:32:28

我正在从事图像分类任务,并决定将 Lasagne + Nolearn 用于神经网络原型。MNIST 数字分类等所有​​标准示例都运行良好,但是当我尝试使用自己的图像时会出现问题。

我想使用 3 通道图像,而不是灰度图像。还有我试图从图像中获取数组的代码:

 img = Image.open(item)
 img = ImageOps.fit(img, (256, 256), Image.ANTIALIAS)
 img = np.asarray(img, dtype = 'float64') / 255.
 img = img.transpose(2,0,1).reshape(3, 256, 256)   
 X.append(img)

这是NN的代码及其拟合:

X, y = simple_load("new")

X = np.array(X)
y = np.array(y)


net1 = NeuralNet(
    layers=[  # three layers: one hidden layer
        ('input', layers.InputLayer),
        ('hidden', layers.DenseLayer),
        ('output', layers.DenseLayer),
        ],
    # layer parameters:
    input_shape=(None, 65536),  # 96x96 input pixels per batch
    hidden_num_units=100,  # number of units in hidden layer
    output_nonlinearity=None,  # output layer uses identity function
    output_num_units=len(y),  # 30 target values

    # optimization method:
    update=nesterov_momentum,
    update_learning_rate=0.01,
    update_momentum=0.9,

    regression=True,  # flag to indicate we're dealing with regression problem


       max_epochs=400,  # we want to train this many epochs
        verbose=1,
        )

  net1.fit(X, y)

我收到这样的异常:

Traceback (most recent call last):
  File "las_mnist.py", line 39, in <module>
    net1.fit(X[i], y[i])
  File "/usr/local/lib/python2.7/dist-packages/nolearn/lasagne.py", line 266, in fit
    self.train_loop(X, y)
  File "/usr/local/lib/python2.7/dist-packages/nolearn/lasagne.py", line 273, in train_loop
    X, y, self.eval_size)
  File "/usr/local/lib/python2.7/dist-packages/nolearn/lasagne.py", line 377, in train_test_split
    kf = KFold(y.shape[0], round(1. / eval_size))
IndexError: tuple index out of range

那么,您以哪种格式向您的网络“提供”图像数据? 感谢您的回答或任何提示!

1个回答

只是出于好奇:为什么要使用 3 通道图像?我也在 CV 中工作,据我所见,灰度图像是标准的。尤其是一开始没有着色的 MNIST,使用颜色似乎没有任何好处。

我也相信使用灰度有一个直观的理由 - 通常颜色是一个混淆变量。如果你看一个红色的“1”和蓝色的“1”,你会说“嘿!这两个都是!它们只是不同的颜色”。然而,计算机比你或我笨得多。即使有智能算法,计算机仍然可能会看到一个蓝色的“1”并自言自语,“哦,废话,那是什么?!?为什么是蓝色的吗?我从没见过这样的东西!” 请记住,颜色 (255, 0, 0) 和 (0, 255, 255) 之间的差异有多大,以及图像的差异有多大(尤其是在舒适的 MNIST 操场之外)。

无论如何,我见过的大多数 NoLearn 示例都使用如下数据形状:

X = X.reshape(-1, 1, size, size)

如果您对图像进行灰度化,您可以将其强制转换为这种形状。不幸的是,我不确定您如何将彩色数据塞入 noLearn 并获得您正在寻找的结果。