2017-01-12 2 views
-1

Мне нужна помощь в понимании точности и формата выходных данных для модели Deep Learning.Понимание точности модели Deep Learning

я сделал некоторое обучение для глубокого обучения, основанное на этом сайте: https://machinelearningmastery.com/deep-learning-with-python2/

Я сделал пример для Пима-индийского сахарного набора данных, и ирис цветка набора данных. Я тренирую свой компьютер для набора данных pima-indian-diabetes, используя скрипт из этого: http://machinelearningmastery.com/tutorial-first-neural-network-python-keras/

Затем я тренирую свой компьютер для набора диафрагмы с использованием нижеприведенного сценария.

# import package 
import numpy 
from pandas import read_csv 
from keras.models import Sequential 
from keras.layers import Dense 
from keras.wrappers.scikit_learn import KerasClassifier 
from keras.utils import np_utils 
from sklearn.model_selection import cross_val_score, KFold 
from sklearn.preprocessing import LabelEncoder 
from sklearn.pipeline import Pipeline 
from keras.callbacks import ModelCheckpoint 

# fix random seed for reproductibility 
seed = 7 
numpy.random.seed(seed) 

# load dataset 
dataframe = read_csv("iris_2.csv", header=None) 
dataset = dataframe.values 
X = dataset[:,0:4].astype(float) 
Y = dataset[:,4] 

# encode class value as integers 
encoder = LabelEncoder() 
encoder.fit(Y) 
encoded_Y = encoder.transform(Y) 
### one-hot encoder ### 
dummy_y = np_utils.to_categorical(encoded_Y) 

# define base model 
def baseline_model(): 
    # create model 
    model = Sequential() 
    model.add(Dense(4, input_dim=4, init='normal', activation='relu')) 
    model.add(Dense(3, init='normal', activation='sigmoid')) 

    # Compile model 
    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) 
    model_json = model.to_json() 
    with open("iris.json", "w") as json_file: 
     json_file.write(model_json) 

    model.save_weights('iris.h5') 

    return model 

estimator = KerasClassifier(build_fn=baseline_model, nb_epoch=1000, batch_size=6, verbose=0) 
kfold = KFold(n_splits=10, shuffle=True, random_state=seed) 
results = cross_val_score(estimator, X, dummy_y, cv=kfold) 
print("Accuracy: %.2f%% (%.2f%%)" % (results.mean()*100, results.std()*100)) 

Все работает отлично, пока я не решил попробовать на другой набор данных по этой ссылке: https://archive.ics.uci.edu/ml/datasets/Glass+Identification

В первый я тренируюсь этот новый набор данных, используя примеру PIME-индийского диабета DataSet сценария и изменить значение X и У переменной этого

dataset = numpy.loadtxt("glass.csv", delimiter=",") 
X = dataset[:,0:10] 
Y = dataset[:,10] 

, а также значение для нейрона слоя к этому

model = Sequential() 
model.add(Dense(10, input_dim=10, init='uniform', activation='relu')) 
model.add(Dense(10, init='uniform', activation='relu')) 
model.add(Dense(1, init='uniform', activation='sigmoid')) 

точность результата продукции = 32,71%

Затем я изменил выходной столбец этого набора данных, которое первоначально в целое число (1 ~ 7) в строку (а ~ г) и использовать сценарий в качестве примера для радужной оболочки-цветок Набор данных, делая некоторые модификации к нему

import numpy 
from pandas import read_csv 
from keras.models import Sequential 
from keras.layers import Dense 
from keras.wrappers.scikit_learn import KerasClassifier 
from sklearn.model_selection import cross_val_score 
from sklearn.preprocessing import LabelEncoder 
from sklearn.model_selection import StratifiedKFold 
from sklearn.preprocessing import StandardScaler 
from sklearn.pipeline import Pipeline 

seed = 7 
numpy.random.seed(seed) 

dataframe = read_csv("glass.csv", header=None) 
dataset = dataframe.values 

X = dataset[:,0:10].astype(float) 
Y = dataset[:,10] 

encoder = LabelEncoder() 
encoder.fit(Y) 
encoded_Y = encoder.transform(Y) 

