Tensorflow GD не меняет tf.Variables - PullRequest
0 голосов
/ 29 мая 2018

Спасибо за рассмотрение этого вопроса.

Я пытаюсь обучить трехслойной NN прогнозировать цену акций на следующие 10 дней на основе цены акций за предыдущие 15 дней.При использовании GradientDescentOptimizer вес переменных не изменился, поэтому мы хотели бы обратиться за помощью к вам.Я попробовал следующее:

  1. Проверьте, что есть заполнитель tf.place и что я подал в тензоре с правильным размером.
  2. Изменил скорость обучения и посмотрим, улучшится ли потеря.
  3. Изменена функция потерь с Reduce_Sum на Reduction_Man квадратов разностей между фактическими данными и прогнозом.
  4. Рандомизированы мои tf.Variables.

Код, который яработает так, как следует.Некоторые символы не определены здесь для ясности кода.Ценю ваши добрые советы по этому вопросу!

#Setting value placeholder
x = tf.placeholder(tf.float64,shape=(19,15,1), name = 'Input')
y_ = tf.placeholder(tf.float64,shape=(19,10,1), name = 'Output')


#Setting DNN key architectural values
n_layers = 3
n_nodes_l1 = 20
n_nodes_l2 = 30
n_nodes_l3 = 10

W01 = tf.Variable(tf.random_uniform([n_nodes_l1, 15],0,1,dtype=tf.float64,name="W01"))
W02 = tf.Variable(tf.random_uniform([n_nodes_l2, n_nodes_l1],0,1,dtype=tf.float64),name='W02')
W03 = tf.Variable(tf.random_uniform([n_nodes_l3, n_nodes_l2],0,1,dtype=tf.float64),name='W03')

b01 = tf.Variable(tf.random_uniform([n_nodes_l1,1],0,1,dtype=tf.float64),name='b01')
b02 = tf.Variable(tf.random_uniform([n_nodes_l2,1],0,1,dtype=tf.float64),name='b02') 
b03 = tf.Variable(tf.random_uniform([n_nodes_l3,1],0,1,dtype=tf.float64),name='b03')


#Building the architecture
def neural(X):

    a01 = tf.matmul(W01, X) + b01
    X2 = tf.sigmoid(a01)

    a02 = tf.matmul(W02, X2) + b02
    X3 = tf.sigmoid(a02)

    a03 = tf.matmul(W03, X3) + b03
    y_prediction= tf.sigmoid(a03)

    return y_prediction

#Loss and Optimizer
loss = []
final_loss= []
y_pred_col = []

for n_batch in range(0,len(x_data)):
    y_pred = neural(x[n_batch])
    y_pred_col.append(y_pred)

loss = tf.reduce_mean(tf.square(y_ - y_pred_col))
optimizer = tf.train.GradientDescentOptimizer(0.0005).minimize(loss)

#Setting up Tensor Session
sess = tf.Session()
init = tf.global_variables_initializer()
sess.run(init)

n_steps = 30
for iter in range(n_steps):
    _, l, W01_train = sess.run([optimizer,loss,W01], feed_dict = {x: x_data, y_: y_data})
    print(l)

1 Ответ

0 голосов
/ 29 мая 2018

Я бы поступил немного иначе.Есть что-то, что не имеет смысла в вашем коде:

for n_batch in range(0,len(x_data)):
    y_pred = neural(x[n_batch])
    y_pred_col.append(y_pred)

Здесь каждый вызов neural создает новую нейронную сеть, так что в итоге вы получаете len(x_data) сетей.Я утверждаю, что вы хотите одну сеть.В этом случае вы должны вызывать neural только один раз:

y_pred = neural(x)

Это потребует от вас определения операций tf.matmul из neural другим способом (кактеперь вам нужно принять во внимание первое измерение X).Тогда функция потерь будет определена следующим образом:

loss = tf.reduce_mean(tf.square(y_ - y_pred))

Собираем все вместе:

#Setting value placeholder
x = tf.placeholder(tf.float64,shape=(None,15), name = 'Input')
y_ = tf.placeholder(tf.float64,shape=(None,10), name = 'Output')

#Setting DNN key architectural values
n_layers = 3
n_nodes_l1 = 20
n_nodes_l2 = 30
n_nodes_l3 = 10

W01 = tf.Variable(tf.random_uniform([15, n_nodes_l1],0,1,dtype=tf.float64,name="W01"))
W02 = tf.Variable(tf.random_uniform([n_nodes_l1, n_nodes_l2],0,1,dtype=tf.float64),name='W02')
W03 = tf.Variable(tf.random_uniform([n_nodes_l2, n_nodes_l3],0,1,dtype=tf.float64),name='W03')

b01 = tf.Variable(tf.random_uniform([n_nodes_l1],0,1,dtype=tf.float64),name='b01')
b02 = tf.Variable(tf.random_uniform([n_nodes_l2],0,1,dtype=tf.float64),name='b02')
b03 = tf.Variable(tf.random_uniform([n_nodes_l3],0,1,dtype=tf.float64),name='b03')


#Building the architecture
def neural(X):
    a01 = tf.matmul(X, W01) + b01
    X2 = tf.sigmoid(a01)

    a02 = tf.matmul(X2, W02) + b02
    X3 = tf.sigmoid(a02)

    a03 = tf.matmul(X3, W03) + b03
    y_prediction= tf.sigmoid(a03)

    return y_prediction

#Loss and Optimizer
y_pred = neural(x)

loss = tf.reduce_mean(tf.square(y_ - y_pred))
optimizer = tf.train.GradientDescentOptimizer(0.0005).minimize(loss)

#Setting up Tensor Session
sess = tf.Session()
init = tf.global_variables_initializer()
sess.run(init)

n_steps = 30

for iter in range(n_steps):
    _, l, W01_train = sess.run([optimizer,loss,W01], feed_dict = {x: x_data, y_: y_data})
    print(l)

Обратите внимание, что для удобства я изменил определение заполнителей и весов.Код выше будет работать при условии, что формы x_data и y_data равны (batch_size=19,15) и (batch_size=19,10) соответственно.Если проблема все еще остается после этих изменений, то это, вероятно, связано с другими причинами (т.е. зависит от ваших данных или гиперпараметров).

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