Exemplo n.º 1
0
def softmax_classifier(tensor_in,
                       labels,
                       weights,
                       biases,
                       class_weight=None,
                       name=None):
  """Returns prediction and loss for softmax classifier.

  This function returns "probabilities" and a cross entropy loss. To obtain
  predictions, use `tf.argmax` on the returned probabilities.

  This function requires labels to be passed in one-hot encoding.

  Args:
    tensor_in: Input tensor, [batch_size, feature_size], features.
    labels: Tensor, [batch_size, n_classes], one-hot labels of the output
      classes.
    weights: Tensor, [batch_size, feature_size], linear transformation
      matrix.
    biases: Tensor, [batch_size], biases.
    class_weight: Tensor, optional, [n_classes], weight for each class.
      If not given, all classes are supposed to have weight one.
    name: Operation name.

  Returns:
    `tuple` of softmax predictions and loss `Tensor`s.
  """
  with ops.name_scope(name, 'softmax_classifier', [tensor_in, labels]):
    logits = nn.xw_plus_b(tensor_in, weights, biases)
    if class_weight is not None:
      logits = math_ops.multiply(logits, class_weight)
    return nn.softmax(logits), losses.softmax_cross_entropy(labels, logits)
Exemplo n.º 2
0
def softmax_classifier(tensor_in,
                       labels,
                       weights,
                       biases,
                       class_weight=None,
                       name=None):
    """Returns prediction and loss for softmax classifier.

  This function returns "probabilities" and a cross entropy loss. To obtain
  predictions, use `tf.argmax` on the returned probabilities.

  This function requires labels to be passed in one-hot encoding.

  Args:
    tensor_in: Input tensor, [batch_size, feature_size], features.
    labels: Tensor, [batch_size, n_classes], one-hot labels of the output
      classes.
    weights: Tensor, [batch_size, feature_size], linear transformation
      matrix.
    biases: Tensor, [batch_size], biases.
    class_weight: Tensor, optional, [n_classes], weight for each class.
      If not given, all classes are supposed to have weight one.
    name: Operation name.

  Returns:
    `tuple` of softmax predictions and loss `Tensor`s.
  """
    with ops.name_scope(name, 'softmax_classifier', [tensor_in, labels]):
        logits = nn.xw_plus_b(tensor_in, weights, biases)
        if class_weight is not None:
            logits = math_ops.multiply(logits, class_weight)
        return nn.softmax(logits), losses.softmax_cross_entropy(labels, logits)
Exemplo n.º 3
0
 def loop_fn(i):
   image = array_ops.gather(images, i)
   label = array_ops.gather(labels, i)
   logits = array_ops.reshape(model(image, training=training), [-1])
   loss = losses.softmax_cross_entropy(
       logits=logits, onehot_labels=label, reduction=losses.Reduction.NONE)
   return gradient_ops.gradients(loss, variables.trainable_variables())
Exemplo n.º 4
0
  def testRNNWithKerasGRUCell(self):
    with self.cached_session() as sess:
      input_shape = 10
      output_shape = 5
      timestep = 4
      batch = 100
      (x_train, y_train), _ = testing_utils.get_test_data(
          train_samples=batch,
          test_samples=0,
          input_shape=(timestep, input_shape),
          num_classes=output_shape)
      y_train = keras.utils.to_categorical(y_train)
      cell = keras.layers.GRUCell(output_shape)

      inputs = array_ops.placeholder(
          dtypes.float32, shape=(None, timestep, input_shape))
      predict = array_ops.placeholder(
          dtypes.float32, shape=(None, output_shape))

      outputs, state = rnn.dynamic_rnn(
          cell, inputs, dtype=dtypes.float32)
      self.assertEqual(outputs.shape.as_list(), [None, timestep, output_shape])
      self.assertEqual(state.shape.as_list(), [None, output_shape])
      loss = losses.softmax_cross_entropy(predict, state)
      train_op = training.GradientDescentOptimizer(0.001).minimize(loss)

      sess.run([variables_lib.global_variables_initializer()])
      _, outputs, state = sess.run(
          [train_op, outputs, state], {inputs: x_train, predict: y_train})

      self.assertEqual(len(outputs), batch)
      self.assertEqual(len(state), batch)
