def write(self, x, access_logits):
    """Write to the memory based on a combination of similarity and least used.

    Based on arXiv:1607.00036v2 [cs.LG].

    Args:
      x: a tensor in the shape of [batch_size, length, depth].
      access_logits: the logits for accessing the memory.
    Returns:
      the update op.
    """
    gamma = tf.layers.dense(x, 1, activation=tf.sigmoid, name="gamma")
    write_logits = access_logits - gamma * tf.expand_dims(self.mean_logits, 1)
    candidate_value = tf.layers.dense(x, self.val_depth,
                                      activation=tf.nn.relu,
                                      name="candidate_value")
    erase_gates = tf.layers.dense(x, self.memory_size,
                                  activation=tf.nn.sigmoid,
                                  name="erase")
    write_weights = tf.nn.softmax(write_logits)
    erase_weights = tf.expand_dims(1 - erase_gates * write_weights, 3)
    erase = tf.multiply(erase_weights,
                        tf.expand_dims(self.mem_vals, 1))
    addition = tf.multiply(
        tf.expand_dims(write_weights, 3),
        tf.expand_dims(candidate_value, 2))
    update_value_op = self.mem_vals.assign(
        tf.reduce_mean(erase + addition, axis=1))
    with tf.control_dependencies([update_value_op]):
      write_op = self.mean_logits.assign(
          self.mean_logits * 0.1 + tf.reduce_mean(write_logits * 0.9, axis=1))
      return write_op
def write ( self , x , access_logits ) : gamma = tf . layers . dense ( x , 1 , activation = tf . sigmoid , name = "gamma" ) write_logits = access_logits - gamma * tf . expand_dims ( self . mean_logits , 1 ) candidate_value = tf . layers . dense ( x , self . val_depth , activation = tf . nn . relu , name = "candidate_value" ) erase_gates = tf . layers . dense ( x , self . memory_size , activation = tf . nn . sigmoid , name = "erase" ) write_weights = tf . nn . softmax ( write_logits ) erase_weights = tf . expand_dims ( 1 - erase_gates * write_weights , 3 ) erase = tf . multiply ( erase_weights , tf . expand_dims ( self . mem_vals , 1 ) ) addition = tf . multiply ( tf . expand_dims ( write_weights , 3 ) , tf . expand_dims ( candidate_value , 2 ) ) update_value_op = self . mem_vals . assign ( tf . reduce_mean ( erase + addition , axis = 1 ) ) with tf . control_dependencies ( [ update_value_op ] ) : write_op = self . mean_logits . assign ( self . mean_logits * 0.1 + tf . reduce_mean ( write_logits * 0.9 , axis = 1 ) ) return write_op
Write to the memory based on a combination of similarity and least used.

    Based on arXiv:1607.00036v2 [cs.LG].

    Args:
      x: a tensor in the shape of [batch_size, length, depth].
      access_logits: the logits for accessing the memory.
    Returns:
      the update op.