在 Tensorflow 中将 3 阶张量与 2 阶张量相乘

Yel*_*low 5 tensorflow

给定一个 3 级张量:

sentence_max_length = 5
batch_size = 3
n_hidden = 10
n_classes = 2
x = tf.constant(np.reshape(np.arange(150),(batch_size,sentence_max_length, n_hidden)), dtype = tf.float32)
Run Code Online (Sandbox Code Playgroud)

和一个 2 级张量:

W = tf.constant(np.reshape(np.arange(20), (n_hidden, n_classes)), dtype = tf.float32)
Run Code Online (Sandbox Code Playgroud)

和一个 1 级偏置张量:

b = tf.constant(np.reshape(np.arange(5), (n_classes), dtype = tf.float32))
Run Code Online (Sandbox Code Playgroud)

我不知道怎么一会的最后两轴xW这样得到的载体Z将是形状的(batch_size, max_length, n_classes),虽然会batch_size时不能图创建过程中我刚刚给它这里值演示知

所以要澄清:

Z[0] = tf.matmul(x[0,:,:], W) + b

这样Wb在所有批次之间共享。这样做的原因是我试图使用outputoftf.dynamic_rnn从而输出的形状(batch_size, sentence_max_length, n_hidden)并在其上构建另一层output共享权重Wb.

小智 1

一种方法可能是......

import tensorflow as tf
import numpy as np
from tensorflow.python.layers.core import Dense

sentence_max_length = 5
batch_size = 3
n_hidden = 10
n_classes = 2
x = tf.constant(np.reshape(np.arange(150),(batch_size,sentence_max_length, n_hidden)), dtype = tf.float32)

linear_layer = Dense(n_classes, use_bias=True) #required projection value
z = linear_layer(x)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    res = sess.run(z)

res.shape
(3, 5, 2)
Run Code Online (Sandbox Code Playgroud)

在内部,密集层创建可训练的 W 和 b 变量。并且,它使用 standard_ops.tensordot 操作将最后一个维度转换为投影值。有关更多详细信息,请参阅此处的源代码。