Exemplo n.º 5
0
  def testRNNWithKerasGRUCell(self):
    with self.cached_session() as sess:
      input_shape = 10
      output_shape = 5
      timestep = 4
      batch = 100
      (x_train, y_train), _ = testing_utils.get_test_data(
          train_samples=batch,
          test_samples=0,
          input_shape=(timestep, input_shape),
          num_classes=output_shape)
      y_train = keras.utils.to_categorical(y_train)
      cell = keras.layers.GRUCell(output_shape)

      inputs = array_ops.placeholder(
          dtypes.float32, shape=(None, timestep, input_shape))
      predict = array_ops.placeholder(
          dtypes.float32, shape=(None, output_shape))

      outputs, state = rnn.dynamic_rnn(
          cell, inputs, dtype=dtypes.float32)
      self.assertEqual(outputs.shape.as_list(), [None, timestep, output_shape])
      self.assertEqual(state.shape.as_list(), [None, output_shape])
      loss = losses.softmax_cross_entropy(predict, state)
      train_op = training.GradientDescentOptimizer(0.001).minimize(loss)

      sess.run([variables_lib.global_variables_initializer()])
      _, outputs, state = sess.run(
          [train_op, outputs, state], {inputs: x_train, predict: y_train})

      self.assertEqual(len(outputs), batch)
      self.assertEqual(len(state), batch)
Exemplo n.º 6
0
    def test_unifiedLSTM_with_cond(self):
        # This test is to demonstrate the graph rewrite of grappler plugin under
        # the condition that the function returns different number of internal
        # states.
        input_shape = 10
        rnn_state_size = 8
        output_shape = 8
        timestep = 4
        batch = 100
        epoch = 1

        with self.cached_session(config=_config, use_gpu=True) as sess:
            (x_train, y_train), _ = testing_utils.get_test_data(
                train_samples=batch,
                test_samples=0,
                input_shape=(timestep, input_shape),
                num_classes=output_shape)
            y_train = keras.utils.to_categorical(y_train, output_shape)

            layer = keras.layers.UnifiedLSTM(rnn_state_size,
                                             return_runtime=True)

            inputs = array_ops.placeholder(dtypes.float32,
                                           shape=(None, timestep, input_shape),
                                           name='inputs')
            predict = array_ops.placeholder(dtypes.float32,
                                            shape=(None, output_shape),
                                            name='predict')

            zeros = array_ops.zeros([batch, output_shape])
            dummy_runtime = constant_op.constant('unknown',
                                                 dtype=dtypes.string,
                                                 name='runtime')
            a = constant_op.constant(0)
            b = constant_op.constant(1)
            # Will always run the lstm layer.
            outputs, runtime = control_flow_ops.cond(
                gen_math_ops.less(a, b), lambda: layer(inputs), lambda:
                (zeros, dummy_runtime))
            loss = losses.softmax_cross_entropy(predict, outputs)
            optimizer = gradient_descent.GradientDescentOptimizer(0.001)
            train_op = optimizer.minimize(loss)

            sess.run([variables.global_variables_initializer()])
            existing_loss = 0

            for _ in range(epoch):
                loss_value, _, runtime_value = sess.run(
                    [loss, train_op, runtime], {
                        inputs: x_train,
                        predict: y_train
                    })
                if test.is_gpu_available():
                    self.assertEqual(runtime_value, b'cudnn')
                else:
                    self.assertEqual(runtime_value, b'cpu')
                # Make sure the loss is updated for every epoch
                # (layer weights properly updated).
                self.assertNotEqual(existing_loss, loss_value)
                existing_loss = loss_value
