tensorflow 向张量添加 'None' 维度
tensorflow add 'None' dimension to a tensor
我是 tf 的新手,不确定我的术语是否适合标题。基本上我看到了一个示例代码,如下所示,它转置张量并将其乘以权重矩阵。
embed_dim = xl.shape[-1]
w=tf.Variable(tf.random.truncated_normal(shape=(embed_dim,), stddev=0.01)) #(221)
x1_transpose = tf.reshape(xl, [-1, 1, embed_dim]) #(None, 1, 221)
x_lw = tf.tensordot(x1_transpose, w, axes=1) #(None, 1)
我想知道我是否可以使用 tf.linalg.matmul
函数和 tf.linalg.matmul(xl, w, transpose_a=True, transpose_b=False)
之类的东西来实现相同的目的。我觉得这里我需要转换或创建形状 TensorShape([221, None])
的 w
,但不确定如何
xl.shape
>> TensorShape([None, 221])
w=tf.Variable(tf.random.truncated_normal(shape=(embed_dim,), stddev=0.01))
>> TensorShape([221])
如果你遇到这样的事情:
import tensorflow as tf
tf.random.set_seed(123)
xl = tf.keras.layers.Input((221,))
embed_dim = xl.shape[-1]
w=tf.Variable(tf.random.truncated_normal(shape=(embed_dim,), stddev=0.01)) #(221)
x1_transpose = tf.reshape(xl, [-1, 1, embed_dim])
x_lw = tf.tensordot(x1_transpose, w, axes=1)
model = tf.keras.Model(xl, x_lw)
example = tf.random.normal((2, 221))
print(model(example))
tf.Tensor(
[[-0.0661035 ]
[ 0.15439653]], shape=(2, 1), dtype=float32)
那么使用 tf.linalg.matmul
的等价物将是这样的:
import tensorflow as tf
tf.random.set_seed(123)
xl = tf.keras.layers.Input((221,))
embed_dim = xl.shape[-1]
w=tf.Variable(tf.random.truncated_normal(shape=(embed_dim,), stddev=0.01)) #(221)
xl_expanded = tf.expand_dims(xl, axis=1)
w = tf.expand_dims(w, axis=1)
x_lw = tf.squeeze(tf.linalg.matmul(xl_expanded, w, transpose_a=False, transpose_b=False), axis=1)
model = tf.keras.Model(xl, x_lw)
example = tf.random.normal((2, 221))
print(model(example)
tf.Tensor(
[[-0.0661035]
[ 0.1543966]], shape=(2, 1), dtype=float32)
有趣的是,这两种方法之间似乎存在细微的舍入差异。使用 xl_expanded @ w
也会产生与 tf.linalg.matmul
相同的结果。一般来说,您应该能够为您的用例使用任一方法:
a = tf.constant([1, 2, 3, 4, 5, 6], shape=[2, 3], dtype=tf.float32)
b = tf.constant([7, 8, 9, 10, 11, 12], shape=[3, 2], dtype=tf.float32)
option1 = tf.tensordot(a, b, axes=1)
option2 = tf.linalg.matmul(a, b)
print(option1)
print(option2)
tf.Tensor(
[[ 58. 64.]
[139. 154.]], shape=(2, 2), dtype=float32)
tf.Tensor(
[[ 58. 64.]
[139. 154.]], shape=(2, 2), dtype=float32)
我是 tf 的新手,不确定我的术语是否适合标题。基本上我看到了一个示例代码,如下所示,它转置张量并将其乘以权重矩阵。
embed_dim = xl.shape[-1]
w=tf.Variable(tf.random.truncated_normal(shape=(embed_dim,), stddev=0.01)) #(221)
x1_transpose = tf.reshape(xl, [-1, 1, embed_dim]) #(None, 1, 221)
x_lw = tf.tensordot(x1_transpose, w, axes=1) #(None, 1)
我想知道我是否可以使用 tf.linalg.matmul
函数和 tf.linalg.matmul(xl, w, transpose_a=True, transpose_b=False)
之类的东西来实现相同的目的。我觉得这里我需要转换或创建形状 TensorShape([221, None])
的 w
,但不确定如何
xl.shape
>> TensorShape([None, 221])
w=tf.Variable(tf.random.truncated_normal(shape=(embed_dim,), stddev=0.01))
>> TensorShape([221])
如果你遇到这样的事情:
import tensorflow as tf
tf.random.set_seed(123)
xl = tf.keras.layers.Input((221,))
embed_dim = xl.shape[-1]
w=tf.Variable(tf.random.truncated_normal(shape=(embed_dim,), stddev=0.01)) #(221)
x1_transpose = tf.reshape(xl, [-1, 1, embed_dim])
x_lw = tf.tensordot(x1_transpose, w, axes=1)
model = tf.keras.Model(xl, x_lw)
example = tf.random.normal((2, 221))
print(model(example))
tf.Tensor(
[[-0.0661035 ]
[ 0.15439653]], shape=(2, 1), dtype=float32)
那么使用 tf.linalg.matmul
的等价物将是这样的:
import tensorflow as tf
tf.random.set_seed(123)
xl = tf.keras.layers.Input((221,))
embed_dim = xl.shape[-1]
w=tf.Variable(tf.random.truncated_normal(shape=(embed_dim,), stddev=0.01)) #(221)
xl_expanded = tf.expand_dims(xl, axis=1)
w = tf.expand_dims(w, axis=1)
x_lw = tf.squeeze(tf.linalg.matmul(xl_expanded, w, transpose_a=False, transpose_b=False), axis=1)
model = tf.keras.Model(xl, x_lw)
example = tf.random.normal((2, 221))
print(model(example)
tf.Tensor(
[[-0.0661035]
[ 0.1543966]], shape=(2, 1), dtype=float32)
有趣的是,这两种方法之间似乎存在细微的舍入差异。使用 xl_expanded @ w
也会产生与 tf.linalg.matmul
相同的结果。一般来说,您应该能够为您的用例使用任一方法:
a = tf.constant([1, 2, 3, 4, 5, 6], shape=[2, 3], dtype=tf.float32)
b = tf.constant([7, 8, 9, 10, 11, 12], shape=[3, 2], dtype=tf.float32)
option1 = tf.tensordot(a, b, axes=1)
option2 = tf.linalg.matmul(a, b)
print(option1)
print(option2)
tf.Tensor(
[[ 58. 64.]
[139. 154.]], shape=(2, 2), dtype=float32)
tf.Tensor(
[[ 58. 64.]
[139. 154.]], shape=(2, 2), dtype=float32)