inputs 是一个二维张量:[batch_size x input_size]。
你是对的,input_size必须对应RNN单元的num_units。但batch_size 可以变化,只需对应调用的另一个参数state。
试试这个代码:
import tensorflow as tf
from tensorflow.contrib.rnn import BasicRNNCell
dim = 10
x = tf.placeholder(tf.float32, shape=[None, dim])
y = tf.placeholder(tf.float32, shape=[4, dim])
z = tf.placeholder(tf.float32, shape=[None, dim + 1])
print('x, y, z:', x.shape, y.shape, z.shape)
cell = BasicRNNCell(dim)
state1 = cell.zero_state(batch_size=4, dtype=tf.float32)
state2 = cell.zero_state(batch_size=8, dtype=tf.float32)
out1, out2 = cell(x, state1)
print(out1.shape, out2.shape)
out1, out2 = cell(x, state2)
print(out1.shape, out2.shape)
out1, out2 = cell(y, state1)
print(out1.shape, out2.shape)
这是输出:
x, y, z: (?, 10) (4, 10) (?, 11)
(4, 10) (4, 10)
(8, 10) (8, 10)
(4, 10) (4, 10)
此单元格接受具有两种状态的x,具有state1 的y,并且不接受具有任何状态的z。以下两个调用都会导致错误:
out1, out2 = cell(y, state2) # ERROR: dimensions mismatch
print(out1.shape, out2.shape)
out1, out2 = cell(z, state1) # ERROR: dimensions mismatch
print(out1.shape, out2.shape)