def __init__(self, config, triage_model):
        super(AstroCNNModelVetting, self).__init__()

        hps = config.vetting_hparams
        self.triage_model = astro_cnn_model.AstroCNNModel(
            config, triage_model, embeds_only=not hps.use_preds_layer)
        self.config = config

        self.ts_blocks = self._create_ts_blocks(config)

        self.final = [tf.keras.layers.Concatenate()]
        for i in range(hps.num_pre_logits_hidden_layers):
            self.final.append(
                tf.keras.layers.Dense(units=hps.pre_logits_hidden_layer_size,
                                      activation='relu'))
            if hps.use_batch_norm:
                self.final.append(tf.keras.layers.BatchNormalization())
            self.final.append(
                tf.keras.layers.Dropout(hps.pre_logits_dropout_rate))
        if config.inputs.get('exclusive_labels', False):
            self.final.append(
                tf.keras.layers.Dense(units=len(config.inputs.label_columns),
                                      activation=None))
            self.final.append(tf.keras.layers.Softmax())
        else:
            self.final.append(
                tf.keras.layers.Dense(units=len(config.inputs.label_columns),
                                      activation='sigmoid'))
Esempio n. 2
0
  def testOneTimeSeriesFeature(self):
    # Build config.
    feature_spec = {
        "time_feature_1": {
            "length": 20,
            "is_time_series": True,
        }
    }
    hidden_spec = {
        "time_feature_1": {
            "cnn_num_blocks": 2,
            "cnn_block_size": 2,
            "cnn_initial_num_filters": 4,
            "cnn_block_filter_factor": 1.5,
            "cnn_kernel_size": 3,
            "convolution_padding": "same",
            "pool_size": 2,
            "pool_strides": 2,
        }
    }
    config = configurations.base()
    config["inputs"]["features"] = feature_spec
    config["hparams"]["time_series_hidden"] = hidden_spec
    config = configdict.ConfigDict(config)

    # Build model.
    features = input_ops.build_feature_placeholders(config.inputs.features)
    labels = input_ops.build_labels_placeholder()
    model = astro_cnn_model.AstroCNNModel(features, labels, config.hparams,
                                          tf.estimator.ModeKeys.TRAIN)
    model.build()

    # Validate Tensor shapes.
    block_1_conv_1 = testing.get_variable_by_name(
        "time_feature_1_hidden/block_1/conv_1/kernel")
    self.assertShapeEquals((3, 1, 4), block_1_conv_1)

    block_1_conv_2 = testing.get_variable_by_name(
        "time_feature_1_hidden/block_1/conv_2/kernel")
    self.assertShapeEquals((3, 4, 4), block_1_conv_2)

    block_2_conv_1 = testing.get_variable_by_name(
        "time_feature_1_hidden/block_2/conv_1/kernel")
    self.assertShapeEquals((3, 4, 6), block_2_conv_1)

    block_2_conv_2 = testing.get_variable_by_name(
        "time_feature_1_hidden/block_2/conv_2/kernel")
    self.assertShapeEquals((3, 6, 6), block_2_conv_2)

    self.assertItemsEqual(["time_feature_1"],
                          model.time_series_hidden_layers.keys())
    self.assertShapeEquals((None, 30),
                           model.time_series_hidden_layers["time_feature_1"])
    self.assertEqual(len(model.aux_hidden_layers), 0)
    self.assertIs(model.time_series_hidden_layers["time_feature_1"],
                  model.pre_logits_concat)

    # Execute the TensorFlow graph.
    scaffold = tf.train.Scaffold()
    scaffold.finalize()
    with self.test_session() as sess:
      sess.run([scaffold.init_op, scaffold.local_init_op])
      step = sess.run(model.global_step)
      self.assertEqual(0, step)

      # Fetch predictions.
      features = testing.fake_features(feature_spec, batch_size=16)
      labels = testing.fake_labels(config.hparams.output_dim, batch_size=16)
      feed_dict = input_ops.prepare_feed_dict(model, features, labels)
      predictions = sess.run(model.predictions, feed_dict=feed_dict)
      self.assertShapeEquals((16, 1), predictions)
  def testTwoTimeSeriesFeatures(self):
    # Build config.
    feature_spec = {
        "time_feature_1": {
            "length": 20,
            "is_time_series": True,
        },
        "time_feature_2": {
            "length": 5,
            "is_time_series": True,
        },
        "aux_feature_1": {
            "length": 1,
            "is_time_series": False,
        },
    }
    hidden_spec = {
        "time_feature_1": {
            "cnn_num_blocks": 2,
            "cnn_block_size": 2,
            "cnn_initial_num_filters": 4,
            "cnn_block_filter_factor": 1.5,
            "cnn_kernel_size": 3,
            "convolution_padding": "same",
            "pool_size": 2,
            "pool_strides": 2,
        },
        "time_feature_2": {
            "cnn_num_blocks": 1,
            "cnn_block_size": 1,
            "cnn_initial_num_filters": 5,
            "cnn_block_filter_factor": 1,
            "cnn_kernel_size": 2,
            "convolution_padding": "same",
            "pool_size": 0,
            "pool_strides": 0,
        }
    }
    config = configurations.base()
    config["inputs"]["features"] = feature_spec
    config["hparams"]["time_series_hidden"] = hidden_spec
    config = configdict.ConfigDict(config)

    # Build model.
    features = input_ops.build_feature_placeholders(config.inputs.features)
    labels = input_ops.build_labels_placeholder()
    model = astro_cnn_model.AstroCNNModel(features, labels, config.hparams,
                                          tf.estimator.ModeKeys.TRAIN)
    model.build()

    # TODO(shallue): TensorFlow 2.0 doesn't have global variable collections.
    # If we want to keep testing variable shapes in 2.0, we must keep track of
    # the individual Keras Layer objects in the model class.
    variables = {v.op.name: v for v in tf.global_variables()}

    # Validate Tensor shapes.
    feature_1_block_1_conv_1 = variables[
        "time_feature_1_hidden/block_1/conv_1/kernel"]
    self.assertShapeEquals((3, 1, 4), feature_1_block_1_conv_1)

    feature_1_block_1_conv_2 = variables[
        "time_feature_1_hidden/block_1/conv_2/kernel"]
    self.assertShapeEquals((3, 4, 4), feature_1_block_1_conv_2)

    feature_1_block_2_conv_1 = variables[
        "time_feature_1_hidden/block_2/conv_1/kernel"]
    self.assertShapeEquals((3, 4, 6), feature_1_block_2_conv_1)

    feature_1_block_2_conv_2 = variables[
        "time_feature_1_hidden/block_2/conv_2/kernel"]
    self.assertShapeEquals((3, 6, 6), feature_1_block_2_conv_2)

    feature_2_block_1_conv_1 = variables[
        "time_feature_2_hidden/block_1/conv_1/kernel"]
    self.assertShapeEquals((2, 1, 5), feature_2_block_1_conv_1)

    self.assertItemsEqual(["time_feature_1", "time_feature_2"],
                          model.time_series_hidden_layers.keys())
    self.assertShapeEquals((None, 30),
                           model.time_series_hidden_layers["time_feature_1"])
    self.assertShapeEquals((None, 25),
                           model.time_series_hidden_layers["time_feature_2"])
    self.assertItemsEqual(["aux_feature_1"], model.aux_hidden_layers.keys())
    self.assertIs(model.aux_features["aux_feature_1"],
                  model.aux_hidden_layers["aux_feature_1"])
    self.assertShapeEquals((None, 56), model.pre_logits_concat)

    # Execute the TensorFlow graph.
    scaffold = tf.train.Scaffold()
    scaffold.finalize()
    with self.session() as sess:
      sess.run([scaffold.init_op, scaffold.local_init_op])
      step = sess.run(model.global_step)
      self.assertEqual(0, step)

      # Fetch predictions.
      features = testing.fake_features(feature_spec, batch_size=16)
      labels = testing.fake_labels(config.hparams.output_dim, batch_size=16)
      feed_dict = input_ops.prepare_feed_dict(model, features, labels)
      predictions = sess.run(model.predictions, feed_dict=feed_dict)
      self.assertShapeEquals((16, 1), predictions)