Python Keras中的多维回归网络迅速趋向于0

Python Keras中的多维回归网络迅速趋向于0,python,tensorflow,keras,regression,Python,Tensorflow,Keras,Regression,我有一个基本的keras网络预测一个值,它运行良好。我尝试添加对预测4个值的支持,但当我这样做时,输出立即趋向于0。目前,网络只是用于测试的简单模型 网络的输入是一个形状数组(90,),输出应该有4个值。我试着让输出层也有4个节点,但这显示了与此相同的行为。我还尝试了一些不同的损失函数 def RUNN(训练数据、训练标签、测试数据、测试标签、模型=无): 对于每个测试点,1历元后的输出以及之后的任何输出均为[0,0,0,0]。它应该是一个4项列表,值介于0和1之间,例如[.34、.56、.12

我有一个基本的keras网络预测一个值,它运行良好。我尝试添加对预测4个值的支持,但当我这样做时,输出立即趋向于0。目前,网络只是用于测试的简单模型

网络的输入是一个形状数组(90,),输出应该有4个值。我试着让输出层也有4个节点,但这显示了与此相同的行为。我还尝试了一些不同的损失函数

def RUNN(训练数据、训练标签、测试数据、测试标签、模型=无):


对于每个测试点,1历元后的输出以及之后的任何输出均为[0,0,0,0]。它应该是一个4项列表,值介于0和1之间,例如[.34、.56、.12、.87]

可能您正在执行预测任务或函数拟合任务。有两个建议可能会对您有所帮助:

  • 在预测任务中,
    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('--------------------------')
代码生成

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('--------------------------')