我对机器学习和图像分类这一切都很陌生。我正在使用pybrain作为我的主要神经网络模型化工具。
我的问题如下。我有100x100图像有0,1,2,3项目,我希望机器告诉我新的100x100图像中有多少元素。
我制作了25个元素的训练集(只是为了看看我是否可以从中获得一些东西)。我意识到这个数字相对于所需的测试集非常小,但是收集训练数据会非常昂贵(可行但价格昂贵)。
以下是我制作训练集的方法
onlyfiles = [f for f in filter(lambda x: x[-3:] == "png", onlyfiles)]
input = np.zeros(shape=(len(onlyfiles), 10000))
output = np.zeros(shape=(len(onlyfiles), 1))
row = 0
for file in onlyfiles:
img = Image.open(path+file)
pix = img.load()
for x in range(100):
for y in range(100):
input[row, 100*x+y] = pix[x, y][2]
output[row,0] = output_mapping[file]
row += 1
我只使用了pix [x,y] [2](蓝色),因为区域被蓝光照亮了。
所以我生成了分类数据集
ds = ClassificationDataSet(10000,1,nb_classes=4)
for k in range(len(X)):
ds.addSample(np.ravel(input[k]),output[k])
temp_testdata, temp_traindata = ds.splitWithProportion(0.25)
tstdata = ClassificationDataSet(10000,1,nb_classes=4)
trndata = ClassificationDataSet(10000,1,nb_classes=4)
for k in range(len(temp_testdata)):
tstdata.addSample(temp_testdata.getSample(k)[0],temp_testdata.getSample(k)[1])
for k in range(len(temp_traindata)):
trndata.addSample(temp_traindata.getSample(k)[0],temp_traindata.getSample(k)[1])
创建了网络
fnn = buildNetwork(trndata.indim, 1, trndata.outdim, outclass=SoftmaxLayer)
trainer = BackpropTrainer(fnn,dataset=trndata, momentum=0.1, learningrate=0.01, verbose= True, weightdecay=0.01)
训练网络
trainer.trainEpochs (50)
并试图在
中推回一些数据 fnn.activateOnDataset(tstdata)
这就是我得到的
Out[186]:
array([[ 0.20086945, 0.46216524, 0.30707544, 0.02988986],
[ 0.20086945, 0.46216524, 0.30707544, 0.02988986],
[ 0.20086945, 0.46216524, 0.30707544, 0.02988986],
[ 0.20086945, 0.46216524, 0.30707544, 0.02988986],
[ 0.20086945, 0.46216524, 0.30707544, 0.02988986],
[ 0.20086945, 0.46216524, 0.30707544, 0.02988986]])
据我所知,我的神经网络将为所有tstdata样本提供Class“2”。我很惊讶。我期待蹩脚的结果,但我没想到同样的6个输出......
为了结账,这里是5个样本中每个样本的所有像素的“总和”,显示我的5个样本确实不同...
In[199]: np.sum(tstdata.data['input'],1)
Out[198]: array([ 1170985., 1115688., 1173766., 1125111., 1152222., 1132945.])
我甚至把0和1串作为“假”样本抛出,数字没有改变!
知道为什么我的所有小道都有相同的输出吗?
非常感谢!