Exemplo n.º 7
0
def _softmax_loss(labels,
                  logits,
                  weights=None,
                  lambda_weight=None,
                  reduction=core_losses.Reduction.SUM_BY_NONZERO_WEIGHTS,
                  name=None):
    """Computes the softmax cross entropy for a list.

  Given the labels l_i and the logits s_i, we sort the examples and obtain ranks
  r_i. The standard softmax loss doesn't need r_i and is defined as
      -sum_i l_i * log(exp(s_i) / (exp(s_1) + ... + exp(s_n))).
  The `lambda_weight` re-weight examples based on l_i and r_i.
      -sum_i w(l_i, r_i) * log(exp(s_i) / (exp(s_1) + ... + exp(s_n))).abc
  See 'individual_weights' in 'DCGLambdaWeight' for how w(l_i, r_i) is computed.

  Args:
    labels: A `Tensor` of the same shape as `logits` representing graded
      relevance.
    logits: A `Tensor` with shape [batch_size, list_size]. Each value is the
      ranking score of the corresponding item.
    weights: A scalar, a `Tensor` with shape [batch_size, 1] for list-wise
      weights, or a `Tensor` with shape [batch_size, list_size] for item-wise
      weights.
    lambda_weight: A `DCGLambdaWeight` instance.
    reduction: One of `tf.losses.Reduction` except `NONE`. Describes how to
      reduce training loss over batch.
    name: A string used as the name for this loss.

  Returns:
    An op for the softmax cross entropy as a loss.
  """
    with ops.name_scope(name, 'softmax_loss', (labels, logits, weights)):
        sorted_labels, sorted_logits, sorted_weights = _sort_and_normalize(
            labels, logits, weights)
        is_label_valid = utils.is_label_valid(sorted_labels)
        # Reset the invalid labels to 0 and reset the invalid logits to a logit with
        # ~= 0 contribution in softmax.
        sorted_labels = array_ops.where(is_label_valid, sorted_labels,
                                        array_ops.zeros_like(sorted_labels))
        sorted_logits = array_ops.where(
            is_label_valid, sorted_logits,
            math_ops.log(_EPSILON) * array_ops.ones_like(sorted_logits))
        if lambda_weight is not None and isinstance(lambda_weight,
                                                    DCGLambdaWeight):
            sorted_labels = lambda_weight.individual_weights(sorted_labels)
        sorted_labels *= sorted_weights
        label_sum = math_ops.reduce_sum(sorted_labels, 1, keepdims=True)
        nonzero_mask = math_ops.greater(array_ops.reshape(label_sum, [-1]),
                                        0.0)
        label_sum, sorted_labels, sorted_logits = [
            array_ops.boolean_mask(x, nonzero_mask)
            for x in [label_sum, sorted_labels, sorted_logits]
        ]
        return core_losses.softmax_cross_entropy(sorted_labels / label_sum,
                                                 sorted_logits,
                                                 weights=array_ops.reshape(
                                                     label_sum, [-1]),
                                                 reduction=reduction)
Exemplo n.º 8
0
  def test_unifiedRNN_with_cond(self):
    # This test is to demonstrate the graph rewrite of grappler plugin under
    # the condition that the function returns different number of internal
    # states.
    input_shape = 10
    rnn_state_size = 8
    output_shape = 8
    timestep = 4
    batch = 100
    epoch = 1

    with self.cached_session(config=self.config, use_gpu=True) as sess:
      (x_train, y_train), _ = testing_utils.get_test_data(
          train_samples=batch,
          test_samples=0,
          input_shape=(timestep, input_shape),
          num_classes=output_shape)
      y_train = keras.utils.to_categorical(y_train, output_shape)

      layer = UnifiedLSTM(rnn_state_size)

      inputs = array_ops.placeholder(
          dtypes.float32, shape=(None, timestep, input_shape), name='inputs')
      predict = array_ops.placeholder(
          dtypes.float32, shape=(None, output_shape), name='predict')

      zeros = array_ops.zeros([batch, output_shape])
      dummy_runtime = constant_op.constant(
          'unknown', dtype=dtypes.string, name='runtime')
      a = constant_op.constant(0)
      b = constant_op.constant(1)
      # Will always run the lstm layer.
      outputs, runtime = control_flow_ops.cond(
          gen_math_ops.less(a, b),
          lambda: layer(inputs),
          lambda: (zeros, dummy_runtime))
      loss = losses.softmax_cross_entropy(predict, outputs)
      optimizer = gradient_descent.GradientDescentOptimizer(0.001)
      train_op = optimizer.minimize(loss)

      sess.run([variables.global_variables_initializer()])
      existing_loss = 0

      for _ in range(epoch):
        loss_value, _, runtime_value = sess.run([loss, train_op, runtime], {
            inputs: x_train,
            predict: y_train
        })
        if test.is_gpu_available():
          self.assertEquals(runtime_value, b'cudnn')
        else:
          self.assertEquals(runtime_value, b'cpu')
        # Make sure the loss is updated for every epoch
        # (layer weights properly updated).
        self.assertNotEqual(existing_loss, loss_value)
        existing_loss = loss_value
