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 ...
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
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
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. –