2016-09-16 2 views
3

Я построил ANN в keras, который имеет 1 входной уровень (3 входа), один выходной уровень (1 выход) и два скрытых слоя с 12 и 3 узлами соответственно.Оптимизация точности нейронной сети

enter image description here

Путь я построить и обучить свою сеть является:

from keras.models import Sequential 
from keras.layers import Dense 
from sklearn.cross_validation import train_test_split 
import numpy 
# fix random seed for reproducibility 
seed = 7 
numpy.random.seed(seed) 

dataset = numpy.loadtxt("sorted output.csv", delimiter=",") 
# split into input (X) and output (Y) variables 
X = dataset[:,0:3] 
Y = dataset[:,3] 
# split into 67% for train and 33% for test 
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.33, random_state=seed) 
# create model 
model = Sequential() 
model.add(Dense(12, input_dim=3, init='uniform', activation='relu')) 
model.add(Dense(3, init='uniform', activation='relu')) 
model.add(Dense(1, init='uniform', activation='sigmoid')) 
# Compile model 
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) 
# Fit the model 
model.fit(X_train, y_train, validation_data=(X_test,y_test), nb_epoch=150, batch_size=10) 

Сортировка выходного файла CSV выглядит следующим образом:

enter image description here

так через 150 эпох я получаю: потеря: 0,6932 - acc: 0,5000 - val_loss: 0,6970 - val_acc: 0,1429

Мой вопрос: как я могу изменить свой NN для достижения более высокой точности?

ответ

3

Нейл Слейтер уже предоставил длинный список полезных общих советов.

В вашем конкретном экзамене нормализация важна. Если добавить следующие строки в код

... 
X = dataset[:,0:3] 
from sklearn.preprocessing import StandardScaler 
scaler = StandardScaler() 
X = scaler.fit_transform(X) 

вы получите 100% точность ваших данных игрушек, даже с гораздо более простыми сетевыми структурами. Без нормализации оптимизатор не будет работать.

+0

Я получаю сообщение об ошибке: Нет модуля с именем preprocessig – Adriano10

+0

@ Adriano10: Ответ отсутствует 'n', попробуйте' из sklearn.preprocessing import StandardScaler' –

+0

@NeilSlater: спасибо, исправлено опечатку – Tobias

5

Вы можете попробовать следующее. Я написал это примерно в порядке важности - то есть порядок, я хотел бы попробовать вещи, чтобы решить эту проблему точности вы видите:

  1. Нормализация свои входные данные. Обычно вы принимаете среднее и стандартное отклонение данных обучения и используете их для смещения + масштабирования всех дополнительных входов. Для этого есть standard normalising function in sklearn. Не забудьте обработать ваши тестовые данные таким же образом (используя среднее значение и std из данных обучения, а не пересчитывать его)

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

  3. Для ваших простых данных я бы избегал активации relu. Возможно, вы слышали, что они как-то «лучше», но, как и большинство вариантов NN, у них есть проблемы, в которых они работают хорошо, и другие, где они не лучший выбор. Я думаю, вам будет лучше с помощью tanh или сигмовидной активации в скрытых слоях для вашей проблемы. Сохраните relu для очень глубоких сетей и/или сверточных проблем на изображениях/аудио.

  4. Используйте дополнительные данные для обучения. Неясно, сколько вы его кормите, но NN работают лучше всего с большими объемами данных обучения.

  5. Если у вас уже есть много учебных данных - увеличьте размер скрытых слоев. Более сложные отношения требуют больше скрытых нейронов (а иногда и большего количества слоев), чтобы NN мог выразить «форму» поверхности решения. Here is a handy browser-based network allowing you to play with that idea and get a feel for it.

  6. Добавьте один или несколько dropout layers после скрытых слоев или добавьте некоторые другие регуляризации. Сеть может быть чрезмерной (хотя с точностью обучения 0,5 я подозреваю, что это не так). В отличие от relu, использование выпадения довольно близко к панацее для более сложных проблем NN - во многих случаях оно улучшает обобщение. Небольшое количество отсева (~ 0.2) может помочь в вашей проблеме, но, как и большинство гипер-параметров, вам нужно будет искать наилучшие значения.

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

+0

Я попытался увеличить данные по обучению, но я заметил, что когда я увеличил его, точность снизилась. Почему это могло произойти? – Adriano10

+0

@ Adriano10: Невозможно сказать, не вовлекаясь в проблему. Однако это могут быть случайные колебания (точность <50%, вероятно, будет поломка в другом месте в первую очередь). Я написал свой ответ в том порядке, в котором я бы попробовал. Поэтому сначала вы должны взглянуть на нормализацию - эти высокие положительные числа на вашем входе прекратят работу NN. –

+0

Спасибо, миллион! Этот ответ велик! Если вы не возражаете, у меня есть вопрос. Я считаю, что это причина для другого вопроса. Что касается второго варианта, можете ли вы пояснить, как мы можем видеть, что сеть сходится или все еще учится? –