theano 和 tensorflow 中的(扫描)函数

优素福

我在 theano 中有以下功能:

def forward_prop_step(x_t, s_t1_prev, s_t2_prev):
        # This is how we calculated the hidden state in a simple RNN. No longer!
        # s_t = T.tanh(U[:,x_t] + W.dot(s_t1_prev))

        # Word embedding layer
        x_e = E[:,x_t]

        # GRU Layer 1
        z_t1 = T.nnet.hard_sigmoid(U[0].dot(x_e) + W[0].dot(s_t1_prev) + b[0])
        r_t1 = T.nnet.hard_sigmoid(U[1].dot(x_e) + W[1].dot(s_t1_prev) + b[1])
        c_t1 = T.tanh(U[2].dot(x_e) + W[2].dot(s_t1_prev * r_t1) + b[2])
        s_t1 = (T.ones_like(z_t1) - z_t1) * c_t1 + z_t1 * s_t1_prev

        # GRU Layer 2
        z_t2 = T.nnet.hard_sigmoid(U[3].dot(s_t1) + W[3].dot(s_t2_prev) + b[3])
        r_t2 = T.nnet.hard_sigmoid(U[4].dot(s_t1) + W[4].dot(s_t2_prev) + b[4])
        c_t2 = T.tanh(U[5].dot(s_t1) + W[5].dot(s_t2_prev * r_t2) + b[5])
        s_t2 = (T.ones_like(z_t2) - z_t2) * c_t2 + z_t2 * s_t2_prev

        # Final output calculation
        # Theano's softmax returns a matrix with one row, we only need the row
        o_t = T.nnet.softmax(V.dot(s_t2) + c)[0]

        return [o_t, s_t1, s_t2]

我使用 scan 调用这个函数:

[o, s, s2], updates = theano.scan(
            forward_prop_step,
            sequences=x,
            truncate_gradient=self.bptt_truncate,
            outputs_info=[None, 
                          dict(initial=T.zeros(self.hidden_dim)),
dict(initial=T.zeros(self.hidden_dim))])

我试图在 tensorflow 中重写相同的函数:

def forward_prop_step(x_t, s_t1_prev, s_t2_prev):
     # Word embedding layer
     x_e = E[:, x_t]

     # GRU Layer 1
     z_t1 = tf.sigmoid(tf.reduce_sum(U[0] * x_e, axis=1) + tf.reduce_sum(W[0] * s_t1_prev, axis=1) + b[0])
     r_t1 = tf.sigmoid(tf.reduce_sum(U[1] * x_e, axis=1) + tf.reduce_sum(W[1] * s_t1_prev, axis=1) + b[1])
     c_t1 = tf.tanh(tf.reduce_sum(U[2] * x_e, axis=1) + tf.reduce_sum(W[2] * (s_t1_prev * r_t1), axis=1) + b[2])
     s_t1 = (tf.ones_like(z_t1) - z_t1) * c_t1 + z_t1 * s_t1_prev

     # GRU Layer 2
     z_t2 = tf.sigmoid(tf.reduce_sum(U[3] * s_t1, axis=1) + tf.reduce_sum(W[3] * s_t2_prev, axis=1) + b[3])
     r_t2 = tf.sigmoid(tf.reduce_sum(U[4] * s_t1, axis=1) + tf.reduce_sum(W[4] * s_t2_prev) + b[1])
     c_t2 = tf.tanh(tf.reduce_sum(U[5] * s_t1, axis=1) + tf.reduce_sum(W[5] * (s_t2_prev * r_t2), axis=1) + b[5])
     s_t2 = (tf.ones_like(z_t2) - z_t2) * c_t2 + z_t2 * s_t2_prev

     # Final output calculation
     o_t = tf.softmax(tf.reduce_sum(V * s_t2, axis=1) + c)[0]

     return [o_t, s_t1, s_t2]

我使用 scan 调用了这个函数:

s = tf.zeros([self.hidden_dim, 0])
s2 = tf.zeros([self.hidden_dim, 0])

[o, s, s2] = tf.scan(
     fn=forward_prop_step,
     elems=[x, s, s2])

我没有使用初始化程序,而是在扫描之前初始化了 s 和 s2 变量。当我在 tensorflow 中运行我的代码时,出现以下错误:

类型错误:forward_prop_step() 正好需要 3 个参数(给定 2 个)

我确信唯一的问题不是上面的错误。如何通过引用 theano 代码来重写 tensorflow 中的扫描功能?

彼得霍金斯

如果要将多个元素传递给tf.scan(),则需要将它们包装在列表或元组中。以下是如何执行此操作的示例:

def f(x, ys):
  (y1, y2) = ys
  return x + y1 * y2

a = tf.constant([1, 2, 3, 4, 5])
b = tf.constant([2, 3, 2, 2, 1])
c = tf.scan(f, (a, b), initializer=0)
with tf.Session() as sess:
  print(sess.run(c))

打印:

[ 2  8 14 22 27]

我希望这有帮助!

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Theano中的熵和概率

来自分类Dev

Google的TensorFlow中的Theano Dimshuffle等效吗?

来自分类Dev

Theano循环中的错误:扫描中Outputs_info调暗和fn输出调暗不匹配

来自分类Dev

Theano扫描功能

来自分类Dev

Theano 和 pygpu:错误

来自分类Dev

在theano中遇到softmax和交叉熵的错误

来自分类Dev

如何在Windows的Anaconda Python中安装Keras和Theano?

来自分类Dev

在theano中遇到softmax和交叉熵的错误

来自分类Dev

TensorFlow或Theano:他们如何基于神经网络图知道损失函数导数?

来自分类Dev

Theano函数中的索引体操

来自分类Dev

Theano:将扫描的迭代索引传递给被调用的函数

来自分类Dev

theano的扫描功能是如何工作的?

来自分类Dev

theano函数的可选参数

来自分类Dev

Tensorflow,相当于Theano的pydotprint?

来自分类Dev

Tensorflow中等效的Theano.function

来自分类Dev

Tensorflow中等效的Theano.function

来自分类Dev

Tensorflow相当于Theano的dimshuffle

来自分类Dev

在theano中没有序列扫描?(模拟range())

来自分类Dev

在 Tensorflow 中压缩和重塑

来自分类Dev

我想将一个函数映射到Theano中向量的每个元素,我可以不使用扫描而做到吗?

来自分类Dev

Theano中的GRU实施

来自分类Dev

Theano中的索引

来自分类Dev

Theano中的类型列表

来自分类Dev

Theano中的循环相关

来自分类Dev

numpy中的Theano开关

来自分类Dev

theano中的线性回归

来自分类Dev

Theano中的类型列表

来自分类Dev

Theano中的索引

来自分类Dev

Theano中的AttributeError