【发布时间】:2021-03-14 16:11:59
【问题描述】:
我有一个关于 Tensorflow 如何定义其线性层的快速(可能是愚蠢的)问题。在 PyTorch 中,线性(或密集)层定义为 y = x A^T + b,其中 A 和 b 是线性层的权重矩阵和偏置向量(请参阅here)。
但是,我无法准确找到 Tensorflow 的等效方程!它和 PyTorch 一样还是只是 y = x A + b ?
提前谢谢你!
【问题讨论】:
标签: tensorflow pytorch
我有一个关于 Tensorflow 如何定义其线性层的快速(可能是愚蠢的)问题。在 PyTorch 中,线性(或密集)层定义为 y = x A^T + b,其中 A 和 b 是线性层的权重矩阵和偏置向量(请参阅here)。
但是,我无法准确找到 Tensorflow 的等效方程!它和 PyTorch 一样还是只是 y = x A + b ?
提前谢谢你!
【问题讨论】:
标签: tensorflow pytorch
如果我们在keras API 的密集层中将激活设置为None,那么它们在技术上是等效的。
Tensorflow 的
tf.keras.layers.Dense(..., activation=None)
activation:要使用的激活函数。如果您不指定任何内容,则不会应用任何激活(即“线性”激活:a(x) = x)。
在 PyTorch 的 src 中。
torch.nn.Linear
此时它们是相等的。对传入数据的线性变换:y = x*W^T + b。请参阅下面这两者的更具体的等效实现。在PyTorch,我们这样做
class Network(torch.nn.Module):
def __init__(self):
super(Network, self).__init__()
self.fc1 = torch.nn.Linear(5, 30)
def forward(self, state):
return self.fc1(state)
或者,
trd = torch.nn.Linear(in_features = 3, out_features = 30)
y = trd(torch.ones(5, 3))
print(y.size())
# torch.Size([5, 30])
其等效的tf 实现将是
model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Dense(30, input_shape=(5,), activation=None))
或者,
tfd = tf.keras.layers.Dense(30, input_shape=(3,), activation=None)
x = tfd(tf.ones(shape=(5, 3)))
print(x.shape)
# (5, 30)
【讨论】:
tf.keras.layers.Dense在tensorflow源码中定义在这里:
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/keras/layers/core.py#L1081
如果您遵循其call 函数中的引用,它会引导您找到此处使用的操作的定义,这确实是输入和权重的矩阵乘法加上预期的偏置向量:
outputs = gen_math_ops.MatMul(a=inputs, b=kernel)
...
outputs = nn_ops.bias_add(outputs, bias)
【讨论】:
kernel 变量的定义是一个权重矩阵,但与 PyTorch 的权重矩阵的维度相反?因此,假设我有批量大小为 N 的 A 输入特征和 B 输出特征。 kernel 的维度是 [A, B] 而在 PyTorch 的情况下是 [B, A] (因为应用了转置?)
shape=[last_dim, self.units] (N_feats, N_out) 初始化,在 PyTorch (source code link) 中,权重用 @ 初始化987654331@ (N_out, N_feats)