Exemplo n.º 9
0
def acgan_generator_loss(discriminator_gen_classification_logits,
                         one_hot_labels,
                         weights=1.0,
                         scope=None,
                         loss_collection=ops.GraphKeys.LOSSES,
                         reduction=losses.Reduction.SUM_BY_NONZERO_WEIGHTS,
                         add_summaries=False):
  """ACGAN loss for the generator.

  The ACGAN loss adds a classification loss to the conditional discriminator.
  Therefore, the discriminator must output a tuple consisting of
    (1) the real/fake prediction and
    (2) the logits for the classification (usually the last conv layer,
        flattened).

  For more details:
    ACGAN: https://arxiv.org/abs/1610.09585

  Args:
    discriminator_gen_classification_logits: Classification logits for generated
      data.
    one_hot_labels: A Tensor holding one-hot labels for the batch.
    weights: Optional `Tensor` whose rank is either 0, or the same rank as
      `discriminator_gen_classification_logits`, and must be broadcastable to
      `discriminator_gen_classification_logits` (i.e., all dimensions must be
      either `1`, or the same as the corresponding dimension).
    scope: The scope for the operations performed in computing the loss.
    loss_collection: collection to which this loss will be added.
    reduction: A `tf.compat.v1.losses.Reduction` to apply to loss.
    add_summaries: Whether or not to add summaries for the loss.

  Returns:
    A loss Tensor. Shape depends on `reduction`.

  Raises:
    ValueError: if arg module not either `generator` or `discriminator`
    TypeError: if the discriminator does not output a tuple.
  """
  with ops.name_scope(
      scope, 'acgan_generator_loss',
      (discriminator_gen_classification_logits, one_hot_labels)) as scope:
    loss = losses.softmax_cross_entropy(
        one_hot_labels,
        discriminator_gen_classification_logits,
        weights=weights,
        scope=scope,
        loss_collection=loss_collection,
        reduction=reduction)

    if add_summaries:
      summary.scalar('generator_ac_loss', loss)

  return loss
Exemplo n.º 10
0
def acgan_generator_loss(discriminator_gen_classification_logits,
                         one_hot_labels,
                         weights=1.0,
                         scope=None,
                         loss_collection=ops.GraphKeys.LOSSES,
                         reduction=losses.Reduction.SUM_BY_NONZERO_WEIGHTS,
                         add_summaries=False):
    """ACGAN loss for the generator.

  The ACGAN loss adds a classification loss to the conditional discriminator.
  Therefore, the discriminator must output a tuple consisting of
    (1) the real/fake prediction and
    (2) the logits for the classification (usually the last conv layer,
        flattened).

  For more details:
    ACGAN: https://arxiv.org/abs/1610.09585

  Args:
    discriminator_gen_classification_logits: Classification logits for generated
      data.
    one_hot_labels: A Tensor holding one-hot labels for the batch.
    weights: Optional `Tensor` whose rank is either 0, or the same rank as
      `discriminator_gen_classification_logits`, and must be broadcastable to
      `discriminator_gen_classification_logits` (i.e., all dimensions must be
      either `1`, or the same as the corresponding dimension).
    scope: The scope for the operations performed in computing the loss.
    loss_collection: collection to which this loss will be added.
    reduction: A `tf.compat.v1.losses.Reduction` to apply to loss.
    add_summaries: Whether or not to add summaries for the loss.

  Returns:
    A loss Tensor. Shape depends on `reduction`.

  Raises:
    ValueError: if arg module not either `generator` or `discriminator`
    TypeError: if the discriminator does not output a tuple.
  """
    with ops.name_scope(
            scope, 'acgan_generator_loss',
        (discriminator_gen_classification_logits, one_hot_labels)) as scope:
        loss = losses.softmax_cross_entropy(
            one_hot_labels,
            discriminator_gen_classification_logits,
            weights=weights,
            scope=scope,
            loss_collection=loss_collection,
            reduction=reduction)

        if add_summaries:
            summary.scalar('generator_ac_loss', loss)

    return loss
Exemplo n.º 11
0
  def test_unifiedRNN(self):
    rewrites = rewriter_config_pb2.RewriterConfig()
    rewrites.function_optimization = rewriter_config_pb2.RewriterConfig.OFF
    customer_optimizer = rewrites.custom_optimizers.add()
    customer_optimizer.name = 'ExperimentalImplementationSelector'
    rewrites.min_graph_nodes = -1
    graph_options = config_pb2.GraphOptions(rewrite_options=rewrites)
    config = config_pb2.ConfigProto(graph_options=graph_options)

    input_shape = 10
    rnn_state_size = 8
    output_shape = 8
    timestep = 4
    batch = 100
    epoch = 1

    with ops.Graph().as_default(), session.Session(config=config) as sess:
      (x_train, y_train), _ = testing_utils.get_test_data(
          train_samples=batch,
          test_samples=0,
          input_shape=(timestep, input_shape),
          num_classes=output_shape)
      y_train = keras.utils.to_categorical(y_train)

      layer = UnifiedLSTM(rnn_state_size)

      inputs = array_ops.placeholder(
          dtypes.float32, shape=(None, timestep, input_shape), name='inputs')
      predict = array_ops.placeholder(
          dtypes.float32, shape=(None, output_shape), name='predict')

      outputs, runtime = layer(inputs)
      loss = losses.softmax_cross_entropy(predict, outputs)
      optimizer = gradient_descent.GradientDescentOptimizer(0.001)
      train_op = optimizer.minimize(loss)

      sess.run([variables.global_variables_initializer()])
      existing_loss = 0
      for _ in range(epoch):
        loss_value, _, runtime_value = sess.run([loss, train_op, runtime], {
            inputs: x_train,
            predict: y_train
        })
        if test.is_gpu_available():
          self.assertEquals(runtime_value, b'cudnn')
        else:
          self.assertEquals(runtime_value, b'cpu')
        # Make sure the loss is updated for every epoch
        # (layer weights properly updated).
        self.assertNotEqual(existing_loss, loss_value)
        existing_loss = loss_value
