tensorbored 2.21.0rc1769983804__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.
- tensorbored/__init__.py +112 -0
- tensorbored/_vendor/__init__.py +0 -0
- tensorbored/_vendor/bleach/__init__.py +125 -0
- tensorbored/_vendor/bleach/_vendor/__init__.py +0 -0
- tensorbored/_vendor/bleach/_vendor/html5lib/__init__.py +35 -0
- tensorbored/_vendor/bleach/_vendor/html5lib/_ihatexml.py +289 -0
- tensorbored/_vendor/bleach/_vendor/html5lib/_inputstream.py +918 -0
- tensorbored/_vendor/bleach/_vendor/html5lib/_tokenizer.py +1735 -0
- tensorbored/_vendor/bleach/_vendor/html5lib/_trie/__init__.py +5 -0
- tensorbored/_vendor/bleach/_vendor/html5lib/_trie/_base.py +40 -0
- tensorbored/_vendor/bleach/_vendor/html5lib/_trie/py.py +67 -0
- tensorbored/_vendor/bleach/_vendor/html5lib/_utils.py +159 -0
- tensorbored/_vendor/bleach/_vendor/html5lib/constants.py +2946 -0
- tensorbored/_vendor/bleach/_vendor/html5lib/filters/__init__.py +0 -0
- tensorbored/_vendor/bleach/_vendor/html5lib/filters/alphabeticalattributes.py +29 -0
- tensorbored/_vendor/bleach/_vendor/html5lib/filters/base.py +12 -0
- tensorbored/_vendor/bleach/_vendor/html5lib/filters/inject_meta_charset.py +73 -0
- tensorbored/_vendor/bleach/_vendor/html5lib/filters/lint.py +93 -0
- tensorbored/_vendor/bleach/_vendor/html5lib/filters/optionaltags.py +207 -0
- tensorbored/_vendor/bleach/_vendor/html5lib/filters/sanitizer.py +916 -0
- tensorbored/_vendor/bleach/_vendor/html5lib/filters/whitespace.py +38 -0
- tensorbored/_vendor/bleach/_vendor/html5lib/html5parser.py +2795 -0
- tensorbored/_vendor/bleach/_vendor/html5lib/serializer.py +409 -0
- tensorbored/_vendor/bleach/_vendor/html5lib/treeadapters/__init__.py +30 -0
- tensorbored/_vendor/bleach/_vendor/html5lib/treeadapters/genshi.py +54 -0
- tensorbored/_vendor/bleach/_vendor/html5lib/treeadapters/sax.py +50 -0
- tensorbored/_vendor/bleach/_vendor/html5lib/treebuilders/__init__.py +88 -0
- tensorbored/_vendor/bleach/_vendor/html5lib/treebuilders/base.py +417 -0
- tensorbored/_vendor/bleach/_vendor/html5lib/treebuilders/dom.py +239 -0
- tensorbored/_vendor/bleach/_vendor/html5lib/treebuilders/etree.py +343 -0
- tensorbored/_vendor/bleach/_vendor/html5lib/treebuilders/etree_lxml.py +392 -0
- tensorbored/_vendor/bleach/_vendor/html5lib/treewalkers/__init__.py +154 -0
- tensorbored/_vendor/bleach/_vendor/html5lib/treewalkers/base.py +252 -0
- tensorbored/_vendor/bleach/_vendor/html5lib/treewalkers/dom.py +43 -0
- tensorbored/_vendor/bleach/_vendor/html5lib/treewalkers/etree.py +131 -0
- tensorbored/_vendor/bleach/_vendor/html5lib/treewalkers/etree_lxml.py +215 -0
- tensorbored/_vendor/bleach/_vendor/html5lib/treewalkers/genshi.py +69 -0
- tensorbored/_vendor/bleach/_vendor/parse.py +1078 -0
- tensorbored/_vendor/bleach/callbacks.py +32 -0
- tensorbored/_vendor/bleach/html5lib_shim.py +757 -0
- tensorbored/_vendor/bleach/linkifier.py +633 -0
- tensorbored/_vendor/bleach/parse_shim.py +1 -0
- tensorbored/_vendor/bleach/sanitizer.py +638 -0
- tensorbored/_vendor/bleach/six_shim.py +19 -0
- tensorbored/_vendor/webencodings/__init__.py +342 -0
- tensorbored/_vendor/webencodings/labels.py +231 -0
- tensorbored/_vendor/webencodings/mklabels.py +59 -0
- tensorbored/_vendor/webencodings/x_user_defined.py +325 -0
- tensorbored/assets.py +36 -0
- tensorbored/auth.py +102 -0
- tensorbored/backend/__init__.py +0 -0
- tensorbored/backend/application.py +604 -0
- tensorbored/backend/auth_context_middleware.py +38 -0
- tensorbored/backend/client_feature_flags.py +113 -0
- tensorbored/backend/empty_path_redirect.py +46 -0
- tensorbored/backend/event_processing/__init__.py +0 -0
- tensorbored/backend/event_processing/data_ingester.py +276 -0
- tensorbored/backend/event_processing/data_provider.py +535 -0
- tensorbored/backend/event_processing/directory_loader.py +142 -0
- tensorbored/backend/event_processing/directory_watcher.py +272 -0
- tensorbored/backend/event_processing/event_accumulator.py +950 -0
- tensorbored/backend/event_processing/event_file_inspector.py +463 -0
- tensorbored/backend/event_processing/event_file_loader.py +292 -0
- tensorbored/backend/event_processing/event_multiplexer.py +521 -0
- tensorbored/backend/event_processing/event_util.py +68 -0
- tensorbored/backend/event_processing/io_wrapper.py +223 -0
- tensorbored/backend/event_processing/plugin_asset_util.py +104 -0
- tensorbored/backend/event_processing/plugin_event_accumulator.py +721 -0
- tensorbored/backend/event_processing/plugin_event_multiplexer.py +522 -0
- tensorbored/backend/event_processing/reservoir.py +266 -0
- tensorbored/backend/event_processing/tag_types.py +29 -0
- tensorbored/backend/experiment_id.py +71 -0
- tensorbored/backend/experimental_plugin.py +51 -0
- tensorbored/backend/http_util.py +263 -0
- tensorbored/backend/json_util.py +70 -0
- tensorbored/backend/path_prefix.py +67 -0
- tensorbored/backend/process_graph.py +74 -0
- tensorbored/backend/security_validator.py +202 -0
- tensorbored/compat/__init__.py +69 -0
- tensorbored/compat/proto/__init__.py +0 -0
- tensorbored/compat/proto/allocation_description_pb2.py +35 -0
- tensorbored/compat/proto/api_def_pb2.py +82 -0
- tensorbored/compat/proto/attr_value_pb2.py +80 -0
- tensorbored/compat/proto/cluster_pb2.py +58 -0
- tensorbored/compat/proto/config_pb2.py +271 -0
- tensorbored/compat/proto/coordination_config_pb2.py +45 -0
- tensorbored/compat/proto/cost_graph_pb2.py +87 -0
- tensorbored/compat/proto/cpp_shape_inference_pb2.py +70 -0
- tensorbored/compat/proto/debug_pb2.py +65 -0
- tensorbored/compat/proto/event_pb2.py +149 -0
- tensorbored/compat/proto/full_type_pb2.py +74 -0
- tensorbored/compat/proto/function_pb2.py +157 -0
- tensorbored/compat/proto/graph_debug_info_pb2.py +111 -0
- tensorbored/compat/proto/graph_pb2.py +41 -0
- tensorbored/compat/proto/histogram_pb2.py +39 -0
- tensorbored/compat/proto/meta_graph_pb2.py +254 -0
- tensorbored/compat/proto/node_def_pb2.py +61 -0
- tensorbored/compat/proto/op_def_pb2.py +81 -0
- tensorbored/compat/proto/resource_handle_pb2.py +48 -0
- tensorbored/compat/proto/rewriter_config_pb2.py +93 -0
- tensorbored/compat/proto/rpc_options_pb2.py +35 -0
- tensorbored/compat/proto/saved_object_graph_pb2.py +193 -0
- tensorbored/compat/proto/saver_pb2.py +38 -0
- tensorbored/compat/proto/step_stats_pb2.py +116 -0
- tensorbored/compat/proto/struct_pb2.py +144 -0
- tensorbored/compat/proto/summary_pb2.py +111 -0
- tensorbored/compat/proto/tensor_description_pb2.py +38 -0
- tensorbored/compat/proto/tensor_pb2.py +68 -0
- tensorbored/compat/proto/tensor_shape_pb2.py +46 -0
- tensorbored/compat/proto/tfprof_log_pb2.py +307 -0
- tensorbored/compat/proto/trackable_object_graph_pb2.py +90 -0
- tensorbored/compat/proto/types_pb2.py +105 -0
- tensorbored/compat/proto/variable_pb2.py +62 -0
- tensorbored/compat/proto/verifier_config_pb2.py +38 -0
- tensorbored/compat/proto/versions_pb2.py +35 -0
- tensorbored/compat/tensorflow_stub/__init__.py +38 -0
- tensorbored/compat/tensorflow_stub/app.py +124 -0
- tensorbored/compat/tensorflow_stub/compat/__init__.py +131 -0
- tensorbored/compat/tensorflow_stub/compat/v1/__init__.py +20 -0
- tensorbored/compat/tensorflow_stub/dtypes.py +692 -0
- tensorbored/compat/tensorflow_stub/error_codes.py +169 -0
- tensorbored/compat/tensorflow_stub/errors.py +507 -0
- tensorbored/compat/tensorflow_stub/flags.py +124 -0
- tensorbored/compat/tensorflow_stub/io/__init__.py +17 -0
- tensorbored/compat/tensorflow_stub/io/gfile.py +1011 -0
- tensorbored/compat/tensorflow_stub/pywrap_tensorflow.py +285 -0
- tensorbored/compat/tensorflow_stub/tensor_shape.py +1035 -0
- tensorbored/context.py +129 -0
- tensorbored/data/__init__.py +0 -0
- tensorbored/data/grpc_provider.py +365 -0
- tensorbored/data/ingester.py +46 -0
- tensorbored/data/proto/__init__.py +0 -0
- tensorbored/data/proto/data_provider_pb2.py +517 -0
- tensorbored/data/proto/data_provider_pb2_grpc.py +374 -0
- tensorbored/data/provider.py +1365 -0
- tensorbored/data/server_ingester.py +301 -0
- tensorbored/data_compat.py +159 -0
- tensorbored/dataclass_compat.py +224 -0
- tensorbored/default.py +124 -0
- tensorbored/errors.py +130 -0
- tensorbored/lazy.py +99 -0
- tensorbored/main.py +48 -0
- tensorbored/main_lib.py +62 -0
- tensorbored/manager.py +487 -0
- tensorbored/notebook.py +441 -0
- tensorbored/plugin_util.py +266 -0
- tensorbored/plugins/__init__.py +0 -0
- tensorbored/plugins/audio/__init__.py +0 -0
- tensorbored/plugins/audio/audio_plugin.py +229 -0
- tensorbored/plugins/audio/metadata.py +69 -0
- tensorbored/plugins/audio/plugin_data_pb2.py +37 -0
- tensorbored/plugins/audio/summary.py +230 -0
- tensorbored/plugins/audio/summary_v2.py +124 -0
- tensorbored/plugins/base_plugin.py +367 -0
- tensorbored/plugins/core/__init__.py +0 -0
- tensorbored/plugins/core/core_plugin.py +981 -0
- tensorbored/plugins/custom_scalar/__init__.py +0 -0
- tensorbored/plugins/custom_scalar/custom_scalars_plugin.py +320 -0
- tensorbored/plugins/custom_scalar/layout_pb2.py +85 -0
- tensorbored/plugins/custom_scalar/metadata.py +35 -0
- tensorbored/plugins/custom_scalar/summary.py +79 -0
- tensorbored/plugins/debugger_v2/__init__.py +0 -0
- tensorbored/plugins/debugger_v2/debug_data_multiplexer.py +631 -0
- tensorbored/plugins/debugger_v2/debug_data_provider.py +634 -0
- tensorbored/plugins/debugger_v2/debugger_v2_plugin.py +504 -0
- tensorbored/plugins/distribution/__init__.py +0 -0
- tensorbored/plugins/distribution/compressor.py +158 -0
- tensorbored/plugins/distribution/distributions_plugin.py +116 -0
- tensorbored/plugins/distribution/metadata.py +19 -0
- tensorbored/plugins/graph/__init__.py +0 -0
- tensorbored/plugins/graph/graph_util.py +129 -0
- tensorbored/plugins/graph/graphs_plugin.py +336 -0
- tensorbored/plugins/graph/keras_util.py +328 -0
- tensorbored/plugins/graph/metadata.py +42 -0
- tensorbored/plugins/histogram/__init__.py +0 -0
- tensorbored/plugins/histogram/histograms_plugin.py +144 -0
- tensorbored/plugins/histogram/metadata.py +63 -0
- tensorbored/plugins/histogram/plugin_data_pb2.py +34 -0
- tensorbored/plugins/histogram/summary.py +234 -0
- tensorbored/plugins/histogram/summary_v2.py +292 -0
- tensorbored/plugins/hparams/__init__.py +14 -0
- tensorbored/plugins/hparams/_keras.py +93 -0
- tensorbored/plugins/hparams/api.py +130 -0
- tensorbored/plugins/hparams/api_pb2.py +208 -0
- tensorbored/plugins/hparams/backend_context.py +606 -0
- tensorbored/plugins/hparams/download_data.py +158 -0
- tensorbored/plugins/hparams/error.py +26 -0
- tensorbored/plugins/hparams/get_experiment.py +71 -0
- tensorbored/plugins/hparams/hparams_plugin.py +206 -0
- tensorbored/plugins/hparams/hparams_util_pb2.py +69 -0
- tensorbored/plugins/hparams/json_format_compat.py +38 -0
- tensorbored/plugins/hparams/list_metric_evals.py +57 -0
- tensorbored/plugins/hparams/list_session_groups.py +1040 -0
- tensorbored/plugins/hparams/metadata.py +125 -0
- tensorbored/plugins/hparams/metrics.py +41 -0
- tensorbored/plugins/hparams/plugin_data_pb2.py +69 -0
- tensorbored/plugins/hparams/summary.py +205 -0
- tensorbored/plugins/hparams/summary_v2.py +597 -0
- tensorbored/plugins/image/__init__.py +0 -0
- tensorbored/plugins/image/images_plugin.py +232 -0
- tensorbored/plugins/image/metadata.py +65 -0
- tensorbored/plugins/image/plugin_data_pb2.py +34 -0
- tensorbored/plugins/image/summary.py +159 -0
- tensorbored/plugins/image/summary_v2.py +130 -0
- tensorbored/plugins/mesh/__init__.py +14 -0
- tensorbored/plugins/mesh/mesh_plugin.py +292 -0
- tensorbored/plugins/mesh/metadata.py +152 -0
- tensorbored/plugins/mesh/plugin_data_pb2.py +37 -0
- tensorbored/plugins/mesh/summary.py +251 -0
- tensorbored/plugins/mesh/summary_v2.py +214 -0
- tensorbored/plugins/metrics/__init__.py +0 -0
- tensorbored/plugins/metrics/metadata.py +17 -0
- tensorbored/plugins/metrics/metrics_plugin.py +623 -0
- tensorbored/plugins/pr_curve/__init__.py +0 -0
- tensorbored/plugins/pr_curve/metadata.py +75 -0
- tensorbored/plugins/pr_curve/plugin_data_pb2.py +34 -0
- tensorbored/plugins/pr_curve/pr_curves_plugin.py +241 -0
- tensorbored/plugins/pr_curve/summary.py +574 -0
- tensorbored/plugins/profile_redirect/__init__.py +0 -0
- tensorbored/plugins/profile_redirect/profile_redirect_plugin.py +49 -0
- tensorbored/plugins/projector/__init__.py +67 -0
- tensorbored/plugins/projector/metadata.py +26 -0
- tensorbored/plugins/projector/projector_config_pb2.py +54 -0
- tensorbored/plugins/projector/projector_plugin.py +795 -0
- tensorbored/plugins/projector/tf_projector_plugin/index.js +32 -0
- tensorbored/plugins/projector/tf_projector_plugin/projector_binary.html +524 -0
- tensorbored/plugins/projector/tf_projector_plugin/projector_binary.js +15536 -0
- tensorbored/plugins/scalar/__init__.py +0 -0
- tensorbored/plugins/scalar/metadata.py +60 -0
- tensorbored/plugins/scalar/plugin_data_pb2.py +34 -0
- tensorbored/plugins/scalar/scalars_plugin.py +181 -0
- tensorbored/plugins/scalar/summary.py +109 -0
- tensorbored/plugins/scalar/summary_v2.py +124 -0
- tensorbored/plugins/text/__init__.py +0 -0
- tensorbored/plugins/text/metadata.py +62 -0
- tensorbored/plugins/text/plugin_data_pb2.py +34 -0
- tensorbored/plugins/text/summary.py +114 -0
- tensorbored/plugins/text/summary_v2.py +124 -0
- tensorbored/plugins/text/text_plugin.py +288 -0
- tensorbored/plugins/wit_redirect/__init__.py +0 -0
- tensorbored/plugins/wit_redirect/wit_redirect_plugin.py +49 -0
- tensorbored/program.py +910 -0
- tensorbored/summary/__init__.py +35 -0
- tensorbored/summary/_output.py +124 -0
- tensorbored/summary/_tf/__init__.py +14 -0
- tensorbored/summary/_tf/summary/__init__.py +178 -0
- tensorbored/summary/_writer.py +105 -0
- tensorbored/summary/v1.py +51 -0
- tensorbored/summary/v2.py +25 -0
- tensorbored/summary/writer/__init__.py +13 -0
- tensorbored/summary/writer/event_file_writer.py +291 -0
- tensorbored/summary/writer/record_writer.py +50 -0
- tensorbored/util/__init__.py +0 -0
- tensorbored/util/encoder.py +116 -0
- tensorbored/util/grpc_util.py +311 -0
- tensorbored/util/img_mime_type_detector.py +40 -0
- tensorbored/util/io_util.py +20 -0
- tensorbored/util/lazy_tensor_creator.py +110 -0
- tensorbored/util/op_evaluator.py +104 -0
- tensorbored/util/platform_util.py +20 -0
- tensorbored/util/tb_logging.py +24 -0
- tensorbored/util/tensor_util.py +617 -0
- tensorbored/util/timing.py +122 -0
- tensorbored/version.py +21 -0
- tensorbored/webfiles.zip +0 -0
- tensorbored-2.21.0rc1769983804.dist-info/METADATA +49 -0
- tensorbored-2.21.0rc1769983804.dist-info/RECORD +271 -0
- tensorbored-2.21.0rc1769983804.dist-info/WHEEL +5 -0
- tensorbored-2.21.0rc1769983804.dist-info/entry_points.txt +6 -0
- tensorbored-2.21.0rc1769983804.dist-info/licenses/LICENSE +739 -0
- tensorbored-2.21.0rc1769983804.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# Copyright 2018 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
|
+
"""Central API entry point for summary operations.
|
|
16
|
+
|
|
17
|
+
This module exposes summary ops for the standard TensorBoard plugins.
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
# If the V1 summary API is accessible, load and re-export it here.
|
|
21
|
+
try:
|
|
22
|
+
from tensorbored.summary import v1 # noqa: F401
|
|
23
|
+
except ImportError:
|
|
24
|
+
pass
|
|
25
|
+
|
|
26
|
+
# Load the V2 summary API if accessible.
|
|
27
|
+
try:
|
|
28
|
+
from tensorbored.summary import v2 # noqa: F401
|
|
29
|
+
from tensorbored.summary.v2 import * # noqa: F401
|
|
30
|
+
except ImportError:
|
|
31
|
+
pass
|
|
32
|
+
|
|
33
|
+
from tensorbored.summary._output import DirectoryOutput # noqa: F401
|
|
34
|
+
from tensorbored.summary._output import Output # noqa: F401
|
|
35
|
+
from tensorbored.summary._writer import Writer # noqa: F401
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
# Copyright 2021 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
|
+
"""Generalized output options for writing tensor-formatted summary data."""
|
|
16
|
+
|
|
17
|
+
from tensorbored.compat.proto import event_pb2
|
|
18
|
+
from tensorbored.compat.proto import summary_pb2
|
|
19
|
+
from tensorbored.summary.writer import event_file_writer
|
|
20
|
+
from tensorbored.util import tensor_util
|
|
21
|
+
|
|
22
|
+
import abc
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class Output(abc.ABC):
|
|
26
|
+
"""Interface for emitting tensor-formatted summary data.
|
|
27
|
+
|
|
28
|
+
Implementations of this interface can be passed to Writer to customize
|
|
29
|
+
how summary data is actually persisted (e.g. to disk, to memory, over
|
|
30
|
+
the network, etc.).
|
|
31
|
+
|
|
32
|
+
TODO(#4581): This API should be considered EXPERIMENTAL and subject to
|
|
33
|
+
backwards-incompatible changes without notice.
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
@abc.abstractmethod
|
|
37
|
+
def emit_scalar(
|
|
38
|
+
self,
|
|
39
|
+
*,
|
|
40
|
+
plugin_name,
|
|
41
|
+
tag,
|
|
42
|
+
data,
|
|
43
|
+
step,
|
|
44
|
+
wall_time,
|
|
45
|
+
tag_metadata=None,
|
|
46
|
+
description=None,
|
|
47
|
+
):
|
|
48
|
+
"""Emits one scalar data point to this Output.
|
|
49
|
+
|
|
50
|
+
Args:
|
|
51
|
+
plugin_name: string name to uniquely identify the type of time series
|
|
52
|
+
(historically associated with a TensorBoard plugin).
|
|
53
|
+
tag: string tag used to uniquely identify this time series.
|
|
54
|
+
data: `np.float32` scalar value for this data point.
|
|
55
|
+
step: `np.int64` scalar step value for this data point.
|
|
56
|
+
wall_time: `float` seconds since the Unix epoch, representing the
|
|
57
|
+
real-world timestamp for this data point.
|
|
58
|
+
tag_metadata: optional bytes containing metadata for this entire time
|
|
59
|
+
series. This should be constant for a given tag; only the first
|
|
60
|
+
value encountered will be used.
|
|
61
|
+
description: optional string description for this entire time series.
|
|
62
|
+
This should be constant for a given tag; only the first value
|
|
63
|
+
encountered will be used.
|
|
64
|
+
"""
|
|
65
|
+
pass
|
|
66
|
+
|
|
67
|
+
@abc.abstractmethod
|
|
68
|
+
def flush(self):
|
|
69
|
+
"""Flushes any data that has been buffered."""
|
|
70
|
+
pass
|
|
71
|
+
|
|
72
|
+
@abc.abstractmethod
|
|
73
|
+
def close(self):
|
|
74
|
+
"""Closes the Output and also flushes any buffered data."""
|
|
75
|
+
pass
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
class DirectoryOutput(Output):
|
|
79
|
+
"""Outputs summary data by writing event files to a log directory.
|
|
80
|
+
|
|
81
|
+
TODO(#4581): This API should be considered EXPERIMENTAL and subject to
|
|
82
|
+
backwards-incompatible changes without notice.
|
|
83
|
+
"""
|
|
84
|
+
|
|
85
|
+
def __init__(self, path):
|
|
86
|
+
"""Creates a `DirectoryOutput` for the given path."""
|
|
87
|
+
self._ev_writer = event_file_writer.EventFileWriter(path)
|
|
88
|
+
|
|
89
|
+
def emit_scalar(
|
|
90
|
+
self,
|
|
91
|
+
*,
|
|
92
|
+
plugin_name,
|
|
93
|
+
tag,
|
|
94
|
+
data,
|
|
95
|
+
step,
|
|
96
|
+
wall_time,
|
|
97
|
+
tag_metadata=None,
|
|
98
|
+
description=None,
|
|
99
|
+
):
|
|
100
|
+
"""See `Output`."""
|
|
101
|
+
# TODO(#4581): cache summary metadata to emit only once.
|
|
102
|
+
summary_metadata = summary_pb2.SummaryMetadata(
|
|
103
|
+
plugin_data=summary_pb2.SummaryMetadata.PluginData(
|
|
104
|
+
plugin_name=plugin_name, content=tag_metadata
|
|
105
|
+
),
|
|
106
|
+
summary_description=description,
|
|
107
|
+
data_class=summary_pb2.DataClass.DATA_CLASS_SCALAR,
|
|
108
|
+
)
|
|
109
|
+
tensor_proto = tensor_util.make_tensor_proto(data)
|
|
110
|
+
event = event_pb2.Event(wall_time=wall_time, step=step)
|
|
111
|
+
event.summary.value.add(
|
|
112
|
+
tag=tag, tensor=tensor_proto, metadata=summary_metadata
|
|
113
|
+
)
|
|
114
|
+
self._ev_writer.add_event(event)
|
|
115
|
+
|
|
116
|
+
def flush(self):
|
|
117
|
+
"""See `Output`."""
|
|
118
|
+
self._ev_writer.flush()
|
|
119
|
+
|
|
120
|
+
def close(self):
|
|
121
|
+
"""See `Output`."""
|
|
122
|
+
# No need to call flush first since EventFileWriter already
|
|
123
|
+
# will do this for us when we call close().
|
|
124
|
+
self._ev_writer.close()
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# Copyright 2019 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
|
+
# ==============================================================================
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
# Copyright 2019 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
|
+
|
|
16
|
+
# NOTE: This module exists to provide the `tf.summary` module in the TensorFlow
|
|
17
|
+
# API using symbols defined in TensorBoard. This works via a mechanism within
|
|
18
|
+
# TensorFlow's API construction logic called "component_api_helper" that imports
|
|
19
|
+
# an arbitrary module and inserts it into the TF APIs as a "component API". That
|
|
20
|
+
# logic is specifically hardcoded to look for this exact tensorboard module.
|
|
21
|
+
#
|
|
22
|
+
# This note is in a comment, not the module docstring, because the module
|
|
23
|
+
# docstring below is what users will see as the tf.summary docstring and in the
|
|
24
|
+
# generated API documentation, and this is just an implementation detail.
|
|
25
|
+
|
|
26
|
+
"""Operations for writing summary data, for use in analysis and visualization.
|
|
27
|
+
|
|
28
|
+
The `tf.summary` module provides APIs for writing summary data. This data can be
|
|
29
|
+
visualized in TensorBoard, the visualization toolkit that comes with TensorFlow.
|
|
30
|
+
See the [TensorBoard website](https://www.tensorflow.org/tensorboard) for more
|
|
31
|
+
detailed tutorials about how to use these APIs, or some quick examples below.
|
|
32
|
+
|
|
33
|
+
Example usage with eager execution, the default in TF 2.0:
|
|
34
|
+
|
|
35
|
+
```python
|
|
36
|
+
writer = tf.summary.create_file_writer("/tmp/mylogs")
|
|
37
|
+
with writer.as_default():
|
|
38
|
+
for step in range(100):
|
|
39
|
+
# other model code would go here
|
|
40
|
+
tf.summary.scalar("my_metric", 0.5, step=step)
|
|
41
|
+
writer.flush()
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Example usage with `tf.function` graph execution:
|
|
45
|
+
|
|
46
|
+
```python
|
|
47
|
+
writer = tf.summary.create_file_writer("/tmp/mylogs")
|
|
48
|
+
|
|
49
|
+
@tf.function
|
|
50
|
+
def my_func(step):
|
|
51
|
+
# other model code would go here
|
|
52
|
+
with writer.as_default():
|
|
53
|
+
tf.summary.scalar("my_metric", 0.5, step=step)
|
|
54
|
+
|
|
55
|
+
for step in range(100):
|
|
56
|
+
my_func(step)
|
|
57
|
+
writer.flush()
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Example usage with legacy TF 1.x graph execution:
|
|
61
|
+
|
|
62
|
+
```python
|
|
63
|
+
with tf.compat.v1.Graph().as_default():
|
|
64
|
+
step = tf.Variable(0, dtype=tf.int64)
|
|
65
|
+
step_update = step.assign_add(1)
|
|
66
|
+
writer = tf.summary.create_file_writer("/tmp/mylogs")
|
|
67
|
+
with writer.as_default():
|
|
68
|
+
tf.summary.scalar("my_metric", 0.5, step=step)
|
|
69
|
+
all_summary_ops = tf.compat.v1.summary.all_v2_summary_ops()
|
|
70
|
+
writer_flush = writer.flush()
|
|
71
|
+
|
|
72
|
+
sess = tf.compat.v1.Session()
|
|
73
|
+
sess.run([writer.init(), step.initializer])
|
|
74
|
+
for i in range(100):
|
|
75
|
+
sess.run(all_summary_ops)
|
|
76
|
+
sess.run(step_update)
|
|
77
|
+
sess.run(writer_flush)
|
|
78
|
+
```
|
|
79
|
+
"""
|
|
80
|
+
|
|
81
|
+
# Keep this import outside the function below for internal sync reasons.
|
|
82
|
+
import tensorflow as tf
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def reexport_tf_summary():
|
|
86
|
+
"""Re-export all symbols from the original tf.summary.
|
|
87
|
+
|
|
88
|
+
This function finds the original tf.summary V2 API and re-exports all the
|
|
89
|
+
symbols from it within this module as well, so that when this module is
|
|
90
|
+
patched into the TF API namespace as the new tf.summary, the effect is an
|
|
91
|
+
overlay that just adds TensorBoard-provided symbols to the module.
|
|
92
|
+
|
|
93
|
+
Finding the original tf.summary V2 API module reliably is a challenge, since
|
|
94
|
+
this code runs *during* the overall TF API import process and depending on
|
|
95
|
+
the order of imports (which is subject to change), different parts of the API
|
|
96
|
+
may or may not be defined at the point in time we attempt to access them. This
|
|
97
|
+
code also may be inserted into two places in the API (tf and tf.compat.v2)
|
|
98
|
+
and may be re-executed multiple times even for the same place in the API (due
|
|
99
|
+
to the TF module import system not populating sys.modules properly), so it
|
|
100
|
+
needs to be robust to many different scenarios.
|
|
101
|
+
|
|
102
|
+
The one constraint we can count on is that everywhere this module is loaded
|
|
103
|
+
(via the component_api_helper mechanism in TF), it's going to be the 'summary'
|
|
104
|
+
submodule of a larger API package that already has a 'summary' attribute
|
|
105
|
+
that contains the TF-only summary API symbols we need to re-export. This
|
|
106
|
+
may either be the original TF-only summary module (the first time we load
|
|
107
|
+
this module) or a pre-existing copy of this module (if we're re-loading this
|
|
108
|
+
module again). We don't actually need to differentiate those two cases,
|
|
109
|
+
because it's okay if we re-import our own TensorBoard-provided symbols; they
|
|
110
|
+
will just be overwritten later on in this file.
|
|
111
|
+
|
|
112
|
+
So given that guarantee, the approach we take is to first attempt to locate
|
|
113
|
+
a TF V2 API package that already has a 'summary' attribute (most likely this
|
|
114
|
+
is the parent package into which we're being imported, but not necessarily),
|
|
115
|
+
and then do the dynamic version of "from tf_api_package.summary import *".
|
|
116
|
+
|
|
117
|
+
Lastly, this logic is encapsulated in a function to avoid symbol leakage.
|
|
118
|
+
"""
|
|
119
|
+
import sys
|
|
120
|
+
|
|
121
|
+
# API packages to check for the original V2 summary API, in preference order
|
|
122
|
+
# to avoid going "under the hood" to the _api packages unless necessary.
|
|
123
|
+
# Skip the top-level `tensorflow` package since it's hard to confirm that it
|
|
124
|
+
# is the actual v2 API (just checking tf.__version__ is not always enough).
|
|
125
|
+
packages = [
|
|
126
|
+
"tensorflow.compat.v2",
|
|
127
|
+
"tensorflow_core._api.v2",
|
|
128
|
+
"tensorflow_core._api.v2.compat.v2",
|
|
129
|
+
"tensorflow_core._api.v1.compat.v2",
|
|
130
|
+
# Old names for `tensorflow_core._api.*`.
|
|
131
|
+
"tensorflow._api.v2",
|
|
132
|
+
"tensorflow._api.v2.compat.v2",
|
|
133
|
+
"tensorflow._api.v1.compat.v2",
|
|
134
|
+
]
|
|
135
|
+
|
|
136
|
+
def dynamic_wildcard_import(module):
|
|
137
|
+
"""Implements the logic of "from module import *" for the given
|
|
138
|
+
module."""
|
|
139
|
+
symbols = getattr(module, "__all__", None)
|
|
140
|
+
if symbols is None:
|
|
141
|
+
symbols = [
|
|
142
|
+
k for k in module.__dict__.keys() if not k.startswith("_")
|
|
143
|
+
]
|
|
144
|
+
globals().update(
|
|
145
|
+
{symbol: getattr(module, symbol) for symbol in symbols}
|
|
146
|
+
)
|
|
147
|
+
|
|
148
|
+
notfound = object() # sentinel value
|
|
149
|
+
for package_name in packages:
|
|
150
|
+
package = sys.modules.get(package_name, notfound)
|
|
151
|
+
if package is notfound:
|
|
152
|
+
# Either it isn't in this installation at all (e.g. the _api.vX packages
|
|
153
|
+
# are only in API version X), it isn't imported yet, or it was imported
|
|
154
|
+
# but not inserted into sys.modules under its user-facing name (for the
|
|
155
|
+
# non-'_api' packages), at which point we continue down the list to look
|
|
156
|
+
# "under the hood" for it via its '_api' package name.
|
|
157
|
+
continue
|
|
158
|
+
module = getattr(package, "summary", None)
|
|
159
|
+
if module is None:
|
|
160
|
+
# This happens if the package hasn't been fully imported yet. For example,
|
|
161
|
+
# the 'tensorflow' package won't yet have 'summary' attribute if we are
|
|
162
|
+
# loading this code via the 'tensorflow.compat...' path and 'compat' is
|
|
163
|
+
# imported before 'summary' in the 'tensorflow' __init__.py file.
|
|
164
|
+
continue
|
|
165
|
+
# Success, we hope. Import all the public symbols into this module.
|
|
166
|
+
dynamic_wildcard_import(module)
|
|
167
|
+
return
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
reexport_tf_summary()
|
|
171
|
+
|
|
172
|
+
from tensorbored.summary.v2 import audio # noqa: F401
|
|
173
|
+
from tensorbored.summary.v2 import histogram # noqa: F401
|
|
174
|
+
from tensorbored.summary.v2 import image # noqa: F401
|
|
175
|
+
from tensorbored.summary.v2 import scalar # noqa: F401
|
|
176
|
+
from tensorbored.summary.v2 import text # noqa: F401
|
|
177
|
+
|
|
178
|
+
del tf, reexport_tf_summary
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# Copyright 2021 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
|
+
"""Implementation for tensorboard.summary.Writer and related symbols.
|
|
16
|
+
|
|
17
|
+
This provides a TensorBoard-native summary writing API that only depends
|
|
18
|
+
on numpy and not any particular ML framework.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
import time
|
|
22
|
+
|
|
23
|
+
import numpy as np
|
|
24
|
+
|
|
25
|
+
from tensorbored.plugins.scalar import metadata as scalars_metadata
|
|
26
|
+
from tensorbored.summary import _output
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class Writer:
|
|
30
|
+
"""Writes summary data for visualization in TensorBoard.
|
|
31
|
+
|
|
32
|
+
This class is not thread-safe.
|
|
33
|
+
|
|
34
|
+
TODO(#4581): This API should be considered EXPERIMENTAL and subject to
|
|
35
|
+
backwards-incompatible changes without notice.
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
def __init__(self, output):
|
|
39
|
+
"""Constructs a Writer.
|
|
40
|
+
|
|
41
|
+
Args:
|
|
42
|
+
output: `tensorboard.summary.Output` object, or a string which will be
|
|
43
|
+
interpreted as shorthand for an `Output` of the appropriate type. The
|
|
44
|
+
only currently supported type is `DirectoryOutput`, where the string
|
|
45
|
+
value given here will be used as the directory path.
|
|
46
|
+
"""
|
|
47
|
+
if isinstance(output, _output.Output):
|
|
48
|
+
self._output = output
|
|
49
|
+
elif isinstance(output, str):
|
|
50
|
+
self._output = _output.DirectoryOutput(output)
|
|
51
|
+
else:
|
|
52
|
+
raise TypeError("Unsupported output object %r" % output)
|
|
53
|
+
self._closed = False
|
|
54
|
+
|
|
55
|
+
def _check_not_closed(self):
|
|
56
|
+
if self._closed:
|
|
57
|
+
raise RuntimeError("Writer is already closed")
|
|
58
|
+
|
|
59
|
+
def flush(self):
|
|
60
|
+
"""Flushes any buffered data."""
|
|
61
|
+
self._check_not_closed()
|
|
62
|
+
self._output.flush()
|
|
63
|
+
|
|
64
|
+
def close(self):
|
|
65
|
+
"""Closes the writer and prevents further use."""
|
|
66
|
+
self._check_not_closed()
|
|
67
|
+
self._output.close()
|
|
68
|
+
self._closed = True
|
|
69
|
+
|
|
70
|
+
def add_scalar(self, tag, data, step, *, wall_time=None, description=None):
|
|
71
|
+
"""Adds a scalar summary.
|
|
72
|
+
|
|
73
|
+
Args:
|
|
74
|
+
tag: string tag used to uniquely identify this time series.
|
|
75
|
+
data: numeric scalar value for this data point. Accepts any value that
|
|
76
|
+
can be converted to a `np.float32` scalar.
|
|
77
|
+
step: integer step value for this data point. Accepts any value that
|
|
78
|
+
can be converted to a `np.int64` scalar.
|
|
79
|
+
wall_time: optional `float` seconds since the Unix epoch, representing
|
|
80
|
+
the real-world timestamp for this data point. Defaults to None in
|
|
81
|
+
which case the current time will be used.
|
|
82
|
+
description: optional string description for this entire time series.
|
|
83
|
+
This should be constant for a given tag; only the first value
|
|
84
|
+
encountered will be used.
|
|
85
|
+
"""
|
|
86
|
+
self._check_not_closed()
|
|
87
|
+
validated_data = _validate_scalar_shape(np.float32(data), "data")
|
|
88
|
+
validated_step = _validate_scalar_shape(np.int64(step), "step")
|
|
89
|
+
wall_time = wall_time if wall_time is not None else time.time()
|
|
90
|
+
self._output.emit_scalar(
|
|
91
|
+
plugin_name=scalars_metadata.PLUGIN_NAME,
|
|
92
|
+
tag=tag,
|
|
93
|
+
data=validated_data,
|
|
94
|
+
step=validated_step,
|
|
95
|
+
wall_time=wall_time,
|
|
96
|
+
description=description,
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def _validate_scalar_shape(ndarray, name):
|
|
101
|
+
if ndarray.ndim != 0:
|
|
102
|
+
raise ValueError(
|
|
103
|
+
"Expected scalar value for %r but got %r" % (name, ndarray)
|
|
104
|
+
)
|
|
105
|
+
return ndarray
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# Copyright 2017 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
|
+
"""Central API entry point for v1 versions of summary operations.
|
|
16
|
+
|
|
17
|
+
This module simply offers a shorter way to access the members of modules
|
|
18
|
+
like `tensorboard.plugins.scalar.summary`.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
from tensorbored.plugins.audio import summary as _audio_summary
|
|
22
|
+
from tensorbored.plugins.custom_scalar import summary as _custom_scalar_summary
|
|
23
|
+
from tensorbored.plugins.histogram import summary as _histogram_summary
|
|
24
|
+
from tensorbored.plugins.image import summary as _image_summary
|
|
25
|
+
from tensorbored.plugins.pr_curve import summary as _pr_curve_summary
|
|
26
|
+
from tensorbored.plugins.scalar import summary as _scalar_summary
|
|
27
|
+
from tensorbored.plugins.text import summary as _text_summary
|
|
28
|
+
|
|
29
|
+
audio = _audio_summary.op
|
|
30
|
+
audio_pb = _audio_summary.pb
|
|
31
|
+
|
|
32
|
+
custom_scalar = _custom_scalar_summary.op
|
|
33
|
+
custom_scalar_pb = _custom_scalar_summary.pb
|
|
34
|
+
|
|
35
|
+
histogram = _histogram_summary.op
|
|
36
|
+
histogram_pb = _histogram_summary.pb
|
|
37
|
+
|
|
38
|
+
image = _image_summary.op
|
|
39
|
+
image_pb = _image_summary.pb
|
|
40
|
+
|
|
41
|
+
pr_curve = _pr_curve_summary.op
|
|
42
|
+
pr_curve_pb = _pr_curve_summary.pb
|
|
43
|
+
pr_curve_streaming_op = _pr_curve_summary.streaming_op
|
|
44
|
+
pr_curve_raw_data_op = _pr_curve_summary.raw_data_op
|
|
45
|
+
pr_curve_raw_data_pb = _pr_curve_summary.raw_data_pb
|
|
46
|
+
|
|
47
|
+
scalar = _scalar_summary.op
|
|
48
|
+
scalar_pb = _scalar_summary.pb
|
|
49
|
+
|
|
50
|
+
text = _text_summary.op
|
|
51
|
+
text_pb = _text_summary.pb
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Copyright 2018 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
|
+
"""Central API entry point for v2 versions of summary operations.
|
|
16
|
+
|
|
17
|
+
This module exposes v2 summary ops for the standard TensorBoard plugins.
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
# pylint: disable=unused-import
|
|
21
|
+
from tensorbored.plugins.audio.summary_v2 import audio # noqa: F401
|
|
22
|
+
from tensorbored.plugins.histogram.summary_v2 import histogram # noqa: F401
|
|
23
|
+
from tensorbored.plugins.image.summary_v2 import image # noqa: F401
|
|
24
|
+
from tensorbored.plugins.scalar.summary_v2 import scalar # noqa: F401
|
|
25
|
+
from tensorbored.plugins.text.summary_v2 import text # noqa: F401
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Copyright 2019 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.
|