tf-models-nightly 2.17.0.dev20240409__py2.py3-none-any.whl → 2.17.0.dev20240411__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -43,6 +43,12 @@ class MultiTaskInterleavingTrainer(base_trainer.MultiTaskBaseTrainer):
43
43
  trainer_options=trainer_options)
44
44
  self._task_sampler = task_sampler
45
45
 
46
+ # TODO(haozhangthu): Add taskwise step counter to train_loop_end for logging
47
+ # on TensorBoard.
48
+ self._task_step_counters = {
49
+ name: orbit.utils.create_global_step() for name in self.multi_task.tasks
50
+ }
51
+
46
52
  # Build per task train step.
47
53
  def _get_task_step(task_name, task):
48
54
 
@@ -57,6 +63,8 @@ class MultiTaskInterleavingTrainer(base_trainer.MultiTaskBaseTrainer):
57
63
  optimizer=self.optimizer,
58
64
  metrics=self.training_metrics[task_name])
59
65
  self.training_losses[task_name].update_state(task_logs[task.loss])
66
+ self.global_step.assign_add(1)
67
+ self.task_step_counter(task_name).assign_add(1)
60
68
 
61
69
  return step_fn
62
70
 
@@ -65,12 +73,6 @@ class MultiTaskInterleavingTrainer(base_trainer.MultiTaskBaseTrainer):
65
73
  for name, task in self.multi_task.tasks.items()
66
74
  }
67
75
 
68
- # TODO(haozhangthu): Add taskwise step counter to train_loop_end for logging
69
- # on TensorBoard.
70
- self._task_step_counters = {
71
- name: orbit.utils.create_global_step() for name in self.multi_task.tasks
72
- }
73
-
74
76
  # If the new Keras optimizer is used, we require all model variables are
75
77
  # created before the training and let the optimizer to create the slot
76
78
  # variable all together.
@@ -97,8 +99,6 @@ class MultiTaskInterleavingTrainer(base_trainer.MultiTaskBaseTrainer):
97
99
  if rn >= begin and rn < end:
98
100
  self._strategy.run(
99
101
  self._task_train_step_map[name], args=(next(iterator_map[name]),))
100
- self.global_step.assign_add(1)
101
- self.task_step_counter(name).assign_add(1)
102
102
 
103
103
  def train_loop_end(self):
104
104
  """Record loss and metric values per task."""
@@ -19,6 +19,7 @@ from __future__ import annotations
19
19
  import inspect
20
20
  from typing import Any, Callable
21
21
 
22
+ import numpy as np
22
23
  import tensorflow as tf, tf_keras
23
24
 
24
25
  from official.recommendation.uplift import types
@@ -29,9 +30,6 @@ from official.recommendation.uplift.metrics import treatment_sliced_metric
29
30
  class LossMetric(tf_keras.metrics.Metric):
