2016-08-05 2 views
0

J'ai récemment commencé à apprendre le Tensorflow et à essayer de créer un code rnn simple en utilisant la fonction de balayage. Ce que j'essaye de faire est de faire prédire la fonction sine par le RNN. Il reçoit une entrée de 1 dim. et sorties également 1 dim dans le lot comme suit.Création d'un code rnn simple avec fonction de balayage dans 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) 

mais il donne une erreur à la dernière ligne (optimiseur) comme,

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

S'il vous plaît quelqu'un connaît la raison, dites-moi comment le réparer ...

Répondre

0

Je suppose que votre l'erreur n'est pas sur la dernière ligne (l'optimiseur) mais plutôt sur une opération que vous faites plus tôt. Peut-être dans le reduce_mean avec cette prédiction y? Je ne reviendrai pas sur votre code dans les détails mais je vous dirai que cette erreur survient lorsque vous faites une opération entre deux tenseurs qui nécessitent la même forme (généralement des opérations mathématiques).

+0

Merci pour la réponse Michel. Je pensais que c'était sur la dernière ligne parce que le message d'erreur s'est produit dans la ligne. Ensuite, j'ai besoin de vérifier d'autres lignes aussi. Une autre question est, si la forme n'est pas appariée dans une autre ligne, pourquoi l'erreur n'est pas montrée dans cette ligne? Est-il possible de faire un graphique de calcul au début? – user270700

+0

Sans la dernière ligne, il s'exécute. Cela signifie que l'erreur peut se produire pendant le calcul du gradient (je suppose que la fonction de scan est ...). Comment dois-je déboguer cela? – user270700

+0

Lorsque j'ai des problèmes de forme à déboguer dans tensorflow, je trouve utile d'imprimer la forme de chaque tenseur (vous pouvez utiliser get_shape) pour voir où ils ne s'alignent pas. –