(Python, Keras) Почему мое прогнозируемое значение не близко к реальному значению? - PullRequest
0 голосов
/ 19 июня 2020

Я новичок в нейронных сетях. Я изучаю некоторые основы и застрял на этом этапе.

Я играл со многими параметрами, включая начальные значения системы c Dynami. Я снизил скорость обучения и изменил количество эпох и размер пакета. Также я изменил количество образцов, которые я передаю функции соответствия. Я добавил скрытый слой и снова удалил его. В конце концов, ничего особо не помогло. Иногда прогнозируемое значение довольно близко, а иногда очень далеко от проверенного значения. Я что-то упускаю? Или как я могу улучшить нейронные сети в целом, чтобы получить то, что я хочу предсказывать? Нужно ли мне искать "золотую середину"?

Ниже вы можете найти мой код. Буду рад новым идеям по улучшению сети. Я новичок, и это мой первый пост на StackOverflow.

######################### import stuff ##########################
import numpy as np
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
import time
import matplotlib.pyplot as p
from keras import backend as K


###Model
k_dim =1000 # Number of timestamps
seq_dim = 1000 # Number of samples

def g_func(x):
    return np.power(x,2)

input1 = keras.Input(shape=(k_dim,))
input2 = keras.Input(shape=(k_dim,))

merged = layers.concatenate([input1,input2])
alpha_pred = layers.Dense(32,input_dim=2, activation='relu')(merged)
x = layers.Dense(16,activation='sigmoid')(alpha_pred)
output_a = layers.Dense(1)(x)
model = keras.Model(inputs=[input1,input2], outputs=output_a)

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


######################## Simulating Input and Output data ########################
n = 2
alpha = np.random.rand(1,seq_dim)
m = 1
X_train = np.random.rand(seq_dim,k_dim)
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])

alpha = np.transpose(alpha)
print('Learning rate before first fit:', model.optimizer.learning_rate.numpy())
history = model.fit([X_train,y_train], alpha, batch_size=64, epochs=3000)

print("Learning rate before second fit:", model.optimizer.learning_rate.numpy())
K.set_value(model.optimizer.learning_rate, 0.001)
history = model.fit([X_train,y_train], alpha, batch_size=64, epochs=1000)

# Plot the lossfunction and mean squared error
p.plot(history.history['loss'], 'b-', label='LOSS')
p.plot(history.history['mean_squared_error'], 'r-', label='Mean squared error')
p.legend(loc='best')
p.draw()
print('Model trained...')
time.sleep(2)
alpha = None
X_train = None
y_train = None
u = None
seq_dim = 1


#####
###Model has been trained. Lets test with new x and y to get one alpha###
####
X_train = np.random.rand(seq_dim,k_dim)
u = [float] * seq_dim
y_train = np.zeros((seq_dim,k_dim))
alpha = np.array([0.9])

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[i] * y_train[j,k-i] + g_func(u[k])

z = model.predict([X_train, y_train])


#Compare the real value with the predicted value
print('Comparing real value with predicted value')
for i,j in zip(alpha,z):
    print('{} => {}'.format(i,j))

p.show()

enter image description here

enter image description here

1 Ответ

0 голосов
/ 19 июня 2020

Возможно, проблема в сигмоиде. Это слишком часто вызывает исчезающие градиенты и иногда приводит к взрыву градиентов во время обратного распространения, потому что его производные находятся в диапазоне 0-0,25.

Вы должны знать, как ваши данные распространяются с помощью plot. Также удалите выбросы в задачах регрессии.

Если входные данные слишком разбросаны на вашем графике, тогда модель не будет всегда предсказывать близкое к правильному значению.

...