30
31
  """Computes a loss sliced by treatment group.
31
32
 
32
- Note that the prediction tensor is expected to be of type
33
- `TwoTowerTrainingOutputs`.
34
-
35
33
  Example standalone usage:
36
34
 
37
35
  >>> sliced_loss = LossMetric(tf_keras.losses.mean_squared_error)
@@ -62,6 +60,7 @@ class LossMetric(tf_keras.metrics.Metric):
62
60
  Callable[[tf.Tensor, tf.Tensor], tf.Tensor] | tf_keras.metrics.Metric
63
61
  ),
64
62
  from_logits: bool = True,
63
+ slice_by_treatment: bool = True,
65
64
  name: str = "loss",
66
65
  dtype: tf.DType = tf.float32,
67
66
  **loss_fn_kwargs,
@@ -73,9 +72,14 @@ class LossMetric(tf_keras.metrics.Metric):
73
72
  `__call__(y_true: tf,Tensor, y_pred: tf.Tensor, **loss_fn_kwargs)`. Note
74
73
  that the `loss_fn_kwargs` will not be passed to the `__call__` method if
75
74
  `loss_fn` is a Keras metric.
76
- from_logits: Specifies whether the true logits or true predictions should
77
- be used from the model outputs to compute the loss. Defaults to using
78
- the true logits.
75
+ from_logits: When `y_pred` is of type `TwoTowerTrainingOutputs`, specifies
76
+ whether the true logits or true predictions should be used to compute
77
+ the loss (defaults to using the true logits). Othwerwise, this argument
78
+ will be ignored if `y_pred` is of type `tf.Tensor`.
79
+ slice_by_treatment: Specifies whether the loss should be sliced by the
80
+ treatment indicator tensor. If `True`, `loss_fn` will be wrapped in a
81
+ `TreatmentSlicedMetric` to report the loss values sliced by the
82
+ treatment group.
79
83
  name: Optional name for the instance. If `loss_fn` is a Keras metric then
80
84
  its name will be used instead.
81
85
  dtype: Optional data type for the instance. If `loss_fn` is a Keras metric
@@ -99,6 +103,7 @@ class LossMetric(tf_keras.metrics.Metric):
99
103
  self._loss_fn = loss_fn
100
104
  self._from_logits = from_logits
101
105
  self._loss_fn_kwargs = loss_fn_kwargs
106
+ self._slice_by_treatment = slice_by_treatment
102
107
 
103
108
  if isinstance(loss_fn, tf_keras.metrics.Metric):
104
109
  metric_from_logits = loss_fn.get_config().get("from_logits", from_logits)
@@ -108,34 +113,31 @@ class LossMetric(tf_keras.metrics.Metric):
108
113
  " the `from_logits` value passed to the `loss_fn` metric"
109
114
  f" ({metric_from_logits}). Ensure that they have the same value."
110
115
  )
111
-
112
- self._treatment_sliced_loss = (
113
- treatment_sliced_metric.TreatmentSlicedMetric(loss_fn)
114
- )
116
+ loss_metric = loss_fn
115
117
 
116
118
  else:
117
119
  if "from_logits" in inspect.signature(loss_fn).parameters:
118
120
  self._loss_fn_kwargs.update({"from_logits": from_logits})
121
+ loss_metric = tf_keras.metrics.Mean(name=name, dtype=dtype)
119
122
 
120
- self._treatment_sliced_loss = (
121
- treatment_sliced_metric.TreatmentSlicedMetric(
122
- tf_keras.metrics.Mean(name=name, dtype=dtype)
123
- )
124
- )
123
+ if slice_by_treatment:
124
+ self._loss = treatment_sliced_metric.TreatmentSlicedMetric(loss_metric)
125
+ else:
126
+ self._loss = loss_metric
125
127
 
126
128
  def update_state(
127
129
  self,
128
130
  y_true: tf.Tensor,
129
- y_pred: types.TwoTowerTrainingOutputs,
131
+ y_pred: types.TwoTowerTrainingOutputs | tf.Tensor | np.ndarray,
130
132
  sample_weight: tf.Tensor | None = None,
131
133
  ):
132
134
  """Updates the overall, control and treatment losses.
133
135
 
134
136
  Args:
135
137
  y_true: A `tf.Tensor` with the targets.
136
- y_pred: Two tower training outputs. The treatment indicator tensor is used
137
- to slice the true logits or true predictions into control and treatment
138
- losses.
138
+ y_pred: Model outputs. If of type `TwoTowerTrainingOutputs`, the treatment
139
+ indicator tensor is used to slice the true logits or true predictions
140
+ into control and treatment losses.
139
141
  sample_weight: Optional sample weight to compute weighted losses. If
140
142
  given, the sample weight will also be sliced by the treatment indicator
141
143
  tensor to compute the weighted control and treatment losses.
@@ -143,35 +145,49 @@ class LossMetric(tf_keras.metrics.Metric):
143
145
  Raises:
144
146
  TypeError: if `y_pred` is not of type `TwoTowerTrainingOutputs`.
