PyBrainでmnistのデータを分類しようとしています。以下はPyBrain mnistの分類
は、訓練のためのコードです:
def train_net(self):
print("Build network")
net = buildNetwork(784, 30, 10, bias=True, hiddenclass=TanhLayer, outclass=SoftmaxLayer)
back_trainer = BackpropTrainer(net, learningrate=1)
training_dataset = self.get_training_dataset()
print("Begin training")
time0 = time()
err = back_trainer.trainUntilConvergence(dataset=training_dataset, maxEpochs=300, verbose=True)
print("Training time is " + str(round(time()-time0, 3)) + " seconds.")
return net, err
def get_training_dataset(self):
print("Reading training images")
features_train = self.read_images("train-images.idx3-ubyte")
print("Reading training labels")
labels_train = self.read_labels("train-labels.idx1-ubyte")
# view_image(features_train[10])
print("Begin reshaping training features")
features_train = self.reshape_features(features_train)
print("Create training dataset")
training_dataset = ClassificationDataSet(784, 10)
for i in range(len(features_train)):
result = [0]*10
result[labels_train[i]] = 1
training_dataset.addSample(features_train[i], result)
training_dataset._convertToOneOfMany()
return training_dataset
をそして、私はテストデータセットにネットワークを有効にすると、結果は次のようになります。ARGMAX値はクラスを示し
[ 3.72885642e-25 4.62573440e-64 2.32150541e-31 9.42499004e-16
1.33256639e-39 2.30439387e-17 5.16602624e-94 1.00000000e+00
1.83860601e-27 1.22969684e-22]
。指定されたリストのargmaxは7です。
なぜですか?私がデータセットを準備するとき、result[labels_train[i]] = 1
を見ることができます。そこでは、対応するニューロンが私に1を与える必要があり、他はゼロでなければなりません。だから私は[0, 0, 0, 0, 0, 0, 0, 1, 0, 0]
を期待した。
私は、_convertToOneOfMany関数がそのような出力を行うことができることを読んだことがあります。だから私はそれを加えたが、何も変わっていない。私は間違っている?間違って何もありません
既にMNISTデータセットのデコード済みバージョンがあります:http://mnist-decoded.000webhostapp.com/ – SomethingSomething