Пример #1
0
def rnn_model_fn(features, labels, mode):  # pylint: disable=unused-argument
    """Model function for a RNN."""

    # Define RNN architecture using tf.keras.layers.
    x = features['x']
    x = tf.reshape(x, [-1, SEQ_LEN])
    input_layer = x[:, :-1]
    input_one_hot = tf.one_hot(input_layer, 256)
    lstm = tf.keras.layers.LSTM(256,
                                return_sequences=True).apply(input_one_hot)
    logits = tf.keras.layers.Dense(256).apply(lstm)

    # Calculate loss as a vector (to support microbatches in DP-SGD).
    vector_loss = tf.nn.softmax_cross_entropy_with_logits(labels=tf.cast(
        tf.one_hot(x[:, 1:], 256), dtype=tf.float32),
                                                          logits=logits)
    # Define mean of loss across minibatch (for reporting through tf.Estimator).
    scalar_loss = tf.reduce_mean(vector_loss)

    # Configure the training op (for TRAIN mode).
    if mode == tf.estimator.ModeKeys.TRAIN:
        if FLAGS.dpsgd:

            ledger = privacy_ledger.PrivacyLedger(
                population_size=NB_TRAIN,
                selection_probability=(FLAGS.batch_size / NB_TRAIN))

            optimizer = dp_optimizer.DPAdamGaussianOptimizer(
                l2_norm_clip=FLAGS.l2_norm_clip,
                noise_multiplier=FLAGS.noise_multiplier,
                num_microbatches=FLAGS.microbatches,
                ledger=ledger,
                learning_rate=FLAGS.learning_rate,
                unroll_microbatches=True)
            opt_loss = vector_loss
        else:
            optimizer = tf.train.AdamOptimizer(
                learning_rate=FLAGS.learning_rate)
            opt_loss = scalar_loss
        global_step = tf.train.get_global_step()
        train_op = optimizer.minimize(loss=opt_loss, global_step=global_step)
        return tf.estimator.EstimatorSpec(mode=mode,
                                          loss=scalar_loss,
                                          train_op=train_op)

    # Add evaluation metrics (for EVAL mode).
    elif mode == tf.estimator.ModeKeys.EVAL:
        eval_metric_ops = {
            'accuracy':
            tf.metrics.accuracy(labels=tf.cast(x[:, 1:], dtype=tf.int32),
                                predictions=tf.argmax(input=logits, axis=2))
        }
        return tf.estimator.EstimatorSpec(mode=mode,
                                          loss=scalar_loss,
                                          eval_metric_ops=eval_metric_ops)
Пример #2
0
    def test_basic(self):
        ledger = privacy_ledger.PrivacyLedger(10, 0.1)
        ledger.record_sum_query(5.0, 1.0)
        ledger.record_sum_query(2.0, 0.5)

        ledger.finalize_sample()

        expected_queries = [[5.0, 1.0], [2.0, 0.5]]
        formatted = ledger.get_formatted_ledger_eager()

        sample = formatted[0]
        self.assertAllClose(sample.population_size, 10.0)
        self.assertAllClose(sample.selection_probability, 0.1)
        self.assertAllClose(sorted(sample.queries), sorted(expected_queries))
Пример #3
0
    def __init__(self):
        self.img_rows = 64
        self.img_cols = 64
        self.channels = 3
        self.img_shape = (self.img_rows, self.img_cols, self.channels)
        self.latent_dim = 100

        # Build and compile the discriminator
        self.discriminator = self.build_discriminator()
        ledger = privacy_ledger.PrivacyLedger(population_size=100000,
                                              selection_probability=(32 /
                                                                     100000))
        optimizer = dp_optimizer.DPAdamGaussianOptimizer(
            l2_norm_clip=0.01,
            noise_multiplier=0.000000005,
            num_microbatches=1,
            ledger=ledger,
            learning_rate=0.0002)

        self.discriminator.compile(loss='binary_crossentropy',
                                   optimizer=optimizer,
                                   metrics=['accuracy'])

        # Build the generator
        self.generator = self.build_generator()

        # The generator takes noise as input and generates imgs
        z = Input(shape=(self.latent_dim, ))
        img = self.generator(z)

        # For the combined model we will only train the generator
        self.discriminator.trainable = False

        # The discriminator takes generated images as input and determines validity
        validity = self.discriminator(img)

        # The combined model  (stacked generator and discriminator)
        # Trains the generator to fool the discriminator
        self.combined = Model(z, validity)
        optimizer = Adam(0.0002, 0.5)
        self.combined.compile(loss='binary_crossentropy', optimizer=optimizer)