145
147
  """
146
- if not isinstance(y_pred, types.TwoTowerTrainingOutputs):
148
+ if isinstance(y_pred, (tf.Tensor, np.ndarray)):
149
+ if self._slice_by_treatment:
150
+ raise ValueError(
151
+ "`slice_by_treatment` must be False when y_pred is a `tf.Tensor` or"
152
+ " `np.ndarray`."
153
+ )
154
+ pred = y_pred
155
+ elif isinstance(y_pred, types.TwoTowerTrainingOutputs):
156
+ pred = (
157
+ y_pred.true_logits if self._from_logits else y_pred.true_predictions
158
+ )
159
+ else:
147
160
  raise TypeError(
148
- "y_pred must be of type `TwoTowerTrainingOutputs` but got type"
149
- f" {type(y_pred)} instead."
161
+ "y_pred must be of type `TwoTowerTrainingOutputs`, `tf.Tensor` or"
162
+ f" `np.ndarray` but got type {type(y_pred)} instead."
150
163
  )
151
164
 
152
- pred = y_pred.true_logits if self._from_logits else y_pred.true_predictions
165
+ is_treatment = {}
166
+ if self._slice_by_treatment:
167
+ is_treatment["is_treatment"] = y_pred.is_treatment
153
168
 
154
169
  if isinstance(self._loss_fn, tf_keras.metrics.Metric):
155
- self._treatment_sliced_loss.update_state(
170
+ self._loss.update_state(
156
171
  y_true,
157
172
  y_pred=pred,
158
- is_treatment=y_pred.is_treatment,
159
173
  sample_weight=sample_weight,
174
+ **is_treatment,
160
175
  )
161
176
  else:
162
- self._treatment_sliced_loss.update_state(
177
+ self._loss.update_state(
163
178
  values=self._loss_fn(y_true, pred, **self._loss_fn_kwargs),
164
- is_treatment=y_pred.is_treatment,
165
179
  sample_weight=sample_weight,
180
+ **is_treatment,
166
181
  )
167
182
 
168
- def result(self) -> dict[str, tf.Tensor]:
169
- return self._treatment_sliced_loss.result()
183
+ def result(self) -> tf.Tensor | dict[str, tf.Tensor]:
184
+ return self._loss.result()
170
185
 
171
186
  def get_config(self) -> dict[str, Any]:
172
187
  config = super().get_config()
173
188
  config["loss_fn"] = tf_keras.utils.serialize_keras_object(self._loss_fn)
174
189
  config["from_logits"] = self._from_logits
190
+ config["slice_by_treatment"] = self._slice_by_treatment
175
191
  config.update(self._loss_fn_kwargs)
176
192
  return config
177
193
 
@@ -180,4 +196,4 @@ class LossMetric(tf_keras.metrics.Metric):
180
196
  config["loss_fn"] = tf_keras.utils.deserialize_keras_object(
181
197
  config["loss_fn"]
182
198
  )
183
- return LossMetric(**config)
199
+ return cls(**config)
@@ -25,9 +25,7 @@ from official.recommendation.uplift import types
25
25
  from official.recommendation.uplift.metrics import loss_metric
26
26
 
27
27
 
28
- class LossMetricTest(
29
- keras_test_case.KerasTestCase, parameterized.TestCase
30
- ):
28
+ class LossMetricTest(keras_test_case.KerasTestCase, parameterized.TestCase):
31
29
 
32
30
  def _get_outputs(
33
31
  self,
@@ -236,6 +234,28 @@ class LossMetricTest(
236
234
  "loss/treatment": 0.0,
237
235
  },
238
236
  },
237
+ {
238
+ "testcase_name": "no_treatment_slice",
239
+ "loss_fn": tf_keras.losses.binary_crossentropy,
240
+ "from_logits": True,
241
+ "y_true": tf.constant([[0.0, 1.0]]),
242
+ "y_pred": tf.constant([[0.0, 1.0]]),
243
+ "is_treatment": tf.constant([[0], [0]]),
244
+ "sample_weight": None,
245
+ "expected_losses": 0.50320446,
246
+ "slice_by_treatment": False,
247
+ },
248
+ {
249
+ "testcase_name": "no_treatment_slice_metric",
250
+ "loss_fn": tf_keras.metrics.BinaryCrossentropy(from_logits=False),
251
+ "from_logits": False,
252
+ "y_true": tf.constant([[0.0, 1.0]]),
253
+ "y_pred": tf.constant([[0.0, 1.0]]),
254
+ "is_treatment": tf.constant([[0], [0]]),
255
+ "sample_weight": None,
256
+ "expected_losses": 0,
257
+ "slice_by_treatment": False,
258
+ },
239
259
  )
240
260
  def test_metric_computes_sliced_losses(
241
261
  self,
@@ -245,7 +265,8 @@ class LossMetricTest(
245
265
  y_pred: tf.Tensor,
246
266
  is_treatment: tf.Tensor,
247
267
  sample_weight: tf.Tensor | None,
248
- expected_losses: dict[str, float],
268
+ expected_losses: float | dict[str, float],
269
+ slice_by_treatment: bool = True,
249
270
  ):
250
271
  if from_logits:
251
272
  true_logits = y_pred
@@ -254,7 +275,11 @@ class LossMetricTest(
254
275
  true_logits = tf.zeros_like(y_pred) # Irrelevant for testing.
255
276
  true_predictions = y_pred
256
277
 
257
- metric = loss_metric.LossMetric(loss_fn=loss_fn, from_logits=from_logits)
278
+ metric = loss_metric.LossMetric(
279
+ loss_fn=loss_fn,
280
+ from_logits=from_logits,
281
+ slice_by_treatment=slice_by_treatment,
282
+ )
258
283
  outputs = self._get_outputs(
259
284
  true_logits=true_logits,
260
285
  true_predictions=true_predictions,
@@ -263,6 +288,19 @@ class LossMetricTest(
263
288
  metric(y_true, outputs, sample_weight=sample_weight)
264
289
  self.assertEqual(expected_losses, metric.result())
265
290
 
291
+ def test_metric_with_y_pred_tensor(self):
292
+ y_true = tf.constant([[0], [0], [2], [7]])
293
+ y_pred = tf.constant([[1], [2], [3], [4]])
294
+ sample_weight = tf.constant([[0.5], [0.5], [0.7], [1.8]])
295
+
296
+ metric = loss_metric.LossMetric(
297
+ loss_fn=tf_keras.metrics.mae, slice_by_treatment=False
298
+ )
299
+ metric(y_true, y_pred, sample_weight)
300
+
301
+ expected_loss = np.average([1, 2, 1, 3], weights=[0.5, 0.5, 0.7, 1.8])
302
+ self.assertAllClose(expected_loss, metric.result())
303
+
266
304
  def test_multiple_update_batches_returns_aggregated_sliced_losses(self):
267
305
  metric = loss_metric.LossMetric(
268
306
  loss_fn=tf_keras.losses.mean_absolute_error,
@@ -335,17 +373,28 @@ class LossMetricTest(
335
373
  metric.reset_states()
336
374
  self.assertEqual(expected_initial_result, metric.result())
337
375
 
338
- @parameterized.parameters(
339
- tf_keras.losses.binary_crossentropy,
340
- tf_keras.metrics.BinaryCrossentropy(from_logits=True, name="bce_loss"),
376
+ @parameterized.product(
377
+ loss_fn=(
378
+ tf_keras.losses.binary_crossentropy,
379
+ tf_keras.metrics.BinaryCrossentropy(
380
+ from_logits=True, name="bce_loss"
381
+ ),
382
+ ),
383
+ slice_by_treatment=(True, False),
341
384
  )
342
385
  def test_metric_is_configurable(
343
386
  self,
344
387
  loss_fn: (
345
388
  Callable[[tf.Tensor, tf.Tensor], tf.Tensor] | tf_keras.metrics.Metric
346
389
  ),
390
+ slice_by_treatment: bool,
347
391
  ):
348
- metric = loss_metric.LossMetric(loss_fn, from_logits=True, name="bce_loss")
392
+ metric = loss_metric.LossMetric(
393
+ loss_fn,
394
+ from_logits=True,
395
+ slice_by_treatment=slice_by_treatment,
396
+ name="bce_loss",
397
+ )
349
398
  self.assertLayerConfigurable(
350
399
  layer=metric,
351
400
  y_true=tf.constant([[1], [1], [0]]),
@@ -361,8 +410,26 @@ class LossMetricTest(
361
410
  metric = loss_metric.LossMetric(
362
411
  tf_keras.metrics.mean_absolute_percentage_error
363
412
  )
413
+ y_true = tf.ones((3, 1))
414
+ y_pred = types.TwoTowerNetworkOutputs(
415
+ shared_embedding=tf.ones((3, 5)),
416
+ control_logits=tf.ones((3, 1)),
417
+ treatment_logits=tf.ones((3, 1)),
418
+ )
419
+ with self.assertRaisesRegex(
420
+ TypeError,
421
+ "y_pred must be of type `TwoTowerTrainingOutputs`, `tf.Tensor` or"
422
+ " `np.ndarray`",
423
+ ):
424
+ metric.update_state(y_true=y_true, y_pred=y_pred)
425
+
426
+ def test_slice_by_treatment_with_y_pred_tensor_raises_error(self):
427
+ metric = loss_metric.LossMetric(
428
+ tf_keras.metrics.mae, slice_by_treatment=True
429
+ )
364
430
  with self.assertRaisesRegex(
365
- TypeError, "y_pred must be of type `TwoTowerTrainingOutputs`"
431
+ ValueError,
432
+ "`slice_by_treatment` must be False when y_pred is a `tf.Tensor`.",
366
433
  ):
367
434
  metric.update_state(y_true=tf.ones((3, 1)), y_pred=tf.ones((3, 1)))
368
435
 
@@ -15,6 +15,7 @@
15
15
  """TensorFlow Models Libraries."""
16
16
  # pylint: disable=wildcard-import
17
17
  from tensorflow_models import nlp
18
+ from tensorflow_models import uplift
18
19
  from tensorflow_models import vision
19
20
 
20
21
  from official import core
@@ -35,6 +35,17 @@ class TensorflowModelsTest(tf.test.TestCase):
35
35
  _ = tfm.optimization.LinearWarmup(
36
36
  after_warmup_lr_sched=0.0, warmup_steps=10, warmup_learning_rate=0.1)
37
37
 
38
+ def testUpliftImports(self):
39
+ _ = tfm.uplift.keys.TwoTowerOutputKeys.CONTROL_PREDICTIONS
40
+ _ = tfm.uplift.types.TwoTowerNetworkOutputs(
41
+ shared_embedding=tf.ones((10, 10)),
42
+ control_logits=tf.ones((10, 1)),
43
+ treatment_logits=tf.ones((10, 1)),
44
+ )
45
+ _ = tfm.uplift.layers.encoders.concat_features.ConcatFeatures(['feature'])
46
+ _ = tfm.uplift.metrics.treatment_fraction.TreatmentFraction()
47
+ _ = tfm.uplift.losses.true_logits_loss.TrueLogitsLoss(tf_keras.losses.mse)
48
+
38
49
 
39
50
  if __name__ == '__main__':
40
51
  tf.test.main()
@@ -0,0 +1,23 @@
1
+ # Copyright 2024 The TensorFlow Authors. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ """TensorFlow Models Uplift Libraries."""
16
+
17
+ from official.recommendation.uplift import keys
18
+ from official.recommendation.uplift import layers
19
+ from official.recommendation.uplift import losses
20
+ from official.recommendation.uplift import metrics
21
+ from official.recommendation.uplift import models
22
+ from official.recommendation.uplift import types
23
+ from official.recommendation.uplift import utils
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: tf-models-nightly
3
- Version: 2.17.0.dev20240409
3
+ Version: 2.17.0.dev20240411
4
4
  Summary: TensorFlow Official Models
5
5
  Home-page: https://github.com/tensorflow/models
6
6
  Author: Google Inc.
@@ -218,7 +218,7 @@ official/modeling/multitask/base_trainer_test.py,sha256=qJ7z4kid2XAX6hOIvUHa7dwq
218
218
  official/modeling/multitask/configs.py,sha256=ZO2waQrMn9CAgyFpsmeQvplCF5VeXz7tCPmIuy5jvlc,3164
219
219
  official/modeling/multitask/evaluator.py,sha256=spDm2X8EX62qsxI2ehVjrkIKoo-omQQOYcAVKZNgxHc,6078
220
220
  official/modeling/multitask/evaluator_test.py,sha256=vU-q-gM7GqiMqE5zbBnOT8mPFhQmHjniMyNnwganhso,4643
221
- official/modeling/multitask/interleaving_trainer.py,sha256=ZZHKsqbJKLqvwtgy-PUv_S_8bDG0MhJDNwWICY_IF6Q,4458
221
+ official/modeling/multitask/interleaving_trainer.py,sha256=G4jwnWywn9tlEkdHgN8BApA3ymXFHIGnquq8rbVVBHo,4463
222
222
  official/modeling/multitask/interleaving_trainer_test.py,sha256=MeQQxpcinPTQuTrAcITjwHa2bAj-XCBCqYsrbxPBus8,4305
223
223
  official/modeling/multitask/multitask.py,sha256=DV-ysfhPiIZgsrzZNylsPBxKNBf_xzPxJYjF4buWVgE,5948
224
224
  official/modeling/multitask/task_sampler.py,sha256=SGVVdjMb5oG4vnCczpfdgBtbsdsXiyBLl9si_0V6nko,4897
@@ -912,8 +912,8 @@ official/recommendation/uplift/metrics/label_mean.py,sha256=ECaes7FZmsksnwySn7jf
912
912
  official/recommendation/uplift/metrics/label_mean_test.py,sha256=b_d3lNlpkDm2xKLUkxfiXeQg7pjL8HNx7y9NaYarpV0,7083
913
913
  official/recommendation/uplift/metrics/label_variance.py,sha256=9DCl42BJkehxfWD3pSbZnRNvwfhVM6VyHwivGdaU72s,3610
914
914
  official/recommendation/uplift/metrics/label_variance_test.py,sha256=k0mdEU1WU53-HIEO5HGtfp1MleifD-h4bZNKtTvM3Ws,7681
915
- official/recommendation/uplift/metrics/loss_metric.py,sha256=8Lfi4FNR6uj8eLSdT5t0XjEzTZtwL-xv5e5KNGzrYWU,6498
916
- official/recommendation/uplift/metrics/loss_metric_test.py,sha256=yropE1t8PblsJ_kJEno5ratkY_ka81PHgcfroWtRKVI,13768
915
+ official/recommendation/uplift/metrics/loss_metric.py,sha256=owN7A98TCc_UhOURvGfccaoVGOthdHdx1_fawEUGnmw,7289
916
+ official/recommendation/uplift/metrics/loss_metric_test.py,sha256=48rQG8bKFdy0xBFjoOLXKRUlYpCEyAzSmPOFoF7FX94,16021
917
917
  official/recommendation/uplift/metrics/metric_configs.py,sha256=Z-r79orE4EycQ5TJ7xdI5LhjOHT3wzChYyDxcxGqLXk,1670
918
918
  official/recommendation/uplift/metrics/sliced_metric.py,sha256=O2I2apZK6IfOQK9Q_mgSiTUCnGokczp4e14zrrYNeRU,8564
919
919
  official/recommendation/uplift/metrics/sliced_metric_test.py,sha256=dhY41X8lqT_WW04XLjyjDerZwujEBGeTXtxf4NkYThw,11359
@@ -1199,13 +1199,14 @@ orbit/utils/summary_manager.py,sha256=oTdTQYDjH315rbJ__NFALldruHX5lLrwY34IU1KJwN
1199
1199
  orbit/utils/summary_manager_interface.py,sha256=MXXPd3aWqushByK-gh-Jk9A42VC5ETEEm7XY5DCB-9w,2253
1200
1200
  orbit/utils/tpu_summaries.py,sha256=vjfLJlNifFJayLo_nkdRD85XoisVBV2VDuzgZWZud6U,5641
1201
1201
  orbit/utils/tpu_summaries_test.py,sha256=ZRYguds3BcXn1gOXBHVJ5rGRZdeXQLa5w3IbwEBwGS4,4523
1202
- tensorflow_models/__init__.py,sha256=etxw45SHxuwFCRX5qGxGMP83II0JfJulzNl5GSNJvhw,909
1203
- tensorflow_models/tensorflow_models_test.py,sha256=AxUYUdiQn416UR7jg0h6rmv688esvlKDfpyDCIQkF18,1395
1202
+ tensorflow_models/__init__.py,sha256=n7s5ZGPDM-RqOQNldPyipjL8aEB4DdAQQUENYhgf_Q8,946
1203
+ tensorflow_models/tensorflow_models_test.py,sha256=nc6A9K53OGqF25xN5St8EiWvdVbdanoDB12hb32dzPc,1897
1204
1204
  tensorflow_models/nlp/__init__.py,sha256=4tA5Pf4qaFwT-fIFOpX7x7FHJpnyJT-5UgOeFYTyMlc,807
1205
+ tensorflow_models/uplift/__init__.py,sha256=mqfa55gweOdpKoaQyid4A_4u7xw__FcQeSIF0k_pYmI,999
1205
1206
  tensorflow_models/vision/__init__.py,sha256=zBorY_v5xva1uI-qxhZO3Qh-Dii-Suq6wEYh6hKHDfc,833
1206
- tf_models_nightly-2.17.0.dev20240409.dist-info/AUTHORS,sha256=1dG3fXVu9jlo7bul8xuix5F5vOnczMk7_yWn4y70uw0,337
1207
- tf_models_nightly-2.17.0.dev20240409.dist-info/LICENSE,sha256=WxeBS_DejPZQabxtfMOM_xn8qoZNJDQjrT7z2wG1I4U,11512
1208
- tf_models_nightly-2.17.0.dev20240409.dist-info/METADATA,sha256=738N3KUX3sKTeF-7mDL3_2r1htitc4BCT9A4QMgB9U4,1432
1209
- tf_models_nightly-2.17.0.dev20240409.dist-info/WHEEL,sha256=kGT74LWyRUZrL4VgLh6_g12IeVl_9u9ZVhadrgXZUEY,110
1210
- tf_models_nightly-2.17.0.dev20240409.dist-info/top_level.txt,sha256=gum2FfO5R4cvjl2-QtP-S1aNmsvIZaFFT6VFzU0f4-g,33
1211
- tf_models_nightly-2.17.0.dev20240409.dist-info/RECORD,,
1207
+ tf_models_nightly-2.17.0.dev20240411.dist-info/AUTHORS,sha256=1dG3fXVu9jlo7bul8xuix5F5vOnczMk7_yWn4y70uw0,337
1208
+ tf_models_nightly-2.17.0.dev20240411.dist-info/LICENSE,sha256=WxeBS_DejPZQabxtfMOM_xn8qoZNJDQjrT7z2wG1I4U,11512
1209
+ tf_models_nightly-2.17.0.dev20240411.dist-info/METADATA,sha256=I12qTeIZ3Y8oc91Y2TGdZ1WonCJu2KZaGuZdmIB7aa0,1432
1210
+ tf_models_nightly-2.17.0.dev20240411.dist-info/WHEEL,sha256=kGT74LWyRUZrL4VgLh6_g12IeVl_9u9ZVhadrgXZUEY,110
1211
+ tf_models_nightly-2.17.0.dev20240411.dist-info/top_level.txt,sha256=gum2FfO5R4cvjl2-QtP-S1aNmsvIZaFFT6VFzU0f4-g,33
1212
+ tf_models_nightly-2.17.0.dev20240411.dist-info/RECORD,,