Недавно я начал изучать 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
Пожалуйста кто знает причину, скажите мне, как это исправить ...
Спасибо за ответ Michel. Я, хотя он был в последней строке, потому что сообщение об ошибке произошло в строке. Затем мне нужно проверить и другие строки. Другой вопрос: если форма не сопоставляется в другой строке, почему ошибка не отображается в этой строке? Можно ли сделать расчетный график в начале? – user270700
Без последней строки он запускается. Это означает, что ошибка может возникнуть при вычислении градиента (я предполагаю, что внутри функции сканирования ...). Как мне отладить это? – user270700
Когда у меня возникают проблемы с формой для отладки в тензорном потоке, мне полезно распечатать форму каждого тензора (вы можете использовать get_shape), чтобы увидеть, где они не выстраиваются. –