def create_baseline(): 
    model = Sequential() 
    model.add(Dense(10, input_dim=10, init='normal', activation='relu')) 
    model.add(Dense(1, init='normal', activation='sigmoid')) 

    model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) 

    model_json = model.to_json() 
    with open("glass.json", "w") as json_file: 
     json_file.write(model_json) 

    model.save_weights('glass.h5') 

    return model 

estimator = KerasClassifier(build_fn=create_baseline, nb_epoch=1000, batch_size=10, verbose=0) 
kfold = StratifiedKFold(n_splits=10, shuffle=True, random_state=seed) 
results = cross_val_score(estimator, X, encoded_Y, cv=kfold) 
print("Baseline: %.2f%% (%.2f%%)" % (results.mean()*100, results.std()*100)) 

Я не использовал «dummy_y» переменной, обратитесь к этой обучающей программе: http://machinelearningmastery.com/binary-classification-tutorial-with-the-keras-deep-learning-library/

Я проверить, что набор данных с использованием алфавита, как выход и думать, что, возможно, я могу повторно использовать этот сценарий для подготовки нового набора данных стекла, который я модифицировал.

На этот раз результаты становятся как этот

Baseline: 68.42% (3.03%)

Из статьи, что 68% и 3% означает, что среднее и стандартное отклонение точности модели.

Мой первый вопрос: когда я использую целое или алфавит в качестве выходного столбца? и является ли такой результат точности распространенным, когда мы закаляемся с помощью набора данных, например, изменяя вывод из целого числа в строку/алфавит?

Мой второй вопрос: как узнать, сколько нейронов мне нужно положить для каждого слоя? Связано ли это с тем, какой бэкэнд я использую при компиляции модели (Tensorflow или Theano)?

Заранее спасибо.

+0

Разница между двумя пробегами заключается в изменении выходов целых чисел на буквы? Из вашего кода кажется, что вы также изменили количество слоев – ginge

+0

Я перепроверял и подтвердил, что я не изменил количество слоев, кроме числа нейронов. Вы можете увидеть разницу между количеством слоев, потому что я использую 2 разных сценария. 1, который является примером из урока pima-indian-diabetes, вывод находится в целочисленном (1 и 0), а сценарий использует как 3 слоя. Другой скрипт - это пример из учебника iris-flower, который выводится в строке. Скрипт использует 2 слоя. – Ling

+0

Насколько я понимаю ваш вопрос, в вашем третьем фрагменте кода вы создаете модель Sequential с тремя уровнями, для которых вы получили точность 32.71%. В вашем четвертом фрагменте вы используете последовательную модель с 2 слоями и получаете точность 68,42%. Это правда или что-то не хватает между фрагментами? – ginge

ответ

0

Первый вопрос

Это не имеет значения, как вы можете увидеть здесь:

Y = range(10) 
encoder = LabelEncoder() 
encoder.fit(Y) 
encoded_Y = encoder.transform(Y) 
print encoded_Y 

Y = ['a', 'b', 'c', 'd', 'e', 'f','g','h','i','j'] 
encoder = LabelEncoder() 
encoder.fit(Y) 
encoded_Y = encoder.transform(Y) 
print encoded_Y 

результаты:

[0 1 2 3 4 5 6 7 8 9] 
[0 1 2 3 4 5 6 7 8 9] 

Это означает, что ваш классификатор видит точно такие же метки ,

Второго вопрос

Там нет абсолютно правильного ответа на этот вопрос, но уверен, что это не зависит от вашего внутреннего интерфейса.

Вы должны попробовать и поэкспериментировать с различным количеством нейронов, количеством слоев, типами слоев и всеми другими сетевыми параметрами, чтобы понять, что является лучшей архитектурой для вашей проблемы. С опытом вы разработаете как хорошую интуицию, так и какие параметры будут лучше для каких типов проблем, а также хороший метод для экспериментов.

Лучшее эмпирическое правило (предполагая, что у вас есть набор данных, необходимый для поддержания такой стратегии). Я слышал, что «сделайте свою сеть настолько большой, насколько сможете, до тех пор, пока она не наполнится, добавьте регуляризацию до тех пор, пока она не наполнится - ,

Смежные вопросы