【发布时间】:2017-12-14 09:42:04
【问题描述】:
在 TensorFlow 优化器 (python) 中,方法 apply_dense 确实会为神经元权重(层连接)和偏置权重调用,但我想在此方法中同时使用这两种方法。
def _apply_dense(self, grad, weight):
...
例如:一个全连接的神经网络,有两个隐藏层和两个神经元,每个神经元都有一个偏差。
如果我们看一下第 2 层,我们会在 apply_dense 中调用神经元权重:
并呼吁偏置权重:
但我要么在一次调用 apply_dense 时需要两个矩阵,要么需要这样的权重矩阵:
X_2X_4, B_1X_4, ... 只是两个神经元之间连接权重的符号。因此 B_1X_4 只是 B_1 和 X_4 之间权重的占位符。
如何做到这一点?
MWE
这里有一个最小的工作示例,一个带有动量的随机梯度下降优化器实现。对于每一层,来自其他神经元的所有传入连接的动量都减少到平均值(参见 ndims == 2)。相反,我需要的是不仅来自传入神经元连接的动量值的平均值,还包括来自传入偏置连接的动量值(如上所述)。
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import tensorflow as tf
from tensorflow.python.training import optimizer
class SGDmomentum(optimizer.Optimizer):
def __init__(self, learning_rate=0.001, mu=0.9, use_locking=False, name="SGDmomentum"):
super(SGDmomentum, self).__init__(use_locking, name)
self._lr = learning_rate
self._mu = mu
self._lr_t = None
self._mu_t = None
def _create_slots(self, var_list):
for v in var_list:
self._zeros_slot(v, "a", self._name)
def _apply_dense(self, grad, weight):
learning_rate_t = tf.cast(self._lr_t, weight.dtype.base_dtype)
mu_t = tf.cast(self._mu_t, weight.dtype.base_dtype)
momentum = self.get_slot(weight, "a")
if momentum.get_shape().ndims == 2: # neuron weights
momentum_mean = tf.reduce_mean(momentum, axis=1, keep_dims=True)
elif momentum.get_shape().ndims == 1: # bias weights
momentum_mean = momentum
else:
momentum_mean = momentum
momentum_update = grad + (mu_t * momentum_mean)
momentum_t = tf.assign(momentum, momentum_update, use_locking=self._use_locking)
weight_update = learning_rate_t * momentum_t
weight_t = tf.assign_sub(weight, weight_update, use_locking=self._use_locking)
return tf.group(*[weight_t, momentum_t])
def _prepare(self):
self._lr_t = tf.convert_to_tensor(self._lr, name="learning_rate")
self._mu_t = tf.convert_to_tensor(self._mu, name="momentum_term")
对于简单的神经网络:https://raw.githubusercontent.com/aymericdamien/TensorFlow-Examples/master/examples/3_NeuralNetworks/multilayer_perceptron.py(只需将优化器更改为自定义 SGDmomentum 优化器)
【问题讨论】:
-
您需要更加明确。你叫什么方法?你能给我们一个最小的工作示例吗?
-
我正在实现一个优化器。我已经添加了这样一个优化器的 MWE,并根据我的问题描述了需求。
-
我不明白你在问什么。您是在问如何获得网络中的权重?
-
@RyanStout:不。我正在编写一个优化器,并希望同时访问优化器的 apply_dense 方法中的神经元和偏置权重。
-
你是说 _apply_dense 被调用了两次,一次是将权重矩阵传递给名为“weight”的参数,一次将偏置向量传递给名为“weight”的参数?我想我也没有理解为什么你的问题中有 weights=[[B_1*X_4],[B_2*X_5]]。
标签: python tensorflow