Exemplo n.º 12
0
    def test_unifiedLSTM(self):
        input_shape = 10
        rnn_state_size = 8
        output_shape = 8
        timestep = 4
        batch = 100
        epoch = 1

        with self.cached_session(config=_config, use_gpu=True) as sess:
            (x_train, y_train), _ = testing_utils.get_test_data(
                train_samples=batch,
                test_samples=0,
                input_shape=(timestep, input_shape),
                num_classes=output_shape)
            y_train = keras.utils.to_categorical(y_train, output_shape)

            layer = keras.layers.UnifiedLSTM(rnn_state_size,
                                             return_runtime=True)

            inputs = array_ops.placeholder(dtypes.float32,
                                           shape=(None, timestep, input_shape),
                                           name='inputs')
            predict = array_ops.placeholder(dtypes.float32,
                                            shape=(None, output_shape),
                                            name='predict')

            outputs, runtime = layer(inputs)
            loss = losses.softmax_cross_entropy(predict, outputs)
            optimizer = gradient_descent.GradientDescentOptimizer(0.001)
            train_op = optimizer.minimize(loss)

            sess.run([variables.global_variables_initializer()])
            existing_loss = 0
            for _ in range(epoch):
                loss_value, _, runtime_value = sess.run(
                    [loss, train_op, runtime], {
                        inputs: x_train,
                        predict: y_train
                    })
                if test.is_gpu_available():
                    self.assertEqual(runtime_value, b'cudnn')
                else:
                    self.assertEqual(runtime_value, b'cpu')
                # Make sure the loss is updated for every epoch
                # (layer weights properly updated).
                self.assertNotEqual(existing_loss, loss_value)
                existing_loss = loss_value
Exemplo n.º 13
0
  def test_unifiedRNN(self):
    input_shape = 10
    rnn_state_size = 8
    output_shape = 8
    timestep = 4
    batch = 100
    epoch = 1

    with self.cached_session(config=self.config, use_gpu=True) as sess:
      (x_train, y_train), _ = testing_utils.get_test_data(
          train_samples=batch,
          test_samples=0,
          input_shape=(timestep, input_shape),
          num_classes=output_shape)
      y_train = keras.utils.to_categorical(y_train, output_shape)

      layer = UnifiedLSTM(rnn_state_size)

      inputs = array_ops.placeholder(
          dtypes.float32, shape=(None, timestep, input_shape), name='inputs')
      predict = array_ops.placeholder(
          dtypes.float32, shape=(None, output_shape), name='predict')

      outputs, runtime = layer(inputs)
      loss = losses.softmax_cross_entropy(predict, outputs)
      optimizer = gradient_descent.GradientDescentOptimizer(0.001)
      train_op = optimizer.minimize(loss)

      sess.run([variables.global_variables_initializer()])
      existing_loss = 0
      for _ in range(epoch):
        loss_value, _, runtime_value = sess.run([loss, train_op, runtime], {
            inputs: x_train,
            predict: y_train
        })
        if test.is_gpu_available():
          self.assertEquals(runtime_value, b'cudnn')
        else:
          self.assertEquals(runtime_value, b'cpu')
        # Make sure the loss is updated for every epoch
        # (layer weights properly updated).
        self.assertNotEqual(existing_loss, loss_value)
        existing_loss = loss_value
