tensorflow - 自定义优化器错误--> TypeError: Expected tf.group() expected Tensor arguments not 'None' with type ''
问题描述
我已经实现了一个累积梯度优化器,但是当我想训练模型时它给了我这个错误。那么问题是什么?梯度累积背后的想法是,它在每个 mini-batch 之后计算损失和梯度,但不是更新模型参数,而是等待并累积连续批次的梯度。然后最终根据指定批次数后的累积梯度更新参数。它的目的与拥有更多图像的小批量相同。
class AccumAdamOptimizer(keras.optimizers.Optimizer):
def __init__(self,learning_rate=0.001,steps=1,beta_1=0.9,beta_2=0.999,epsilon=1e-
7,amsgrad=False,name='AccumAdamOptimizer',**kwargs):
super(AccumAdamOptimizer, self).__init__(name, **kwargs)
self._set_hyper('learning_rate', kwargs.get('lr', learning_rate))
self._set_hyper('decay', self._initial_decay)
self._set_hyper('beta_1', beta_1)
self._set_hyper('beta_2', beta_2)
self.epsilon = epsilon
self.amsgrad = amsgrad
self.iterations = tf.Variable(1, dtype='int64', name='iterations')
self.steps = steps
self.condition = tf.math.equal(self.iterations % self.steps , 0)
def _create_slots(self, var_list):
for var in var_list:
self.add_slot(var, 'm')
for var in var_list:
self.add_slot(var, 'v')
# if self.amsgrad:
# for var in var_list:
# self.add_slot(var, 'vhat')
for var in var_list:
self.add_slot(var, "ag") #accumulated gradient
def _resource_apply_dense(self, grad, var, apply_state=None):
var_device, var_dtype = var.device, var.dtype.base_dtype
m = self.get_slot(var, 'm')
v = self.get_slot(var, 'v')
ag = self.get_slot(var, 'ag')
lr=self._get_hyper('learning_rate', var_dtype)
beta1= self._get_hyper('beta_1', var_dtype)
beta2=self._get_hyper('beta_2', var_dtype)
t = tf.cast(self.iterations, tf.float32)
beta1_power=tf.math.pow(beta1, t )
beta2_power=tf.math.pow(beta2, t)
if self.condition:
new_m = beta1 * m + (1-beta1) * ag
new_v = beta2 * v + (1-beta2) * tf.math.square(ag)
m_corrected = new_m/(1-beta1_power)
v_corrected = new_v/(1-beta2_power)
new_var = var - lr * m_corrected/(tf.math.sqrt(v_corrected)+self.epsilon))
var.assign(new_var) # update weights
shape_var = tf.shape(var)
ag.assign(tf.zeros(shape_var, dtype=var.dtype))
m.assign(m_corrected)
v.assign(v_corrected)
self.iterations.assign_add(1)
else:
ag.assign_add(grad)
self.iterations.assign_add(1)
def _resource_apply_sparse(self, grad, var):
raise NotImplementedError
def get_config(self):
config = super(AccumAdamOptimizer, self).get_config()
config.update({
'learning_rate': self._serialize_hyperparameter('learning_rate'),
'decay': self._initial_decay,
'beta_1': self._serialize_hyperparameter('beta_1'),
'beta_2': self._serialize_hyperparameter('beta_2'),
'epsilon': self.epsilon,
'amsgrad': self.amsgrad,
})
return config
这是我的完整错误:TypeError:在用户代码中:
/usr/local/lib/python3.7/dist-packages/keras/engine/training.py:830 train_function *
return step_function(self, iterator)
/usr/local/lib/python3.7/dist-packages/keras/engine/training.py:813 run_step *
outputs = model.train_step(data)
/usr/local/lib/python3.7/dist-packages/keras/engine/training.py:774 train_step *
self.optimizer.minimize(loss, self.trainable_variables, tape=tape)
/usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/optimizer_v2/optimizer_v2.py:530 minimize **
return self.apply_gradients(grads_and_vars, name=name)
/usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/optimizer_v2/optimizer_v2.py:668 apply_gradients
apply_state)
/usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/optimizer_v2/optimizer_v2.py:732 _distributed_apply
with ops.control_dependencies([control_flow_ops.group(update_ops)]):
/usr/local/lib/python3.7/dist-packages/tensorflow/python/ops/control_flow_ops.py:2966 group
"'%s' with type '%s'" % (inp, type(inp)))
TypeError: Expected tf.group() expected Tensor arguments not 'None' with type '<class 'NoneType'>'
解决方案
推荐阅读
- javascript - 无法读取 reactjs 中未定义的属性“包含”?
- c++ - 找到与给定数互质的第 n 个数的算法(包含 - 排除原则)
- javascript - 动态字段的表单验证不在循环中工作
- php - 在一个查询中包含“AND”和“OR”的 Laravel MySQL 查询
- python - 我得到 ImportError:没有名为 pathlib 的模块,即使在使用 pip 安装 pathlib 之后也是如此
- javascript - 在场景中看不到简单的几何图形
- c - CS50 凯撒分段错误
- javascript - Angular 9 使用递归组件,新组件有旧输入
- mongodb - 在使用 MongoDB 获取每个字段的最后一个文档时对字段进行分组
- angular - 使用 ng select 时,收到有关“defineInjectable”的警告