',tensorflow,keras,optimization,tensorflow2.0,adam"/>

首页 > 解决方案 > 自定义优化器错误--> 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'>'

标签: tensorflowkerasoptimizationtensorflow2.0adam

解决方案


推荐阅读