Exemplo n.º 14
0
def visual_prior_penalty(self, visual_prior_images):
    loss = []
    loss_list = []

    for key in visual_prior_images.keys():
        for attribute in visual_prior_images[key]:
            with variable_scope.variable_scope(self.dis_scope.name,
                                               reuse=True):
                no_use5, Q_net_from_samples = self.discriminator(
                    visual_prior_images[key][attribute], self.cat_dim,
                    self.code_con_dim)
            print(key)
            if key == 'category':
                print('why?????????????????')
                category_label = tf.one_hot(
                    [attribute] * visual_prior_images[key][attribute].shape[0],
                    self.cat_dim)
                category_label = tf.Print(
                    category_label,
                    [category_label[0], Q_net_from_samples[0][0]],
                    '{} and {} bias : '.format(key, attribute))
                loss.append(
                    losses.softmax_cross_entropy(category_label,
                                                 Q_net_from_samples[0]))
                loss_list.append((key, attribute))
            elif key in self.variation_key:
                if attribute == 'min':
                    bias_label = -1
                else:
                    bias_label = 1

                loss.append(
                    variance_bias_loss(key,
                                       attribute,
                                       Q_net_from_samples[1],
                                       order=self.variation_key.index(key),
                                       bias_label=bias_label,
                                       weights=[1, 1]))
                loss_list.append((key, attribute))
    print(loss_list)
    print(' = ', loss)
    return tf.reduce_mean(loss)
Exemplo n.º 15
0
def categorical_cross_entropy(labels, logits, weights=1.0):
    """ Categorical Cross entropy

    Measures the probability error in discrete classification tasks in which the classes are mutually exclusive.

    Warning:
        This is to be used on the logits of a model, not on the predicted labels.
        See ``tf.nn.softmax_cross_entropy_with_logits``.

    Args:
        labels: ground truth, correct values with a one-hot encoding. Each row labels[i] must be a valid probability
        distribution.
        logits: a tensor with the unscaled log probabilities used to predict the labels with softmax(logits)
        weights: Optional `Tensor` whose rank is either 0, or the same rank as
      `labels`, and must be broadcastable to `labels` (i.e., all dimensions must
      be either `1`, or the same as the corresponding `losses` dimension).

    Returns:
        ``Tensor``: a float ``Tensor``.

    """
    return softmax_cross_entropy(labels, logits, weights)
Exemplo n.º 16
0
  def testStaticRNNWithKerasSimpleRNNCell(self):
    with self.cached_session() as sess:
      input_shape = 10
      output_shape = 5
      timestep = 4
      batch = 100
      (x_train, y_train), _ = testing_utils.get_test_data(
          train_samples=batch,
          test_samples=0,
          input_shape=(timestep, input_shape),
          num_classes=output_shape)
      x_train = np.transpose(x_train, (1, 0, 2))
      y_train = keras.utils.to_categorical(y_train)
      cell = keras.layers.SimpleRNNCell(output_shape)

      inputs = [array_ops.placeholder(
          dtypes.float32, shape=(None, input_shape))] * timestep
      predict = array_ops.placeholder(
          dtypes.float32, shape=(None, output_shape))

      outputs, state = rnn.static_rnn(
          cell, inputs, dtype=dtypes.float32)
      self.assertEqual(len(outputs), timestep)
      self.assertEqual(outputs[0].shape.as_list(), [None, output_shape])
      self.assertEqual(state.shape.as_list(), [None, output_shape])
      loss = losses.softmax_cross_entropy(predict, state)
      train_op = training.GradientDescentOptimizer(0.001).minimize(loss)

      sess.run([variables_lib.global_variables_initializer()])
      feed_dict = {i: d for i, d in zip(inputs, x_train)}
      feed_dict[predict] = y_train
      _, outputs, state = sess.run(
          [train_op, outputs, state], feed_dict)

      self.assertEqual(len(outputs), timestep)
      self.assertEqual(len(outputs[0]), batch)
      self.assertEqual(len(state), batch)
Exemplo n.º 17
0
  def testStaticRNNWithKerasSimpleRNNCell(self):
    with self.cached_session() as sess:
      input_shape = 10
      output_shape = 5
      timestep = 4
      batch = 100
      (x_train, y_train), _ = testing_utils.get_test_data(
          train_samples=batch,
          test_samples=0,
          input_shape=(timestep, input_shape),
          num_classes=output_shape)
      x_train = np.transpose(x_train, (1, 0, 2))
      y_train = keras.utils.to_categorical(y_train)
      cell = keras.layers.SimpleRNNCell(output_shape)

      inputs = [array_ops.placeholder(
          dtypes.float32, shape=(None, input_shape))] * timestep
      predict = array_ops.placeholder(
          dtypes.float32, shape=(None, output_shape))

      outputs, state = rnn.static_rnn(
          cell, inputs, dtype=dtypes.float32)
      self.assertEqual(len(outputs), timestep)
      self.assertEqual(outputs[0].shape.as_list(), [None, output_shape])
      self.assertEqual(state.shape.as_list(), [None, output_shape])
      loss = losses.softmax_cross_entropy(predict, state)
      train_op = training.GradientDescentOptimizer(0.001).minimize(loss)

      sess.run([variables_lib.global_variables_initializer()])
      feed_dict = {i: d for i, d in zip(inputs, x_train)}
      feed_dict[predict] = y_train
      _, outputs, state = sess.run(
          [train_op, outputs, state], feed_dict)

      self.assertEqual(len(outputs), timestep)
      self.assertEqual(len(outputs[0]), batch)
      self.assertEqual(len(state), batch)
