如何在 Tensorflow 中实现自定义 RNN(特别是 ESN)?
How can I implement a custom RNN (specifically an ESN) in Tensorflow?
我正在尝试根据以下定义在 Tensorflow 中定义我自己的 RNNCell(回声状态网络)。
x(t + 1) = tanh(Win*u(t) + W*x(t) + Wfb*y(t))
y(t) = Wout*z(t)
z(t) = [x(t), u(t)]
x为状态,u为输入,y为输出。 Win、W 和 Wfb 不可训练。所有的权值都是随机初始化的,但是W是这样修改的:“将W的一定比例的元素设置为0,对W进行缩放,使其谱半径保持在1.0以下
我有生成方程式的代码。
x = tf.Variable(tf.reshape(tf.zeros([N]), [-1, N]), trainable=False, name="state_vector")
W = tf.Variable(tf.random_normal([N, N], 0.0, 0.05), trainable=False)
# TODO: setup W according to the ESN paper
W_x = tf.matmul(x, W)
u = tf.placeholder("float", [None, K], name="input_vector")
W_in = tf.Variable(tf.random_normal([K, N], 0.0, 0.05), trainable=False)
W_in_u = tf.matmul(u, W_in)
z = tf.concat(1, [x, u])
W_out = tf.Variable(tf.random_normal([K + N, L], 0.0, 0.05))
y = tf.matmul(z, W_out)
W_fb = tf.Variable(tf.random_normal([L, N], 0.0, 0.05), trainable=False)
W_fb_y = tf.matmul(y, W_fb)
x_next = tf.tanh(W_in_u + W_x + W_fb_y)
y_ = tf.placeholder("float", [None, L], name="train_output")
我的问题有两个。首先,我不知道如何将其实现为 RNNCell 的超类。其次我不知道如何根据上述规范生成 W 张量。
非常感谢有关这些问题的任何帮助。也许我可以想出一种方法来准备 W,但我确实不明白如何将我自己的 RNN 实现为 RNNCell 的超类。
快速总结一下:
查看 python/ops/rnn_cell.py
下的 TensorFlow 源代码,了解如何 子类 RNNCell。通常是这样的:
class MyRNNCell(RNNCell):
def __init__(...):
@property
def output_size(self):
...
@property
def state_size(self):
...
def __call__(self, input_, state, name=None):
... your per-step iteration here ...
我可能会迟到一点,但对于任何想做同样事情的人来说,tensorflow-addons 添加了 ESNCell and ESN layer.
的实现
我正在尝试根据以下定义在 Tensorflow 中定义我自己的 RNNCell(回声状态网络)。
x(t + 1) = tanh(Win*u(t) + W*x(t) + Wfb*y(t))
y(t) = Wout*z(t)
z(t) = [x(t), u(t)]
x为状态,u为输入,y为输出。 Win、W 和 Wfb 不可训练。所有的权值都是随机初始化的,但是W是这样修改的:“将W的一定比例的元素设置为0,对W进行缩放,使其谱半径保持在1.0以下
我有生成方程式的代码。
x = tf.Variable(tf.reshape(tf.zeros([N]), [-1, N]), trainable=False, name="state_vector")
W = tf.Variable(tf.random_normal([N, N], 0.0, 0.05), trainable=False)
# TODO: setup W according to the ESN paper
W_x = tf.matmul(x, W)
u = tf.placeholder("float", [None, K], name="input_vector")
W_in = tf.Variable(tf.random_normal([K, N], 0.0, 0.05), trainable=False)
W_in_u = tf.matmul(u, W_in)
z = tf.concat(1, [x, u])
W_out = tf.Variable(tf.random_normal([K + N, L], 0.0, 0.05))
y = tf.matmul(z, W_out)
W_fb = tf.Variable(tf.random_normal([L, N], 0.0, 0.05), trainable=False)
W_fb_y = tf.matmul(y, W_fb)
x_next = tf.tanh(W_in_u + W_x + W_fb_y)
y_ = tf.placeholder("float", [None, L], name="train_output")
我的问题有两个。首先,我不知道如何将其实现为 RNNCell 的超类。其次我不知道如何根据上述规范生成 W 张量。
非常感谢有关这些问题的任何帮助。也许我可以想出一种方法来准备 W,但我确实不明白如何将我自己的 RNN 实现为 RNNCell 的超类。
快速总结一下:
查看 python/ops/rnn_cell.py
下的 TensorFlow 源代码,了解如何 子类 RNNCell。通常是这样的:
class MyRNNCell(RNNCell):
def __init__(...):
@property
def output_size(self):
...
@property
def state_size(self):
...
def __call__(self, input_, state, name=None):
... your per-step iteration here ...
我可能会迟到一点,但对于任何想做同样事情的人来说,tensorflow-addons 添加了 ESNCell and ESN layer.
的实现