回归问题-损失没有减少,并且预测是错误的

时间:2020-06-25 20:21:42

标签: python tensorflow keras neural-network regression

我正在尝试为非线性方程y = alpha * y + g(x)预测alpha。我用随机的x和alpha值以及一个初始y值创建了自己的数据集(见下文)。

我试图更改隐藏层数,神经元数,历元数,样本数(seq_dim),学习率,时间戳数(k_dim)。我更改了输入数据的范围,对测试数据,验证数据和评估数据的输入和输出数据进行了标准化。我更改了输出层,并试图对输出层进行规范化(我不知道代码是否正确)。

我试图改变很多事情,并在不同的帖子和网站上阅读了有关回归问题和难以预测值的问题。有人可以帮我一下,告诉我我做错了吗?我每天都坐在这里几个小时,我再也没有想法了。我总是读同样的东西,也许我正在错误地执行某件事。我只需要有人检查一下。我是神经网络和keras的初学者,所以请告诉我并解释所有错误的事情。

我要先谢谢你!

代码:

    def g_func(x):

    return ( np.power(x,4) + x )


#################################Building the model
k_dim =20
seq_dim = 1000
epochs = 500
batch_size = 128
lr1 = 0.00001
lr2 = 0.0001    

input1 = keras.Input(shape=(k_dim,))
input2 = keras.Input(shape=(k_dim,))
merged = layers.concatenate([input1,input2])
alpha_pred = layers.Dense(16, input_dim=2, activation='relu')(merged)
x = layers.Dense(8,kernel_regularizer='l1',activation='relu')(alpha_pred)
output_a = layers.Lambda(lambda t: K.l2_normalize(t, axis=-1),)(x)
model = keras.Model(inputs=[input1,input2], outputs=output_a)

model.compile(loss='mean_squared_error', optimizer='adam', metrics=['mean_absolute_error'])
model.summary()

########################### Simulating Input and Output data (Training data)########################
n = 2
np.random.seed(0)
alpha = np.round(np.random.uniform(low=0,high=2,size=(1,seq_dim)),3)
m = 1
np.random.seed(1)
X_train = np.round(np.random.uniform(low=0,high=30,size=(seq_dim,k_dim)),3)
X_train[:,0] = 0
u = [float] * seq_dim
y_train = np.zeros((seq_dim,k_dim))

for j in range (seq_dim):
    u = X_train[j,:]
    for k in range(k_dim-1):
        for i in range(n-1):
            y_train[j,k+1] = alpha[0,i] * y_train[j, k-i] + g_func(u[k])

########## Validation data
np.random.seed(2)
X_test = np.round(np.random.uniform(low=0,high=30,size=(seq_dim,k_dim)),3)
X_test[:,0] = 0
u = [float] * seq_dim
y_test = np.zeros((seq_dim,k_dim))
np.random.seed(3)
alpha_test = np.round(np.random.uniform(low=0,high=2,size=(1,seq_dim)),3)

for j in range (seq_dim):
    u = X_test[j, :]
    for k in range(k_dim-1):
        for i in range(n-1):
            y_test[j,k+1] = alpha_test[0,i] * y_test[j,k-i] + g_func(u[k])

alpha = np.transpose(alpha)
alpha_test = np.transpose(alpha_test)

#Normalize data
normalized_y_train = np.zeros((seq_dim,k_dim))
normalized_X_train = np.zeros((seq_dim,k_dim))
normalized_y_test = np.zeros((seq_dim,k_dim))
normalized_X_test = np.zeros((seq_dim,k_dim))
normalized_alpha = (alpha-np.min(alpha))/(np.max(alpha)-np.min(alpha))
normalized_alpha_test = (alpha_test-np.min(alpha_test))/(np.max(alpha_test)-np.min(alpha_test))
for j in range(seq_dim):
    normalized_y_train[j,:] = (y_train[j,:]-np.min(y_train[j,:]))/(np.max(y_train[j,:])-np.min(y_train[j,:]))
    normalized_X_train[j,:] = (X_train[j,:]-np.min(X_train[j,:]))/(np.max(X_train[j,:])-np.min(X_train[j,:]))

    normalized_y_test[j,:] = (y_test[j,:]-np.min(y_test[j,:]))/(np.max(y_test[j,:])-np.min(y_test[j,:]))
    normalized_X_test[j,:] = (X_test[j,:]-np.min(X_test[j,:]))/(np.max(X_test[j,:])-np.min(X_test[j,:]))



###############################Training of the model###############
history = model.fit([normalized_X_train, normalized_y_train], normalized_alpha, batch_size=batch_size, epochs=epochs, validation_split=0.2, shuffle=True, validation_data=([normalized_X_test, normalized_y_test], normalized_alpha_test))

print('Model trained...')
time.sleep(2)
alpha = None
X_train = None
y_train = None
u = None

############################ Evaluation data
np.random.seed(4)
X_eval = np.round(np.random.uniform(low=0,high=30,size=(seq_dim,k_dim)),3)
X_eval[:,0] = 0
u = [float] * seq_dim
y_eval = np.zeros((seq_dim,k_dim))
np.random.seed(5)
alpha_eval = np.round(np.random.uniform(low=0,high=2,size=(1,seq_dim)),3)

for j in range (seq_dim):
    u = X_eval[j, :]
    for k in range(k_dim-1):
        for i in range(n-1):
            y_eval[j,k+1] = alpha_eval[0,i] * y_eval[j,k-i] + g_func(u[k])

normalized_y_eval = np.zeros((seq_dim,k_dim))
normalized_X_eval = np.zeros((seq_dim,k_dim))
for j in range(seq_dim):
    normalized_y_eval[j,:] = (y_eval[j,:]-np.min(y_eval[j,:]))/(np.max(y_eval[j,:])-np.min(y_eval[j,:]))
    normalized_X_eval[j,:] = (X_eval[j,:]-np.min(X_eval[j,:]))/(np.max(X_eval[j,:])-np.min(X_eval[j,:]))

z = model.predict([normalized_X_eval, normalized_y_eval])
z = np.transpose(z)

p.show()

损失:

Loss

0 个答案:

没有答案