Exemplo n.º 18
0
def acgan_discriminator_loss(
    discriminator_real_classification_logits,
    discriminator_gen_classification_logits,
    one_hot_labels,
    label_smoothing=0.0,
    real_weights=1.0,
    generated_weights=1.0,
    scope=None,
    loss_collection=ops.GraphKeys.LOSSES,
    reduction=losses.Reduction.SUM_BY_NONZERO_WEIGHTS,
    add_summaries=False):
  """ACGAN loss for the discriminator.

  The ACGAN loss adds a classification loss to the conditional discriminator.
  Therefore, the discriminator must output a tuple consisting of
    (1) the real/fake prediction and
    (2) the logits for the classification (usually the last conv layer,
        flattened).

  For more details:
    ACGAN: https://arxiv.org/abs/1610.09585

  Args:
    discriminator_real_classification_logits: Classification logits for real
      data.
    discriminator_gen_classification_logits: Classification logits for generated
      data.
    one_hot_labels: A Tensor holding one-hot labels for the batch.
    label_smoothing: A float in [0, 1]. If greater than 0, smooth the labels for
      "discriminator on real data" as suggested in
      https://arxiv.org/pdf/1701.00160
    real_weights: Optional `Tensor` whose rank is either 0, or the same rank as
      `discriminator_real_outputs`, and must be broadcastable to
      `discriminator_real_outputs` (i.e., all dimensions must be either `1`, or
      the same as the corresponding dimension).
    generated_weights: Same as `real_weights`, but for
      `discriminator_gen_classification_logits`.
    scope: The scope for the operations performed in computing the loss.
    loss_collection: collection to which this loss will be added.
    reduction: A `tf.losses.Reduction` to apply to loss.
    add_summaries: Whether or not to add summaries for the loss.

  Returns:
    A loss Tensor. Shape depends on `reduction`.

  Raises:
    TypeError: If the discriminator does not output a tuple.
  """
  with ops.name_scope(
      scope, 'acgan_discriminator_loss',
      (discriminator_real_classification_logits,
       discriminator_gen_classification_logits, one_hot_labels)) as scope:
    loss_on_generated = losses.softmax_cross_entropy(
        one_hot_labels, discriminator_gen_classification_logits,
        weights=generated_weights, scope=scope, loss_collection=None,
        reduction=reduction)
    loss_on_real = losses.softmax_cross_entropy(
        one_hot_labels, discriminator_real_classification_logits,
        weights=real_weights, label_smoothing=label_smoothing, scope=scope,
        loss_collection=None, reduction=reduction)
    loss = loss_on_generated + loss_on_real
    util.add_loss(loss, loss_collection)

    if add_summaries:
      summary.scalar('discriminator_gen_ac_loss', loss_on_generated)
      summary.scalar('discriminator_real_ac_loss', loss_on_real)
      summary.scalar('discriminator_ac_loss', loss)

  return loss
