Как преобразовать данные MNIST, чтобы иметь возможность использовать MLPClassifier? - PullRequest
0 голосов
/ 28 февраля 2019

Я пытаюсь отредактировать данный код машинного обучения, который работает в 3 различных учебных сетях.Цель состоит в том, чтобы использовать MLPClassifier из scikit-learn.Ошибка, которую я продолжаю получать, состоит в том, что я устанавливаю элемент массива с последовательностью.Я понимаю, что данные являются кортежами, но не уверен, как их изменить, чтобы можно было использовать классификатор.Я новичок в Python и пытаюсь понять массивы и матрицы в настоящее время.Это то, что я до сих пор.Ошибка исходит из последней строки. Должен ли я разделить данные по-другому или преобразовать их в не кортеж?Любой совет был бы великолепен!

# To support both python 2 and python 3
from __future__ import division, print_function, unicode_literals

# Common imports
import numpy as np
import os

# Standard library
import random

# to make this notebook's output stable across runs
np.random.seed(42)

# To plot pretty figures
%matplotlib inline
import matplotlib
import matplotlib.pyplot as plt
plt.rcParams['axes.labelsize'] = 14
plt.rcParams['xtick.labelsize'] = 12
plt.rcParams['ytick.labelsize'] = 12

# Where to save the figures
PROJECT_ROOT_DIR = "."
CHAPTER_ID = "classification"

def save_fig(fig_id, tight_layout=True):
    path = os.path.join(PROJECT_ROOT_DIR, "images", CHAPTER_ID, fig_id + ".png")
    print("Saving figure", fig_id)
    if tight_layout:
        plt.tight_layout()
    plt.savefig(path, format='png', dpi=300)

#import and split the dataset  
import mnist_loader
training_data, validation_data, test_data = map(list,mnist_loader.load_data_wrapper())
training_data = list(training_data)

print(len(training_data))

#Setting up and training 1st network
import network
net1 = network.Network([784, 30, 10])
epochs = 30
mini_batch_size = 10
eta = 3.0
net1.SGD(training_data, epochs, mini_batch_size, eta, test_data=test_data)

#Second Network
import network
net2 = network.Network([784, 100, 10])
epochs = 30
mini_batch_size = 10
eta = 3.0
net2.SGD(training_data, epochs, mini_batch_size, eta, test_data=test_data)

#3rd Network    
import network
net3 = network.Network([784, 10])
epochs = 30
mini_batch_size = 10
eta = 3.0
net3.SGD(training_data, epochs, mini_batch_size, eta, test_data=test_data)

#Use Classification Built-in Neural Network from Scikit-Learn

from sklearn.neural_network import MLPClassifier
mlp= MLPClassifier(hidden_layer_sizes=(100,),activation='logistic',solver='sgd',batch_size=10,max_iter=30,learning_rate_init=3,learning_rate='constant')
mlp.fit(training_data,test_data)

1 Ответ

0 голосов
/ 01 марта 2019

На основании документации, предоставленной для mnist_loader.load_data_wrapper() (https://github.com/mnielsen/neural-networks-and-deep-learning/blob/master/src/mnist_loader.py),, возвращается training_data в виде кортежей для каждого образца (input + label), где input - это 784-мерный массив, а label -10-мерный массив. Причина такого формата дана как

, формат более удобен для использования в нашей реализации нейронных сетей.

К сожалению, яНе удалось найти пример использования этой функции в документации. Возможно, вместо этого вы можете использовать функцию load_data():

training_data, validation_data, test_data = mnist_loader.load_data()
x_train, y_train = training_data[0], training_data[1]

Данные уже нормализованы, так что вы сможете использовать их по своему усмотрению.функция сразу:

mlp.fit(x_train, y_train)

В качестве альтернативы вы можете загрузить данные из tenorflow:

import tensorflow as tf

mnist = tf.keras.datasets.mnist
(x_train, y_train),(x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0

Если нет причины, по которой вы хотите использовать mnist_loader.

...