Python 如何在优化器中获得偏差和神经元权重?

Python 如何在优化器中获得偏差和神经元权重?,python,tensorflow,Python,Tensorflow,在TensorFlow优化器(python)中,apply_dense方法确实会被调用用于神经元权重(层连接)和偏差权重,但我想在该方法中同时使用这两种方法 def _apply_dense(self, grad, weight): ... 例如:一个完全连接的神经网络,有两个隐藏层,每个隐藏层有两个神经元,每个神经元有一个偏差 如果我们看一看第2层,我们会调用神经元权重: 以及对偏差权重的要求: 但我要么在一次调用apply\u dense中同时使用这两个矩阵,要么使用如下权重

在TensorFlow优化器(python)中,
apply_dense
方法确实会被调用用于神经元权重(层连接)和偏差权重,但我想在该方法中同时使用这两种方法

def _apply_dense(self, grad, weight):
    ...
例如:一个完全连接的神经网络,有两个隐藏层,每个隐藏层有两个神经元,每个神经元有一个偏差

如果我们看一看第2层,我们会调用神经元权重:

以及对偏差权重的要求:

但我要么在一次调用
apply\u dense
中同时使用这两个矩阵,要么使用如下权重矩阵:

X_2X_4,B_1X_4。。。只是两个神经元之间连接的重量的一个符号。因此,B_1X_4只是B_1和X_4之间权重的占位符

如何做到这一点

MWE

这里的一个最小工作示例是一个带有动量的随机梯度下降优化器实现。对于每一层,来自其他神经元的所有传入连接的动量都减小到平均值(见ndims==2)。我需要的不仅是来自传入神经元连接的动量值的平均值,而且是来自传入偏压连接的动量值的平均值(如上所述)

对于一个简单的神经网络:(仅将优化器更改为自定义SGDmomentum优化器)

更新:现在我对您的目标有了一些了解,我将尝试给出一个更好的答案(或至少一些想法),但是,正如您在评论中所建议的,在TensorFlow中可能没有绝对正确的方法

由于TF是一个通用的计算框架,因此没有很好的方法来确定模型中有哪些权重和偏差对(或者它是否是一个神经网络)。以下是我能想到的一些解决问题的可能方法:

  • 注释张量。这可能是不实际的,因为您已经说过您无法控制模型,但一个简单的选择是向张量添加额外属性以表示权重/偏差关系。例如,您可以执行类似于
    W.bias=B
    B.weight=W
    的操作,然后在
    \u-apply\u-dense
    中检查
    hasattr(weight,“bias”)
    hasattr(weight,“weight”)
    (在这个意义上可能有更好的设计)
  • 您可以查看一些构建在TensorFlow之上的框架,在这些框架中,您可能有关于模型结构的更好信息。例如,是一个基于层的框架,它实现了自己的(基于TensorFlow或Theano)。我对代码或其可扩展性不太熟悉,但您可能有更多的工具可供使用
  • 从优化器中自己检测网络的结构。这相当复杂,但理论上是可能的。从传递给优化器的损失张量中,应该可以在模型图中“爬升”到其所有节点(取张量的
    .op
    和ops的
    .inputs
    )。您可以检测变量的张量乘法和加法,并跳过其他一切(激活、损失计算等),以确定网络的结构;如果模型与您的期望不匹配(例如,没有乘法或没有后续加法的乘法),您可以引发异常,指示您的优化器不能用于该模型

旧答案,为了保留而保留。

我不是100%清楚你想做什么,所以我不确定这是否真的回答了你的问题

假设有一个密集层,将大小为M的输入转换为大小为N的输出。根据你展示的惯例,你将有一个N×M的权重矩阵W和一个大小为N的偏置向量B。然后,大小为M的输入向量X(或一批大小为M×K的输入)将由该层处理为W·X+B,然后应用激活功能(在批处理的情况下,添加将是“广播”操作)。在TensorFlow中:

X = ...  # Input batch of size M x K
W = ...  # Weights of size N x M
B = ...  # Biases of size N

Y = tf.matmul(W, X) + B[:, tf.newaxis]  # Output of size N x K
# Activation...
X = ...  # Input batch of size M x K
W_star = ...  # Extended weights of size (N + 1) x M
# You can still have a "view" of the original W and B if you need it
W = W_star[:N]
B = W_star[-1]

X_star = tf.concat([X, tf.ones_like(X[:1])], axis=0)
Y = tf.matmul(W_star, X_star)  # Output of size N x K
# Activation...
如果你愿意,你可以把W和B放在一个扩展的权重矩阵W*中,基本上把B作为一个新行加在W中,所以W*将是(N+1)×M。然后你只需要在输入向量X中添加一个新元素,其中包含一个常数1(或者如果它是一个批次,则是一个新行),这样你就可以得到大小为N+1(或者(N+1)×K的X*。然后,产品W*·X*将给出与之前相同的结果。在TensorFlow中:

X = ...  # Input batch of size M x K
W = ...  # Weights of size N x M
B = ...  # Biases of size N

Y = tf.matmul(W, X) + B[:, tf.newaxis]  # Output of size N x K
# Activation...
X = ...  # Input batch of size M x K
W_star = ...  # Extended weights of size (N + 1) x M
# You can still have a "view" of the original W and B if you need it
W = W_star[:N]
B = W_star[-1]

X_star = tf.concat([X, tf.ones_like(X[:1])], axis=0)
Y = tf.matmul(W_star, X_star)  # Output of size N x K
# Activation...

现在,您可以一起计算权重和偏移的渐变和更新。这种方法的一个缺点是,如果你想应用正则化,那么你应该小心地只对矩阵的权重部分应用正则化,而不是对偏差应用正则化。

你需要更加明确。你打什么电话?你能给我们一个简单的工作示例吗?我正在实现一个优化器。我已经添加了这样一个优化器的MWE,并在我的问题中描述了需求是什么。我想我不明白你在问什么。你是在问如何在你的网络中获取权重吗?@RyanStout:不是。我正在编写一个优化器,希望同时访问优化器的apply_dense方法中的神经元和偏差权重。你是说,_apply_dense会被调用两次,一次是将权重矩阵传递到名为“weight”的参数中一旦偏差向量被传递到称为“权重”的参数中?我想我也不明白为什么你的问题中有权重=[[B_1*X_4],[B_2*X_5]。谢谢你尝试给出我问题的答案。很遗憾,你是对的,这不是我问题的实际答案。我试图解决的问题是,从优化器的角度来看,我无法控制网络的外观。所以给定Y=tf.matmul(W,X)+B,我仍然希望在apply_的一个调用中使用W和B。我的问题的答案只能来自优化器的角度,而不能像您的答案那样来自外部。限制是I c