Exemplo n.º 19
0
def acgan_discriminator_loss(discriminator_real_classification_logits,
                             discriminator_gen_classification_logits,
                             one_hot_labels,
                             label_smoothing=0.0,
                             real_weights=1.0,
                             generated_weights=1.0,
                             scope=None,
                             loss_collection=ops.GraphKeys.LOSSES,
                             reduction=losses.Reduction.SUM_BY_NONZERO_WEIGHTS,
                             add_summaries=False):
    """ACGAN loss for the discriminator.

  The ACGAN loss adds a classification loss to the conditional discriminator.
  Therefore, the discriminator must output a tuple consisting of
    (1) the real/fake prediction and
    (2) the logits for the classification (usually the last conv layer,
        flattened).

  For more details:
    ACGAN: https://arxiv.org/abs/1610.09585

  Args:
    discriminator_real_classification_logits: Classification logits for real
      data.
    discriminator_gen_classification_logits: Classification logits for generated
      data.
    one_hot_labels: A Tensor holding one-hot labels for the batch.
    label_smoothing: A float in [0, 1]. If greater than 0, smooth the labels for
      "discriminator on real data" as suggested in
      https://arxiv.org/pdf/1701.00160
    real_weights: Optional `Tensor` whose rank is either 0, or the same rank as
      `discriminator_real_outputs`, and must be broadcastable to
      `discriminator_real_outputs` (i.e., all dimensions must be either `1`, or
      the same as the corresponding dimension).
    generated_weights: Same as `real_weights`, but for
      `discriminator_gen_classification_logits`.
    scope: The scope for the operations performed in computing the loss.
    loss_collection: collection to which this loss will be added.
    reduction: A `tf.compat.v1.losses.Reduction` to apply to loss.
    add_summaries: Whether or not to add summaries for the loss.

  Returns:
    A loss Tensor. Shape depends on `reduction`.

  Raises:
    TypeError: If the discriminator does not output a tuple.
  """
    with ops.name_scope(
            scope, 'acgan_discriminator_loss',
        (discriminator_real_classification_logits,
         discriminator_gen_classification_logits, one_hot_labels)) as scope:
        loss_on_generated = losses.softmax_cross_entropy(
            one_hot_labels,
            discriminator_gen_classification_logits,
            weights=generated_weights,
            scope=scope,
            loss_collection=None,
            reduction=reduction)
        loss_on_real = losses.softmax_cross_entropy(
            one_hot_labels,
            discriminator_real_classification_logits,
            weights=real_weights,
            label_smoothing=label_smoothing,
            scope=scope,
            loss_collection=None,
            reduction=reduction)
        loss = loss_on_generated + loss_on_real
        util.add_loss(loss, loss_collection)

        if add_summaries:
            summary.scalar('discriminator_gen_ac_loss', loss_on_generated)
            summary.scalar('discriminator_real_ac_loss', loss_on_real)
            summary.scalar('discriminator_ac_loss', loss)

    return loss
Exemplo n.º 20
0
def visual_feature_regularizer(
        # structured_generator_inputs,
        # predicted_distributions,
        model,
        weights=1.0,
        scope=None,
        loss_collection=ops.GraphKeys.LOSSES,
        reduction=losses.Reduction.SUM_BY_NONZERO_WEIGHTS,
        add_summaries=False):
    """Returns a penalty on the mutual information in an InfoGAN model.

  This loss comes from an InfoGAN paper https://arxiv.org/abs/1606.03657.

  Args:
    structured_generator_inputs: A list of Tensors representing the random noise
      that must  have high mutual information with the generator output. List
      length should match `predicted_distributions`.
    predicted_distributions: A list of tf.Distributions. Predicted by the
      recognizer, and used to evaluate the likelihood of the structured noise.
      List length should match `structured_generator_inputs`.
    weights: Optional `Tensor` whose rank is either 0, or the same dimensions as
      `structured_generator_inputs`.
    scope: The scope for the operations performed in computing the loss.
    loss_collection: collection to which this loss will be added.
    reduction: A `tf.losses.Reduction` to apply to loss.
    add_summaries: Whether or not to add summaries for the loss.

  Returns:
    A scalar Tensor representing the mutual information loss.
  """
    # _validate_information_penalty_inputs(
    #     structured_generator_inputs, predicted_distributions)

    #mutual information between visual feature and normal distribution to have myu 1 or -1
    # Calculate the negative log-likelihood of the reconstructed noise.

    visual_features = model.visual_features
    feature_list = model.feature_list
    loss = {}
    for key in [
            key for key in visual_features.keys()
            if key in feature_list['continuous'].keys()
    ]:
        label = tf.ones_like(visual_features[key]['left'])
        loss[key] = losses.mean_squared_error(
            -label,
            visual_features[key]['left'],
            weights,
            scope,
            loss_collection=loss_collection,
            reduction=reduction) + losses.mean_squared_error(
                label,
                visual_features[key]['right'],
                weights,
                scope,
                loss_collection=loss_collection,
                reduction=reduction)

    for key in [
            key for key in visual_features.keys()
            if key in feature_list['discrete'].keys()
    ]:
        loss[key] = 0
        category_num = len(feature_list['discrete'][key])
        for attribute in feature_list['discrete'][key]:
            onehot_labels = tf.one_hot(
                [attribute] * visual_features[key][attribute].shape[1],
                category_num)
            loss[key] += losses.softmax_cross_entropy(
                onehot_labels,
                visual_features[key][attribute],
                weights,
                0,
                scope,
                loss_collection=loss_collection,
                reduction=reduction)

            # print(attribute, " : ", [attribute]*visual_features[key][attribute].shape[1])
            # print(visual_features[key][attribute])

    if add_summaries:
        for key in loss.keys():
            summary.scalar('loss_' + key, loss[key])

    return loss['rotation'] + loss['width'] + 2 * loss['category']