Сеть многомерных регрессий в Керасе быстро стремится к 0 - PullRequest
0 голосов
/ 03 июля 2019

У меня была базовая сеть keras, предсказывающая одно значение, и она работала нормально.Я попытался добавить поддержку для прогнозирования 4 значений, но когда я это сделал, выходные данные мгновенно переходят на 0. Сейчас сеть представляет собой упрощенную модель только для тестирования.

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

def runNN (training_data, training_labels, test_data, test_labels, model = None):

if model == None:

    inp = (Input(shape = (90,), name = 'input'))
    model = (Dense(units = 90, activation='relu'(inp)
    model = (Dropout(0.5))(model)
    model = (Dense(units = 180, activation='relu'))(model)
    model = (Dropout(0.5))(model)
    output1 = Dense(1, activation = 'relu', name = 'preretirement')(model)
    output2 = Dense(1, activation = 'relu',name = 'cola')(model)
    output3 = Dense(1, activation = 'relu',name = 'initialNC')(model)
    output4 = Dense(1, activation = 'relu',name = 'finalNC')(model)

    complete_model = Model(inputs = [inp], outputs = [output1, output2, output3, output4])

    optimizer = Adam(lr = .0003)
    complete_model.compile(loss='mean_absolute_error',
              optimizer=optimizer,
              metrics=['mean_absolute_error'])
complete_model.fit(training_data, {'preretirement' : training_labels[0],
    'cola' : training_labels[1],
     'initialNC' :  training_labels[2],
      'finalNC' : training_labels[3]},
     epochs = 10, batch_size = 128)

Вывод после 1 эпохи и все после, составляет [0,0,0,0] для каждой контрольной точки.Это должен быть список из 4 элементов со значениями от 0 до 1, например [.34, .56, .12, .87]

1 Ответ

1 голос
/ 03 июля 2019

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

  • sigmoid обычно работает лучше, чем relu в задаче прогнозирования.
  • Не использовать функцию активации на конечном выходном слое.

Приведенный ниже код изменен с вашего и работает нормально.

from keras.layers import Input, Dense, Dropout
from keras.models import Model
from keras.optimizers import Adam

dropout_rate = .5
activate_function = 'sigmoid'
num_iteration = 20

inp = Input(shape = (90,), name = 'input')
model = Dense(units = 90, activation=activate_function)(inp)
model = Dropout(rate=dropout_rate)(model)
model = Dense(units = 180, activation=activate_function)(model)
model = Dropout(rate=dropout_rate)(model)
output1 = Dense(units=1, name = 'preretirement')(model)
output2 = Dense(units=1, name = 'cola')(model)
output3 = Dense(units=1, name = 'initialNC')(model)
output4 = Dense(units=1, name = 'finalNC')(model)

# # Your original code
# output1 = Dense(units=1, activation = activate_function, name = 'preretirement')(model)
# output2 = Dense(units=1, activation = activate_function,name = 'cola')(model)
# output3 = Dense(units=1, activation = activate_function,name = 'initialNC')(model)
# output4 = Dense(units=1, activation = activate_function,name = 'finalNC')(model)

complete_model = Model(inputs = [inp], outputs = [output1, output2, output3, output4])
optimizer = Adam(lr = .0003)
complete_model.compile(loss='mean_absolute_error',
                       optimizer=optimizer,
                       metrics=['mean_absolute_error'])

# generate data for training the model
import numpy as np
num_train = 4000 # the number of training instances

# a normal distribution with mean=2, variance=1
training_data = np.random.normal(2, 1, (num_train, 90))
training_labels = np.zeros(shape=(num_train, 4))
for i in range(num_train):
    tmp = np.sum(training_data[i, :])/90.0
    training_labels[i, :] = [tmp, np.sin(tmp), np.cos(tmp), tmp*tmp]
print(training_data.shape, training_labels.shape)

# generate data for testing the model
test_data = np.random.normal(0, 1, (10, 90)) # 10 test instances
test_labels = np.zeros(shape=(10, 4))
for i in range(10):
    tmp = np.sum(training_data[i, :])/90.0

    test_labels[i, :] = [tmp, np.sin(tmp), np.cos(tmp), tmp*tmp]
print(test_data.shape, test_labels.shape)

complete_model.fit(training_data, {'preretirement' : training_labels[:, 0],
                                   'cola' : training_labels[:, 1],
                                   'initialNC' :  training_labels[:, 2],
                                   'finalNC' : training_labels[:, 3]},
                   epochs = num_iteration, 
                   batch_size = 128)

results = complete_model.predict(test_data)
for i in range(10):
    print('true', test_labels[i])
    print('predicted', results[0][i, 0], results[1][i, 0], results[2][i, 0], results[3][i, 0])
    print('--------------------------')

Код выдает

enter image description here

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