Пример #4
0
def cnn_model_fn(features, labels, mode):
    """Model function for a CNN."""

    # Define CNN architecture using tf.keras.layers.
    input_layer = tf.reshape(features['x'], [-1, 28, 28, 1])
    y = tf.keras.layers.Conv2D(16,
                               8,
                               strides=2,
                               padding='same',
                               activation='relu').apply(input_layer)
    y = tf.keras.layers.MaxPool2D(2, 1).apply(y)
    y = tf.keras.layers.Conv2D(32,
                               4,
                               strides=2,
                               padding='valid',
                               activation='relu').apply(y)
    y = tf.keras.layers.MaxPool2D(2, 1).apply(y)
    y = tf.keras.layers.Flatten().apply(y)
    y = tf.keras.layers.Dense(32, activation='relu').apply(y)
    logits = tf.keras.layers.Dense(10).apply(y)

    # Calculate loss as a vector (to support microbatches in DP-SGD).
    vector_loss = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=labels,
                                                                 logits=logits)
    # Define mean of loss across minibatch (for reporting through tf.Estimator).
    scalar_loss = tf.reduce_mean(vector_loss)

    # Configure the training op (for TRAIN mode).
    if mode == tf.estimator.ModeKeys.TRAIN:

        if FLAGS.dpsgd:
            ledger = privacy_ledger.PrivacyLedger(
                population_size=60000,
                selection_probability=(FLAGS.batch_size / 60000))

            # Use DP version of GradientDescentOptimizer. Other optimizers are
            # available in dp_optimizer. Most optimizers inheriting from
            # tf.train.Optimizer should be wrappable in differentially private
            # counterparts by calling dp_optimizer.optimizer_from_args().
            optimizer = dp_optimizer.DPGradientDescentGaussianOptimizer(
                l2_norm_clip=FLAGS.l2_norm_clip,
                noise_multiplier=FLAGS.noise_multiplier,
                num_microbatches=FLAGS.microbatches,
                ledger=ledger,
                learning_rate=FLAGS.learning_rate)
            training_hooks = [EpsilonPrintingTrainingHook(ledger)]
            opt_loss = vector_loss
        else:
            optimizer = GradientDescentOptimizer(
                learning_rate=FLAGS.learning_rate)
            training_hooks = []
            opt_loss = scalar_loss
        global_step = tf.train.get_global_step()
        train_op = optimizer.minimize(loss=opt_loss, global_step=global_step)
        # In the following, we pass the mean of the loss (scalar_loss) rather than
        # the vector_loss because tf.estimator requires a scalar loss. This is only
        # used for evaluation and debugging by tf.estimator. The actual loss being
        # minimized is opt_loss defined above and passed to optimizer.minimize().
        return tf.estimator.EstimatorSpec(mode=mode,
                                          loss=scalar_loss,
                                          train_op=train_op,
                                          training_hooks=training_hooks)

    # Add evaluation metrics (for EVAL mode).
    elif mode == tf.estimator.ModeKeys.EVAL:
        eval_metric_ops = {
            'accuracy':
            tf.metrics.accuracy(labels=labels,
                                predictions=tf.argmax(input=logits, axis=1))
        }

        return tf.estimator.EstimatorSpec(mode=mode,
                                          loss=scalar_loss,
                                          eval_metric_ops=eval_metric_ops)
Пример #5
0
 def test_fail_on_probability_zero(self):
     with self.assertRaisesRegexp(ValueError,
                                  'Selection probability cannot be 0.'):
         privacy_ledger.PrivacyLedger(10, 0)
Пример #6
0
def lr_model_fn(features, labels, mode):
    """Model function for a LR."""

    # Define logistic regression model using tf.keras.layers.
    logits = tf.keras.layers.Dense(2).apply(features['x'])

    # Calculate loss as a vector (to support microbatches in DP-SGD).
    vector_loss = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=labels,
                                                                 logits=logits)

    # Define mean of loss across minibatch (for reporting through tf.Estimator).
    scalar_loss = tf.reduce_mean(input_tensor=vector_loss)

    # Configure the training op (for TRAIN mode).
    if mode == tf.estimator.ModeKeys.TRAIN:

        if FLAGS.dpsgd:
            ledger = privacy_ledger.PrivacyLedger(
                population_size=FLAGS.training_data_size,
                selection_probability=(FLAGS.batch_size /
                                       FLAGS.training_data_size))

            # Use DP version of AdamOptimizer. Other optimizers are
            # available in dp_optimizer. Most optimizers inheriting from
            # tf.train.Optimizer should be wrappable in differentially private
            # counterparts by calling dp_optimizer.optimizer_from_args().
            # Setting num_microbatches to None is necessary for DP and
            # per-example gradients
            optimizer = dp_optimizer.DPAdamGaussianOptimizer(
                l2_norm_clip=FLAGS.l2_norm_clip,
                noise_multiplier=FLAGS.noise_multiplier,
                num_microbatches=None,
                ledger=ledger,
                learning_rate=FLAGS.learning_rate)
            training_hooks = [EpsilonPrintingTrainingHook(ledger)]
            opt_loss = vector_loss
        else:
            optimizer = AdamOptimizer(learning_rate=FLAGS.learning_rate)
            training_hooks = []
            opt_loss = scalar_loss

        global_step = tf.compat.v1.train.get_global_step()
        train_op = optimizer.minimize(loss=opt_loss, global_step=global_step)
        # In the following, we pass the mean of the loss (scalar_loss) rather than
        # the vector_loss because tf.estimator requires a scalar loss. This is only
        # used for evaluation and debugging by tf.estimator. The actual loss being
        # minimized is opt_loss defined above and passed to optimizer.minimize().
        return tf.estimator.EstimatorSpec(mode=mode,
                                          loss=scalar_loss,
                                          train_op=train_op,
                                          training_hooks=training_hooks)

    # Add evaluation metrics (for EVAL mode).
    elif mode == tf.estimator.ModeKeys.EVAL:
        eval_metric_ops = {
            'accuracy':
            tf.compat.v1.metrics.accuracy(labels=labels,
                                          predictions=tf.argmax(input=logits,
                                                                axis=1))
        }

    return tf.estimator.EstimatorSpec(mode=mode,
                                      loss=scalar_loss,
                                      eval_metric_ops=eval_metric_ops)