2016-08-05 1 views
0

Недавно я начал изучать Tensorflow и попытался сделать простой rnn-код с помощью функции сканирования. То, что я пытаюсь сделать, это заставить функцию RNN предсказать синус. Он получает вход 1 тусклый. и выводит также 1 тусклый пакет, как указано ниже.Создание простого кода rnn с функцией сканирования в Tensorflow

import tensorflow as tf 
from tensorflow.examples.tutorials import mnist 
import numpy as np 
import matplotlib.pyplot as plt 
import os 
import time 

# FLAGS (options) 
tf.flags.DEFINE_string("data_dir", "", "") 
#tf.flags.DEFINE_boolean("read_attn", True, "enable attention for reader") 
#tf.flags.DEFINE_boolean("write_attn",True, "enable attention for writer") 
opt = tf.flags.FLAGS 

#Parameters 
time_step = 10 
num_rnn_h = 16 
batch_size = 2 
max_epoch=10000 
learning_rate=1e-3 # learning rate for optimizer 
eps=1e-8 # epsilon for numerical stability 

#temporary sinusoid data 
x_tr = np.zeros([batch_size,time_step]) 
y_tr = np.zeros([batch_size,time_step]) 
ptrn = 0.7*np.sin(np.arange(time_step+1)/(2*np.pi)) 
x_tr[0] = ptrn[0:time_step] 
y_tr[0] = ptrn[1:time_step+1] 
x_tr[1] = ptrn[0:time_step] 
y_tr[1] = ptrn[1:time_step+1] 

#Build model 
x = tf.placeholder(tf.float32,shape=[batch_size,time_step,1], name= 'input') 
y = tf.placeholder(tf.float32,shape=[None,time_step,1], name= 'target') 
cell = tf.nn.rnn_cell.BasicRNNCell(num_rnn_h) 
#cell = tf.nn.rnn_cell.LSTMCell(num_h, state_is_tuple=True) 
with tf.variable_scope('output'): 
    W_o = tf.get_variable('W_o', shape=[num_rnn_h, 1]) 
    b_o = tf.get_variable('b_o', shape=[1], initializer=tf.constant_initializer(0.0)) 

init_state = cell.zero_state(batch_size, tf.float32) 

#make graph 
#rnn_outputs, final_states = tf.scan(cell, xx1, initializer= tf.zeros([num_rnn_h])) 
scan_outputs = tf.scan(lambda a, xi: cell(xi, a), tf.transpose(x, perm=[1,0,2]), initializer= init_state) 
rnn_outputs, rnn_states = tf.unpack(tf.transpose(scan_outputs,perm=[1,2,0,3])) 
print rnn_outputs, rnn_states 

with tf.variable_scope('predictions'): 
    weighted_sum = tf.reshape(tf.matmul(tf.reshape(rnn_outputs, [-1, num_rnn_h]), W_o), [batch_size, time_step, 1]) 
    predictions = tf.add(weighted_sum, b_o, name='predictions') 
with tf.variable_scope('loss'): 
    loss = tf.reduce_mean((y - predictions) ** 2, name='loss') 

train_step = tf.train.AdamOptimizer(learning_rate).minimize(loss) 

Но это дает ошибку в последней строке (оптимизатор), как,

ValueError: Shapes (2, 16) and (2, 2, 16) are not compatible

Пожалуйста кто знает причину, скажите мне, как это исправить ...

ответ

0

Я предполагаю, что ваш ошибка не на последней строке (оптимизаторе), а на некоторой операции, которую вы делаете ранее. Может быть, в reduce_mean с этим y - предсказанием? Я не буду подробно описывать ваш код, но я скажу вам, что эта ошибка возникает, когда вы выполняете операцию между двумя тензорами, которые требуют одинаковой формы (обычно это математические операции).

+0

Спасибо за ответ Michel. Я, хотя он был в последней строке, потому что сообщение об ошибке произошло в строке. Затем мне нужно проверить и другие строки. Другой вопрос: если форма не сопоставляется в другой строке, почему ошибка не отображается в этой строке? Можно ли сделать расчетный график в начале? – user270700

+0

Без последней строки он запускается. Это означает, что ошибка может возникнуть при вычислении градиента (я предполагаю, что внутри функции сканирования ...). Как мне отладить это? – user270700

+0

Когда у меня возникают проблемы с формой для отладки в тензорном потоке, мне полезно распечатать форму каждого тензора (вы можете использовать get_shape), чтобы увидеть, где они не выстраиваются. –