2016-11-26 7 views
0

В настоящее время я тренирую свою регрессионную сеть с использованием перекрестного перебора, у меня нет ярлыков, но для конкретного ввода, который должен быть сопоставлен с определенным выходом, сеть затем должна генерировать отображение. У меня, похоже, есть некоторые проблемы с тем, как складки определяются.Как определяется размер каждого k сгибов?

путь я сделать Перекрёстная Проверка, как это:

############################### Training setup ################################## 

#Define 10 folds: 
seed = 7 
np.random.seed(seed) 
kfold = StratifiedKFold(n_splits=10, shuffle=True, random_state=seed) 
print "Splits" 
cvscores_loss = [] 

for train, test in kfold.split(train_set_data_vstacked_normalized,train_set_output_vstacked): 

    print "Model definition!" 
    model = Sequential() 

    #act = PReLU(init='normal', weights=None) 
    model.add(Dense(output_dim=400,input_dim=400, init="normal",activation=K.tanh)) 

    #act1 = PReLU(init='normal', weights=None) 
    model.add(Dense(output_dim=400,input_dim=400, init="normal",activation=K.tanh)) 

    #act2 = PReLU(init='normal', weights=None) 
    model.add(Dense(output_dim=400, input_dim=400, init="normal",activation=K.tanh)) 

    act4=ELU(10000) 
    model.add(Dense(output_dim=13, input_dim=300, init="normal",activation=act4)) 

    print "Compiling" 
    model.compile(loss='mean_squared_error', optimizer='RMSprop', metrics=["accuracy"]) 
    print "Compile done! " 

    print '\n' 

    print "Train start" 
    model.fit(train_set_data_vstacked_normalized[train],train_set_output_vstacked[train], nb_epoch=10, verbose=1) 

    loss, accuracy = model.evaluate(x=train_set_data_vstacked_normalized[test],y=train_set_output_vstacked[test],verbose=1) 
    print 
    print('loss: ', loss) 
    print('accuracy: ', accuracy) 
    print() 
    print model.summary() 
    print "New Model:" 
    cvscores_loss.append(loss) 


print("%.2f%% (+/- %.2f%%)" % (numpy.mean(cvscores_loss), numpy.std(cvscores_loss))) 

Проблема с этим кодом, что я никогда не войти в цикл .. появляется предупреждающее сообщение после того, как «расколы» печатается ... Это время.

Splits 
/home/k/.local/lib/python2.7/site-packages/sklearn/model_selection/_split.py:579: Warning: The least populated class in y has only 1 members, which is too few. The minimum number of groups for any class cannot be less than n_splits=10. 

Что делают вопрос, как kfold, знает, что входные и выходные размеры в моей нейронной сети? ...

Должен ли я определить его где-нибудь? или как? ..

ответ

1

Сообщение сообщает вам о проблеме. Один из ваших целевых классов имеет только 1 член. Когда он стратифицируется в 10 раз, ему требуется не менее 10 членов каждого класса, чтобы он мог поместить 1 в каждую складку.

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

+0

Сво проблема регрессии. Поэтому у меня нет классов как таковых .. Я тренирую свою сеть, чтобы правильно отобразить определенный вход на определенный выход. Определенный вывод - это не метка, а необработанная функция с длиной 13. Какой 'train_set_output_vstacked [0]' также выводится. –

+1

StratifiedKFold требует классов. Используйте KFold для регрессии. Или, если вы используете cross_val_score, тогда он выберет, какой из них использовать, исходя из того, выполняете ли вы регрессию или классифицируете. – simon

0

Я думаю, вы слишком усложняют это. Если вам нужна перекрестная проверка на модели Keras, вы можете использовать keras scikit-learn API. Для этого вам необходимо:

Импорт некоторые вещи:

from keras.wrappers.scikit_learn import KerasClassifier 
from sklearn.model_selection import StratifiedKFold 
from sklearn.model_selection import cross_val_score 

создать функцию, которая определяет модель:

def model_creation(): 
    model = Sequential() 
    model.add(...) 
    ... 
    model.compile(...) 
    return model 

и использовать обертку:

model = KerasClassifier(build_fn=model_creation, nb_epoch=100, batch_size=100, verbose=0) 
kfold = StratifiedKFold(n_splits=10, shuffle=True, random_state=42) 
results = cross_val_score(model, X, y, cv=kfold) 

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

  • Нет связанных вопросов^_^