使用ScikitLearn的神经网络实现时出现问题

时间:2013-12-30 23:24:43

标签: python image image-processing neural-network scikit-learn

我正在尝试使用Scikit Learn提供的神经网络实现来实现图像处理。我有接近10,000张'JPG'格式的彩色图像,我将这些图像转换为'PNG'格式并删除了颜色信息。新图像均为黑色或白色图像。在将这些图像转换为矢量格式之后,这些图像矢量形成了对神经网络的输入。

对于每个图像,还有一个输出,它形成神经网络的输出。

输入文件只有0和1的值,而没有任何其他值。每个图像的输出对应于一个连续的矢量,介于0和1之间,长度为22。即每个图像的输出是长度为22的向量。

为了开始处理,我开始只有100个图像及其相应的输出,并得到以下错误:

ValueError: Array contains NaN or infinity

我还想指出第一次迭代在这里完成,我在第二次迭代中遇到了这个错误。

为了尝试不同的东西,我将输入和输出调整为每个10张图像。使用相同的代码(即将出现),我能够完成7次迭代(我已经将迭代次数设置为20次),然后收到相同的错误。

然后我将迭代次数更改为5,只是为了检查它是否有效。在此更改后,我收到以下错误:

ValueError: bad input shape (10, 22)

我还尝试在输入和输出上使用np.reval(),但这又给我NaN or Infinity错误。

以下是我在整个过程中使用的代码:

import numpy as np
import csv
import matplotlib.pyplot as plt
from scipy.ndimage import convolve
from sklearn import linear_model, datasets, metrics
from sklearn.cross_validation import train_test_split
from sklearn.neural_network import BernoulliRBM
from sklearn.pipeline import Pipeline


def ReadCsv(fileName):
    in_file = open(fileName, 'rUb')
    reader = csv.reader(in_file, delimiter=',', quotechar='"')
    data = [[]]
    for row in reader:
        data.append(row)

    data.pop(0)
    return data

X_train = np.asarray(ReadCsv('100Images.csv'), 'float32')
Y_train = np.asarray(ReadCsv('100Images_Y_new.csv'), 'float32')
X_test = np.asarray(ReadCsv('ImagesForTest.csv'), 'float32')
Y_test = np.asarray(ReadCsv('ImagesForTest_Y_new.csv'), 'float32')

logistic = linear_model.LogisticRegression()
rbm = BernoulliRBM(random_state=0, verbose=True)

classifier = Pipeline(steps=[('rbm', rbm), ('logistic', logistic)])

rbm.learning_rate = 0.06
rbm.n_iter = 5

rbm.n_components = 100
logistic.C = 6000.0

classifier.fit(X_train, Y_train)

print()
print("Logistic regression using RBM features:\n%s\n" % (
    metrics.classification_report(
        Y_test,
        classifier.predict(X_test))))

我真的很感激这个问题的任何帮助。

TIA。

1 个答案:

答案 0 :(得分:1)

将学习率更改为较小的值可能会解决此问题。 (即rbm.learning_rate)

至少这解决了我之前遇到的问题。