Что я должен сделать, чтобы получить низкие средние потери? - PullRequest
0 голосов
/ 19 марта 2019

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

def create_model():
    model = Sequential()
    # Adding the input layer
    model.add(Dense(26,activation='relu',input_shape=(n_cols,)))
    # Adding the hidden layer
    model.add(Dense(60,activation='relu'))
    model.add(Dense(60,activation='relu'))
    model.add(Dense(60,activation='relu'))
    # Adding the output layer
    model.add(Dense(2))
    # Compiling the RNN
    model.compile(optimizer='adam', loss='mean_squared_error', metrics=['accuracy'])
    return model

kf = KFold(n_splits = 5, shuffle = True)
model = create_model()
scores = []
for i in range(5):
    result = next(kf.split(data_input), None)
    input_train = data_input[result[0]]
    input_test = data_input[result[1]]
    output_train = data_output[result[0]]
    output_test = data_output[result[1]]
    # Fitting the RNN to the Training set
    model.fit(input_train, output_train, epochs=5000, batch_size=200 ,verbose=2)
    predictions = model.predict(input_test) 
    scores.append(model.evaluate(input_test, output_test))

print('Scores from each Iteration: ', scores)
print('Average K-Fold Score :' , np.mean(scores))

И когда я выполняю свой код, результаткак:

Scores from each Iteration:  [[93.90406122928908, 0.8907562990148529], [89.5892979597845, 0.8907563030218878], [81.26530176050522, 0.9327731132507324], [56.46526102659081, 0.9495798339362905], [54.314151876112994, 0.9579831877676379]]
Average K-Fold Score : 38.0159922589274

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

1 Ответ

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

Есть несколько проблем, как с вашими вопросами, так и с вашим кодом ...

Для начала, в общем, мы не можем сказать, что потеря MSE значения X является низкой или высокой.В отличие от точности в задачах классификации, которая по определению в [0, 1], потеря не ограничена подобным образом, поэтому нет общего способа сказать, что конкретное значение является низким или высоким, как вы подразумеваете здесь (это всегда зависит от конкретной проблемы).

Пояснив это, давайте перейдем к вашему коду.

Сначала , судя по вашему loss='mean_squared_error', может показаться, чтовы находитесь в режиме регрессии, в которой точность не имеет смысла;см. Какая функция определяет точность в Керасе, если потеря представляет собой среднеквадратическую ошибку (MSE)? .Вы не поделились тем, какую именно проблему вы пытаетесь решить, но если это действительно регрессионная проблема (т. Е. Предсказание некоторого числового значения), вам следует избавиться от metrics=['accuracy'] в вашей компиляции модели и, возможно, изменить свой последний слой.на одну единицу, то есть model.add(Dense(1)).

Второй , поскольку ваш код в настоящее время таков, вы фактически не помещаете независимые модели с нуля в каждый из ваших сгибов CV (что является самой сущностью CV);в Keras model.fit работает совокупно , то есть он не «сбрасывает» модель при каждом вызове, но продолжает подгонку из предыдущего вызова.Именно поэтому, если вы видите scores, очевидно, что модель значительно лучше в более поздних сгибах (что уже дает подсказку для улучшения: добавьте больше эпох).Чтобы соответствовать независимым моделям, как вы должны сделать для правильного резюме, вы должны переместить create_model() внутрь for петли.

Третий , ваше использование np.mean() здесь снова бессмысленно, так как вы усредняете и потерю , и точность (т.е. яблоки с апельсинами) вместе;тот факт, что из 5 значений потерь между 54 и 94 вы получите «среднее» из 38, уже должен был предупредить вас, что вы пытаетесь что-то сделать не так.Правда в том, что если вы отклоните метрику точности, как указывалось выше, у вас не будет этой проблемы здесь.

В общем, вот как кажется, что ваш код должен быть в принципе (но, опять же, я имеюНи малейшего представления о конкретной проблеме, которую вы пытаетесь решить, поэтому некоторые детали могут отличаться):

def create_model():
    model = Sequential()
    # Adding the input layer
    model.add(Dense(26,activation='relu',input_shape=(n_cols,)))
    # Adding the hidden layer
    model.add(Dense(60,activation='relu'))
    model.add(Dense(60,activation='relu'))
    model.add(Dense(60,activation='relu'))
    # Adding the output layer
    model.add(Dense(1))  # change to 1 unit
    # Compiling the RNN
    model.compile(optimizer='adam', loss='mean_squared_error') # dismiss accuracy
    return model

kf = KFold(n_splits = 5, shuffle = True)
scores = []
for i in range(5):
    result = next(kf.split(data_input), None)
    input_train = data_input[result[0]]
    input_test = data_input[result[1]]
    output_train = data_output[result[0]]
    output_test = data_output[result[1]]
    # Fitting the RNN to the Training set
    model = create_model()  # move create_model here
    model.fit(input_train, output_train, epochs=10000, batch_size=200 ,verbose=2)  # increase the epochs
    predictions = model.predict(input_test) 
    scores.append(model.evaluate(input_test, output_test))

print('Loss from each Iteration: ', scores)
print('Average K-Fold Loss :' , np.mean(scores))
...