tf-models-nightly 2.17.0.dev20240408__py2.py3-none-any.whl → 2.17.0.dev20240410__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.
@@ -40,7 +40,7 @@ class LossMetric(tf_keras.metrics.Metric):
40
40
  ... true_logits=tf.constant([1, 2, 3, 4])
41
41
  ... is_treatment=tf.constant([True, False, True, False]),
42
42
  ... )
43
- >>> sliced_loss(y_true=tf.zeros(4), y_pred=y_pred)
43
+ >>> sliced_loss(y_true=y_true, y_pred=y_pred)
44
44
  {
45
45
  "loss": 2.5
46
46
  "loss/control": 4.0
@@ -58,8 +58,11 @@ class LossMetric(tf_keras.metrics.Metric):
58
58
 
59
59
  def __init__(
60
60
  self,
61
- loss_fn: Callable[[tf.Tensor, tf.Tensor], tf.Tensor],
61
+ loss_fn: (
62
+ Callable[[tf.Tensor, tf.Tensor], tf.Tensor] | tf_keras.metrics.Metric
63
+ ),
62
64
  from_logits: bool = True,
65
+ slice_by_treatment: bool = True,
63
66
  name: str = "loss",
64
67
  dtype: tf.DType = tf.float32,
65
68
  **loss_fn_kwargs,
@@ -67,27 +70,61 @@ class LossMetric(tf_keras.metrics.Metric):
67
70
  """Initializes the instance.
68
71
 
69
72
  Args:
70
- loss_fn: The loss function to apply between the targets and model outputs,
71
- with signature `loss_fn(y_true, y_pred, **loss_fn_kwargs)`.
73
+ loss_fn: The loss function or Keras metric to apply with call signature
74
+ `__call__(y_true: tf,Tensor, y_pred: tf.Tensor, **loss_fn_kwargs)`. Note
75
+ that the `loss_fn_kwargs` will not be passed to the `__call__` method if
76
+ `loss_fn` is a Keras metric.
72
77
  from_logits: Specifies whether the true logits or true predictions should
73
78
  be used from the model outputs to compute the loss. Defaults to using
74
79
  the true logits.
75
- name: Optional name for the instance.
76
- dtype: Optional data type for the instance.
80
+ slice_by_treatment: Specifies whether the loss should be sliced by the
81
+ treatment indicator tensor. If `True`, `loss_fn` will be wrapped in a
82
+ `TreatmentSlicedMetric` to report the loss values sliced by the
83
+ treatment group.
84
+ name: Optional name for the instance. If `loss_fn` is a Keras metric then
85
+ its name will be used instead.
86
+ dtype: Optional data type for the instance. If `loss_fn` is a Keras metric
87
+ then its `dtype` will be used instead.
77
88
  **loss_fn_kwargs: The keyword arguments that are passed on to `loss_fn`.
89
+ These arguments will be ignored if `loss_fn` is a Keras metric.
78
90
  """
91
+ # Do not accept Loss objects as they reduce tensors before weighting.
92
+ if isinstance(loss_fn, tf_keras.losses.Loss):
93
+ raise TypeError(
94
+ "`loss_fn` cannot be a Keras `Loss` object, pass a non-reducing loss"
95
+ " function or a metric instance instead."
96
+ )
97
+
98
+ if isinstance(loss_fn, tf_keras.metrics.Metric):
99
+ name = loss_fn.name
100
+ dtype = loss_fn.dtype
101
+
79
102
  super().__init__(name=name, dtype=dtype)
80
103
 
81
104
  self._loss_fn = loss_fn
82
105
  self._from_logits = from_logits
83
106
  self._loss_fn_kwargs = loss_fn_kwargs
107
+ self._slice_by_treatment = slice_by_treatment
108
+
109
+ if isinstance(loss_fn, tf_keras.metrics.Metric):
110
+ metric_from_logits = loss_fn.get_config().get("from_logits", from_logits)
111
+ if from_logits != metric_from_logits:
112
+ raise ValueError(
113
+ f"Value passed to `from_logits` ({from_logits}) is conflicting with"
114
+ " the `from_logits` value passed to the `loss_fn` metric"
115
+ f" ({metric_from_logits}). Ensure that they have the same value."
116
+ )
117
+ loss_metric = loss_fn
84
118
 
85
- if "from_logits" in inspect.signature(loss_fn).parameters:
86
- self._loss_fn_kwargs.update({"from_logits": from_logits})
119
+ else:
120
+ if "from_logits" in inspect.signature(loss_fn).parameters:
121
+ self._loss_fn_kwargs.update({"from_logits": from_logits})
122
+ loss_metric = tf_keras.metrics.Mean(name=name, dtype=dtype)
87
123
 
88
- self._treatment_sliced_loss = treatment_sliced_metric.TreatmentSlicedMetric(
89
- tf_keras.metrics.Mean(name=name, dtype=dtype)
90
- )
124
+ if slice_by_treatment:
125
+ self._loss = treatment_sliced_metric.TreatmentSlicedMetric(loss_metric)
126
+ else:
127
+ self._loss = loss_metric
91
128
 
92
129
  def update_state(
93
130
  self,
@@ -115,24 +152,34 @@ class LossMetric(tf_keras.metrics.Metric):
115
152
  f" {type(y_pred)} instead."
116
153
  )
117
154
 
118
- if self._from_logits:
119
- loss = self._loss_fn(y_true, y_pred.true_logits)
120
- else:
121
- loss = self._loss_fn(y_true, y_pred.true_predictions)
155
+ pred = y_pred.true_logits if self._from_logits else y_pred.true_predictions
122
156
 
123
- self._treatment_sliced_loss.update_state(
124
- values=loss,
125
- is_treatment=y_pred.is_treatment,
126
- sample_weight=sample_weight,
127
- )
157
+ is_treatment = {}
158
+ if self._slice_by_treatment:
159
+ is_treatment["is_treatment"] = y_pred.is_treatment
160
+
161
+ if isinstance(self._loss_fn, tf_keras.metrics.Metric):
162
+ self._loss.update_state(
163
+ y_true,
164
+ y_pred=pred,
165
+ sample_weight=sample_weight,
166
+ **is_treatment,
167
+ )
168
+ else:
169
+ self._loss.update_state(
170
+ values=self._loss_fn(y_true, pred, **self._loss_fn_kwargs),
171
+ sample_weight=sample_weight,
172
+ **is_treatment,
173
+ )
128
174
 
129
- def result(self) -> dict[str, tf.Tensor]:
130
- return self._treatment_sliced_loss.result()
175
+ def result(self) -> tf.Tensor | dict[str, tf.Tensor]:
176
+ return self._loss.result()
131
177
 
132
178
  def get_config(self) -> dict[str, Any]:
133
179
  config = super().get_config()
134
180
  config["loss_fn"] = tf_keras.utils.serialize_keras_object(self._loss_fn)
135
181
  config["from_logits"] = self._from_logits
182
+ config["slice_by_treatment"] = self._slice_by_treatment
136
183
  config.update(self._loss_fn_kwargs)
137
184
  return config
138
185
 
@@ -141,4 +188,4 @@ class LossMetric(tf_keras.metrics.Metric):
141
188
  config["loss_fn"] = tf_keras.utils.deserialize_keras_object(
142
189
  config["loss_fn"]
143
190
  )
144
- return LossMetric(**config)
191
+ 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 TrueLogitsTreatmentLossTest(
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,
@@ -64,6 +62,20 @@ class TrueLogitsTreatmentLossTest(
64
62
  "loss/treatment": 1.0,
65
63
  },
66
64
  },
65
+ {
66
+ "testcase_name": "unweighted_metric",
67
+ "loss_fn": tf_keras.metrics.MeanSquaredError(name="loss"),
68
+ "from_logits": False,
69
+ "y_true": tf.constant([[0], [0], [2], [2]]),
70
+ "y_pred": tf.constant([[1], [2], [3], [4]]),
71
+ "is_treatment": tf.constant([[True], [False], [True], [False]]),
72
+ "sample_weight": None,
73
+ "expected_losses": {
74
+ "loss": 2.5,
75
+ "loss/control": 4.0,
76
+ "loss/treatment": 1.0,
77
+ },
78
+ },
67
79
  {
68
80
  "testcase_name": "weighted",
69
81
  "loss_fn": tf_keras.losses.mean_absolute_error,
@@ -78,6 +90,20 @@ class TrueLogitsTreatmentLossTest(
78
90
  "loss/treatment": 1.0,
79
91
  },
80
92
  },
93
+ {
94
+ "testcase_name": "weighted_keras_metric",
95
+ "loss_fn": tf_keras.metrics.MeanAbsoluteError(name="loss"),
96
+ "from_logits": False,
97
+ "y_true": tf.constant([[0], [0], [2], [7]]),
98
+ "y_pred": tf.constant([[1], [2], [3], [4]]),
99
+ "is_treatment": tf.constant([[True], [False], [True], [False]]),
100
+ "sample_weight": tf.constant([[0.5], [0.5], [0.7], [1.8]]),
101
+ "expected_losses": {
102
+ "loss": np.average([1, 2, 1, 3], weights=[0.5, 0.5, 0.7, 1.8]),
103
+ "loss/control": np.average([2, 3], weights=[0.5, 1.8]),
104
+ "loss/treatment": 1.0,
105
+ },
106
+ },
81
107
  {
82
108
  "testcase_name": "only_control",
83
109
  "loss_fn": tf_keras.metrics.mean_squared_error,
@@ -92,6 +118,20 @@ class TrueLogitsTreatmentLossTest(
92
118
  "loss/treatment": 0.0,
93
119
  },
94
120
  },
121
+ {
122
+ "testcase_name": "only_control_metric",
123
+ "loss_fn": tf_keras.metrics.MeanSquaredError(name="loss"),
124
+ "from_logits": False,
125
+ "y_true": tf.constant([[0], [1], [5]]),
126
+ "y_pred": tf.constant([[1], [2], [5]]),
127
+ "is_treatment": tf.constant([[False], [False], [False]]),
128
+ "sample_weight": tf.constant([1, 0, 1]),
129
+ "expected_losses": {
130
+ "loss": 0.5,
131
+ "loss/control": 0.5,
132
+ "loss/treatment": 0.0,
133
+ },
134
+ },
95
135
  {
96
136
  "testcase_name": "only_treatment",
97
137
  "loss_fn": tf_keras.metrics.mean_absolute_error,
@@ -106,6 +146,20 @@ class TrueLogitsTreatmentLossTest(
106
146
  "loss/treatment": 0.5,
107
147
  },
108
148
  },
149
+ {
150
+ "testcase_name": "only_treatment_metric",
151
+ "loss_fn": tf_keras.metrics.MeanAbsoluteError(name="loss"),
152
+ "from_logits": False,
153
+ "y_true": tf.constant([[0], [1], [5]]),
154
+ "y_pred": tf.constant([[1], [2], [5]]),
155
+ "is_treatment": tf.constant([[True], [True], [True]]),
156
+ "sample_weight": tf.constant([1, 0, 1]),
157
+ "expected_losses": {
158
+ "loss": 0.5,
159
+ "loss/control": 0.0,
160
+ "loss/treatment": 0.5,
161
+ },
162
+ },
109
163
  {
110
164
  "testcase_name": "one_entry",
111
165
  "loss_fn": tf.nn.log_poisson_loss,
@@ -138,6 +192,70 @@ class TrueLogitsTreatmentLossTest(
138
192
  "loss/treatment": 0.0,
139
193
  },
140
194
  },
195
+ {
196
+ "testcase_name": "no_entry_metric",
197
+ "loss_fn": tf_keras.metrics.BinaryCrossentropy(name="loss"),
198
+ "from_logits": False,
199
+ "y_true": tf.constant([[]]),
200
+ "y_pred": tf.constant([[]]),
201
+ "is_treatment": tf.constant([[]]),
202
+ "sample_weight": tf.constant([[]]),
203
+ "expected_losses": {
204
+ "loss": 0.0,
205
+ "loss/control": 0.0,
206
+ "loss/treatment": 0.0,
207
+ },
208
+ },
209
+ {
210
+ "testcase_name": "auc_metric",
211
+ "loss_fn": tf_keras.metrics.AUC(from_logits=True, name="loss"),
212
+ "from_logits": True,
213
+ "y_true": tf.constant([[0], [0], [1], [1]]),
214
+ "y_pred": tf.constant([[0], [0.5], [0.3], [0.9]]),
215
+ "is_treatment": tf.constant([[1], [1], [1], [1]]),
216
+ "sample_weight": None,
217
+ "expected_losses": {
218
+ "loss": 0.75,
219
+ "loss/control": 0.0,
220
+ "loss/treatment": 0.75,
221
+ },
222
+ },
223
+ {
224
+ "testcase_name": "loss_fn_with_from_logits",
225
+ "loss_fn": tf_keras.losses.binary_crossentropy,
226
+ "from_logits": True,
227
+ "y_true": tf.constant([[0.0, 1.0]]),
228
+ "y_pred": tf.constant([[0.0, 1.0]]),
229
+ "is_treatment": tf.constant([[0], [0]]),
230
+ "sample_weight": None,
231
+ "expected_losses": {
232
+ "loss": 0.50320446,
233
+ "loss/control": 0.50320446,
234
+ "loss/treatment": 0.0,
235
+ },
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
+ },
141
259
  )
142
260
  def test_metric_computes_sliced_losses(
143
261
  self,
@@ -147,7 +265,8 @@ class TrueLogitsTreatmentLossTest(
147
265
  y_pred: tf.Tensor,
148
266
  is_treatment: tf.Tensor,
149
267
  sample_weight: tf.Tensor | None,
150
- expected_losses: dict[str, float],
268
+ expected_losses: float | dict[str, float],
269
+ slice_by_treatment: bool = True,
151
270
  ):
152
271
  if from_logits:
153
272
  true_logits = y_pred
@@ -156,7 +275,11 @@ class TrueLogitsTreatmentLossTest(
156
275
  true_logits = tf.zeros_like(y_pred) # Irrelevant for testing.
157
276
  true_predictions = y_pred
158
277
 
159
- 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
+ )
160
283
  outputs = self._get_outputs(
161
284
  true_logits=true_logits,
162
285
  true_predictions=true_predictions,
@@ -237,9 +360,27 @@ class TrueLogitsTreatmentLossTest(
237
360
  metric.reset_states()
238
361
  self.assertEqual(expected_initial_result, metric.result())
239
362
 
240
- def test_metric_is_configurable(self):
363
+ @parameterized.product(
364
+ loss_fn=(
365
+ tf_keras.losses.binary_crossentropy,
366
+ tf_keras.metrics.BinaryCrossentropy(
367
+ from_logits=True, name="bce_loss"
368
+ ),
369
+ ),
370
+ slice_by_treatment=(True, False),
371
+ )
372
+ def test_metric_is_configurable(
373
+ self,
374
+ loss_fn: (
375
+ Callable[[tf.Tensor, tf.Tensor], tf.Tensor] | tf_keras.metrics.Metric
376
+ ),
377
+ slice_by_treatment: bool,
378
+ ):
241
379
  metric = loss_metric.LossMetric(
242
- tf_keras.losses.binary_crossentropy, from_logits=True, name="bce_loss"
380
+ loss_fn,
381
+ from_logits=True,
382
+ slice_by_treatment=slice_by_treatment,
383
+ name="bce_loss",
243
384
  )
244
385
  self.assertLayerConfigurable(
245
386
  layer=metric,
@@ -261,6 +402,19 @@ class TrueLogitsTreatmentLossTest(
261
402
  ):
262
403
  metric.update_state(y_true=tf.ones((3, 1)), y_pred=tf.ones((3, 1)))
263
404
 
405
+ def test_passing_loss_object_raises_error(self):
406
+ with self.assertRaisesRegex(
407
+ TypeError, "`loss_fn` cannot be a Keras `Loss` object"
408
+ ):
409
+ loss_metric.LossMetric(loss_fn=tf_keras.losses.MeanAbsoluteError())
410
+
411
+ def test_conflicting_from_logits_values_raises_error(self):
412
+ with self.assertRaises(ValueError):
413
+ loss_metric.LossMetric(
414
+ loss_fn=tf_keras.metrics.BinaryCrossentropy(from_logits=True),
415
+ from_logits=False,
416
+ )
417
+
264
418
 
265
419
  if __name__ == "__main__":
266
420
  tf.test.main()
@@ -39,11 +39,11 @@ class Parser(parser.Parser):
39
39
 
40
40
  def __init__(self,
41
41
  output_size,
42
- min_level,
42
+ min_level: int | None,
43
43
  max_level,
44
- num_scales,
45
- aspect_ratios,
46
- anchor_size,
44
+ num_scales: int | None,
45
+ aspect_ratios: list[float] | None,
46
+ anchor_size: float | None,
47
47
  match_threshold=0.5,
48
48
  unmatched_threshold=0.5,
49
49
  box_coder_weights=None,
@@ -63,20 +63,28 @@ class Parser(parser.Parser):
63
63
  keep_aspect_ratio=True):
64
64
  """Initializes parameters for parsing annotations in the dataset.
65
65
 
66
+ If one provides `input_anchor` when calling `_parse_eval_data()` and
67
+ `_parse_train_data()`, the `min_level`, `num_scales`, `aspect_ratios`, and
68
+ `anchor_size` can be `None`.
69
+
66
70
  Args:
67
71
  output_size: `Tensor` or `list` for [height, width] of output image. The
68
72
  output_size should be divided by the largest feature stride 2^max_level.
69
73
  min_level: `int` number of minimum level of the output feature pyramid.
74
+ Can be `None` if `input_anchor` is provided in `_parse_*_data()`.
70
75
  max_level: `int` number of maximum level of the output feature pyramid.
71
76
  num_scales: `int` number representing intermediate scales added on each
72
77
  level. For instances, num_scales=2 adds one additional intermediate
73
- anchor scales [2^0, 2^0.5] on each level.
78
+ anchor scales [2^0, 2^0.5] on each level. Can be `None` if
79
+ `input_anchor` is provided in `_parse_*_data()`.
74
80
  aspect_ratios: `list` of float numbers representing the aspect ratio
75
81
  anchors added on each level. The number indicates the ratio of width to
76
82
  height. For instances, aspect_ratios=[1.0, 2.0, 0.5] adds three anchors
77
- on each scale level.
83
+ on each scale level. Can be `None` if `input_anchor` is provided in
84
+ `_parse_*_data()`.
78
85
  anchor_size: `float` number representing the scale of size of the base
79
- anchor to the feature stride 2^level.
86
+ anchor to the feature stride 2^level. Can be `None` if `input_anchor` is
87
+ provided in `_parse_*_data()`.
80
88
  match_threshold: `float` number between 0 and 1 representing the
81
89
  lower-bound threshold to assign positive labels for anchors. An anchor
82
90
  with a score over the threshold is labeled positive.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: tf-models-nightly
3
- Version: 2.17.0.dev20240408
3
+ Version: 2.17.0.dev20240410
4
4
  Summary: TensorFlow Official Models
5
5
  Home-page: https://github.com/tensorflow/models
6
6
  Author: Google Inc.
@@ -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=8GAcqehBgHVz0TZn6obRhyQlLhz_-jmIpP0EAvJLBYI,4870
916
- official/recommendation/uplift/metrics/loss_metric_test.py,sha256=IwbWd6PQOYG4uGzobWNxP2Mh6PrVTEcFV_-6GGxaJTU,9346
915
+ official/recommendation/uplift/metrics/loss_metric.py,sha256=qWMcLk1JmLkru5T9qcqO2UbB_AJQKjQ8uUSAxjR1l58,6883
916
+ official/recommendation/uplift/metrics/loss_metric_test.py,sha256=QIUujZvUud-A2itI2vs2KpzWfLwbq2XDd9H9CFq5D4Y,14929
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
@@ -987,7 +987,7 @@ official/vision/dataloaders/input_reader.py,sha256=CHojw8PJKf74jl8Q3rtH2ylwhmTYg
987
987
  official/vision/dataloaders/input_reader_factory.py,sha256=WpvSA8qyqAo3wkmme4WqXpICBVg0SuR6_nNWHZ0ECM0,1623
988
988
  official/vision/dataloaders/maskrcnn_input.py,sha256=iCc08yYD-7mvIPojgBjm_nSvoQACXWCIeZNZN8CfXSs,16822
989
989
  official/vision/dataloaders/parser.py,sha256=nMXnhigMa_ascSJ2OK88xi4HdE9xvfL3G4oMrHau-t4,2315
990
- official/vision/dataloaders/retinanet_input.py,sha256=joxJL4hQVPw-FW5iUc7RsxP60N7iYGRuVFpU3gC5flE,18291
990
+ official/vision/dataloaders/retinanet_input.py,sha256=bU1fDpJuOtBZVJSg3Fzaku2PjxHh22E4d3M7B3Vu8ZQ,18831
991
991
  official/vision/dataloaders/segmentation_input.py,sha256=Klg5KAChYZDRvqzZfyIzdPy54rTlWYZp2AotolD3WX8,12934
992
992
  official/vision/dataloaders/tf_example_decoder.py,sha256=9yCT6uSLMpmw50w7zdaRR_BXy6vIvliLZntrYAgzD18,8647
993
993
  official/vision/dataloaders/tf_example_decoder_test.py,sha256=PHxneXHn5-eIMdmk1uI4IPLa178kTCifa4EF53ik2Jo,12629
@@ -1203,9 +1203,9 @@ tensorflow_models/__init__.py,sha256=etxw45SHxuwFCRX5qGxGMP83II0JfJulzNl5GSNJvhw
1203
1203
  tensorflow_models/tensorflow_models_test.py,sha256=AxUYUdiQn416UR7jg0h6rmv688esvlKDfpyDCIQkF18,1395
1204
1204
  tensorflow_models/nlp/__init__.py,sha256=4tA5Pf4qaFwT-fIFOpX7x7FHJpnyJT-5UgOeFYTyMlc,807
1205
1205
  tensorflow_models/vision/__init__.py,sha256=zBorY_v5xva1uI-qxhZO3Qh-Dii-Suq6wEYh6hKHDfc,833
1206
- tf_models_nightly-2.17.0.dev20240408.dist-info/AUTHORS,sha256=1dG3fXVu9jlo7bul8xuix5F5vOnczMk7_yWn4y70uw0,337
1207
- tf_models_nightly-2.17.0.dev20240408.dist-info/LICENSE,sha256=WxeBS_DejPZQabxtfMOM_xn8qoZNJDQjrT7z2wG1I4U,11512
1208
- tf_models_nightly-2.17.0.dev20240408.dist-info/METADATA,sha256=ZfIoWf-Y-2LFztes6-vBXDsnvSy86Bb-ZAEF6o1Vpi8,1432
1209
- tf_models_nightly-2.17.0.dev20240408.dist-info/WHEEL,sha256=kGT74LWyRUZrL4VgLh6_g12IeVl_9u9ZVhadrgXZUEY,110
1210
- tf_models_nightly-2.17.0.dev20240408.dist-info/top_level.txt,sha256=gum2FfO5R4cvjl2-QtP-S1aNmsvIZaFFT6VFzU0f4-g,33
1211
- tf_models_nightly-2.17.0.dev20240408.dist-info/RECORD,,
1206
+ tf_models_nightly-2.17.0.dev20240410.dist-info/AUTHORS,sha256=1dG3fXVu9jlo7bul8xuix5F5vOnczMk7_yWn4y70uw0,337
1207
+ tf_models_nightly-2.17.0.dev20240410.dist-info/LICENSE,sha256=WxeBS_DejPZQabxtfMOM_xn8qoZNJDQjrT7z2wG1I4U,11512
1208
+ tf_models_nightly-2.17.0.dev20240410.dist-info/METADATA,sha256=Bh56e1__Pn_yvpm9QMq4h12nKucvnKAftuk0ElQqn_w,1432
1209
+ tf_models_nightly-2.17.0.dev20240410.dist-info/WHEEL,sha256=kGT74LWyRUZrL4VgLh6_g12IeVl_9u9ZVhadrgXZUEY,110
1210
+ tf_models_nightly-2.17.0.dev20240410.dist-info/top_level.txt,sha256=gum2FfO5R4cvjl2-QtP-S1aNmsvIZaFFT6VFzU0f4-g,33
1211
+ tf_models_nightly-2.17.0.dev20240410.dist-info/RECORD,,