Точность многослойной нейронной сети Keras - PullRequest
0 голосов
/ 26 мая 2019

Я построил упрощенный многослойный NN с использованием Keras с данными об осадках в Австралии .Код принимает 4 входных столбца: ['MinTemp', 'MaxTemp', 'Rainfall', 'WindGustSpeed'] и сравнивается с выводом RainTomorrow.

Я разбил данные на блоки обучения / тестирования, преобразовал все значения в 0 <= n <= 1.Когда я пытаюсь запустить model.fit, мои потери остаются на уровне ~ 13,2, но моя точность всегда равна 0,0.Пример зарегистрированных интервалов подбора:

...
Epoch 37/200
113754/113754 [==============================] - 0s 2us/step - loss: -13.1274 - acc: 0.0000e+00 - val_loss: -16.1168 - val_acc: 0.0000e+00
Epoch 38/200
113754/113754 [==============================] - 0s 2us/step - loss: -13.1457 - acc: 0.0000e+00 - val_loss: -16.1168 - val_acc: 0.0000e+00
Epoch 39/200
113754/113754 [==============================] - 0s 2us/step - loss: -13.1315 - acc: 0.0000e+00 - val_loss: -16.1168 - val_acc: 0.0000e+00
Epoch 40/200
113754/113754 [==============================] - 0s 2us/step - loss: -13.1797 - acc: 0.0000e+00 - val_loss: -16.1168 - val_acc: 0.0000e+00
Epoch 41/200
113754/113754 [==============================] - 0s 2us/step - loss: -13.1844 - acc: 0.0000e+00 - val_loss: -16.1169 - val_acc: 0.0000e+00
Epoch 42/200
113754/113754 [==============================] - 0s 2us/step - loss: -13.2205 - acc: 0.0000e+00 - val_loss: -16.1169 - val_acc: 0.0000e+00
Epoch 43/200
...

Как я могу изменить следующий скрипт, чтобы моя точность выросла, и мой вывод предикации возвращает значение от 0 до 1 (0: без дождя, 1: дождь)?

import keras
import sklearn.model_selection
import numpy as np
import pandas as pd
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import MinMaxScaler

labelencoder = LabelEncoder()

# read data, replace NaN with 0.0
csv_data = pd.read_csv('weatherAUS.csv', header=0)
csv_data = csv_data.replace(np.nan, 0.0, regex=True)

# Input/output columns scaled to 0<=n<=1
x = csv_data.loc[:, ['MinTemp', 'MaxTemp', 'Rainfall', 'WindGustSpeed']]
y = labelencoder.fit_transform(csv_data['RainTomorrow'])
scaler_x = MinMaxScaler(feature_range =(-1, 1))
x = scaler_x.fit_transform(x)
scaler_y = MinMaxScaler(feature_range =(-1, 1))
y = scaler_y.fit_transform([y])[0]

# Partitioned data for training/testing
x_train, x_test, y_train, y_test = sklearn.model_selection.train_test_split(x, y, test_size=0.2)

# model
model = keras.models.Sequential() 
model.add( keras.layers.normalization.BatchNormalization(input_shape=tuple([x_train.shape[1]])))
model.add(keras.layers.core.Dense(4, activation='relu'))
model.add(keras.layers.core.Dropout(rate=0.5))
model.add(keras.layers.normalization.BatchNormalization())
model.add(keras.layers.core.Dense(4, activation='relu'))
model.add(keras.layers.core.Dropout(rate=0.5))
model.add(keras.layers.normalization.BatchNormalization())
model.add(keras.layers.core.Dense(4, activation='relu'))
model.add(keras.layers.core.Dropout(rate=0.5))
model.add(keras.layers.core.Dense(1,   activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='rmsprop', metrics=["accuracy"])

callback_early_stopping = keras.callbacks.EarlyStopping(monitor='val_loss', patience=10, verbose=0, mode='auto')

model.fit(x_train, y_train, batch_size=1024, epochs=200, validation_data=(x_test, y_test), verbose=1, callbacks=[callback_early_stopping])

y_test = model.predict(x_test.values)

Ответы [ 3 ]

1 голос
/ 27 мая 2019

Таким образом, сигмовидная кишка варьируется от 0 до 1. Ваш MinMaxscaler масштабирует данные от -1 до 1.

Вы можете исправить это, заменив 'sigmoid' в выходном слое на 'tanh', так как tanh имеет выход в диапазоне от -1 до 1

1 голос
/ 27 мая 2019

Оба других ответа могут использоваться для учета того факта, что выход вашей сети не находится в том же диапазоне, что и ваши y векторные значения.Либо настройте свой последний слой на активацию tanh, либо измените диапазон y -vector на [0,1].

Однако ваша функция и показатель потерь в сети определены для целей классификации, когда вы пытаетесь регрессировать (непрерывные значения между [-1, 1]).Наиболее распространенная функция потерь и метрика точности - это среднеквадратичная ошибка, или средняя абсолютная ошибка.Поэтому я предлагаю вам изменить следующее:

model.compile(loss='mse', optimizer='rmsprop', metrics=['mse, 'mae'])
1 голос
/ 26 мая 2019

enter image description here

Как вы можете видеть, функция активации сигмоида, которую вы используете в выходной нейронной сети (последний слой), находится в диапазоне от 0 до 1.

Обратите внимание, что ваш ярлык (y) изменен с -1 на 1.

Я предлагаю вам изменить диапазон y от 0 до 1 и сохранить сигмоидальный выход.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...