aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Shanqing Cai <cais@google.com>2017-12-01 07:10:42 -0800
committerGravatar TensorFlower Gardener <gardener@tensorflow.org>2017-12-01 07:14:33 -0800
commit32cbeaaaa4a1fe20b21e6a98068b175ce3922600 (patch)
tree1875fba4ab12208a205d370c7ae890d0dee91972
parent6b6244c40197b34f49bb50aa52efb082380d4637 (diff)
TFE: Remove contrib/eager/python/sumary_writer.py
Use tf.contrib.summary.create_file_writer, instead. PiperOrigin-RevId: 177588097
-rw-r--r--tensorflow/contrib/eager/python/BUILD31
-rw-r--r--tensorflow/contrib/eager/python/summary_writer.py242
-rw-r--r--tensorflow/contrib/eager/python/summary_writer_test.py150
-rw-r--r--tensorflow/contrib/summary/BUILD5
-rw-r--r--tensorflow/tools/pip_package/BUILD1
5 files changed, 1 insertions, 428 deletions
diff --git a/tensorflow/contrib/eager/python/BUILD b/tensorflow/contrib/eager/python/BUILD
index 55d768044b..6e9bb87d58 100644
--- a/tensorflow/contrib/eager/python/BUILD
+++ b/tensorflow/contrib/eager/python/BUILD
@@ -104,37 +104,6 @@ cuda_py_test(
)
py_library(
- name = "summary_writer",
- srcs = ["summary_writer.py"],
- srcs_version = "PY2AND3",
- deps = [
- "//tensorflow/contrib/summary:gen_summary_ops",
- "//tensorflow/python:constant_op",
- "//tensorflow/python:dtypes",
- "//tensorflow/python:framework_ops",
- "//tensorflow/python:init_ops",
- "//tensorflow/python:resource_variable_ops",
- "//tensorflow/python:state_ops",
- "//tensorflow/python:summary_op_util",
- "//tensorflow/python:variable_scope",
- "//tensorflow/python/eager:context",
- ],
-)
-
-cuda_py_test(
- name = "summary_writer_test",
- srcs = ["summary_writer_test.py"],
- additional_deps = [
- ":summary_writer",
- "//third_party/py/numpy",
- "//tensorflow/core:protos_all_py",
- "//tensorflow/python:constant_op",
- "//tensorflow/python/eager:context",
- "//tensorflow/python/eager:test",
- ],
-)
-
-py_library(
name = "metrics",
srcs = [
"metrics.py",
diff --git a/tensorflow/contrib/eager/python/summary_writer.py b/tensorflow/contrib/eager/python/summary_writer.py
deleted file mode 100644
index 5d8c41b545..0000000000
--- a/tensorflow/contrib/eager/python/summary_writer.py
+++ /dev/null
@@ -1,242 +0,0 @@
-# Copyright 2017 The TensorFlow Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-# ==============================================================================
-"""TensorBoard Summary Writer for TensorFlow Eager Execution."""
-
-from __future__ import absolute_import
-from __future__ import division
-from __future__ import print_function
-
-import uuid
-
-from tensorflow.contrib.summary import gen_summary_ops
-from tensorflow.python.eager import context
-from tensorflow.python.framework import constant_op
-from tensorflow.python.framework import dtypes
-from tensorflow.python.framework import ops
-from tensorflow.python.ops import init_ops
-from tensorflow.python.ops import resource_variable_ops
-from tensorflow.python.ops import state_ops
-from tensorflow.python.ops import summary_op_util
-from tensorflow.python.ops import variable_scope
-
-
-def _maybe_cpu(v):
- if isinstance(v, (ops.EagerTensor, ops.Tensor)):
- return v.cpu()
- else:
- return v
-
-
-def _summary_writer_function(name, tensor, function, family=None):
- def record():
- with summary_op_util.summary_scope(
- name, family, values=[tensor]) as (tag, scope):
- function(tag, scope)
- return True
- return record
-
-
-class SummaryWriter(object):
- """Writes summaries for TensorBoard, compatible with eager execution.
-
- This class is the supported way of writing TensorBoard summaries under
- eager execution.
- """
-
- _CPU_DEVICE = "cpu:0"
-
- def __init__(self,
- logdir,
- max_queue=10,
- flush_secs=120,
- filename_suffix=""):
- """Summary writer for TensorBoard, compatible with eager execution.
-
- If necessary, multiple instances of `SummaryWriter` can be created, with
- distinct `logdir`s and `name`s. Each `SummaryWriter` instance will retain
- its independent `global_step` counter and data writing destination.
-
- Example:
- ```python
- writer = tfe.SummaryWriter("my_model")
-
- # ... Code that sets up the model and data batches ...
-
- for _ in xrange(train_iters):
- loss = model.train_batch(batch)
- writer.scalar("loss", loss)
- writer.step()
- ```
-
- Args:
- logdir: Directory in which summary files will be written.
- max_queue: Number of summary items to buffer before flushing to
- filesystem. If 0, summaries will be flushed immediately.
- flush_secs: Number of secondsbetween forced commits to disk.
- filename_suffix: Suffix of the event protobuf files in which the summary
- data are stored.
-
- Raises:
- ValueError: If this constructor is called not under eager execution.
- """
- # TODO(apassos, ashankar): Make this class and the underlying
- # contrib.summary_ops compatible with graph model and remove this check.
- if not context.in_eager_mode():
- raise ValueError(
- "Use of SummaryWriter is currently supported only with eager "
- "execution enabled. File an issue at "
- "https://github.com/tensorflow/tensorflow/issues/new to express "
- "interest in fixing this.")
-
- # TODO(cais): Consider adding name keyword argument, which if None or empty,
- # will register the global global_step that training_util.get_global_step()
- # can find.
- with context.device(self._CPU_DEVICE):
- self._name = uuid.uuid4().hex
- self._global_step = 0
- self._global_step_tensor = variable_scope.get_variable(
- "global_step/summary_writer/" + self._name,
- shape=[], dtype=dtypes.int64,
- initializer=init_ops.zeros_initializer())
- self._global_step_dirty = False
- self._resource = gen_summary_ops.summary_writer(shared_name=self._name)
- gen_summary_ops.create_summary_file_writer(
- self._resource, logdir, max_queue, flush_secs, filename_suffix)
- # Delete the resource when this object is deleted
- self._resource_deleter = resource_variable_ops.EagerResourceDeleter(
- handle=self._resource, handle_device=self._CPU_DEVICE)
-
- def step(self):
- """Increment the global step counter of this SummaryWriter instance."""
- self._global_step += 1
- self._global_step_dirty = True
-
- @property
- def global_step(self):
- """Obtain the current global_step value of this SummaryWriter instance.
-
- Returns:
- An `int` representing the current value of the global_step of this
- `SummaryWriter` instance.
- """
- return self._global_step
-
- def _update_global_step_tensor(self):
- with context.device(self._CPU_DEVICE):
- if self._global_step_dirty:
- self._global_step_dirty = False
- return state_ops.assign(self._global_step_tensor, self._global_step)
- else:
- return self._global_step_tensor
-
- def generic(self, name, tensor, metadata, family=None):
- """Write a generic-type summary.
-
- Args:
- name: A name for the generated node. Will also serve as the series name in
- TensorBoard.
- tensor: A `Tensor` or compatible value type containing the value of the
- summary.
- metadata: Metadata about the summary.
- family: Optional; if provided, used as the prefix of the summary tag name,
- which controls the tab name used for display on Tensorboard.
- """
- with context.device(self._CPU_DEVICE):
- with summary_op_util.summary_scope(
- name, family, values=[tensor]) as (tag, scope):
- gen_summary_ops.write_summary(
- self._resource,
- self._update_global_step_tensor(),
- _maybe_cpu(tensor),
- tag,
- _maybe_cpu(metadata),
- name=scope)
-
- def scalar(self, name, tensor, family=None):
- """Write a scalar summary.
-
- Args:
- name: A name for the generated node. Will also serve as the series name in
- TensorBoard.
- tensor: A real numeric `Tensor` or compatible value type containing a
- single value.
- family: Optional; if provided, used as the prefix of the summary tag name,
- which controls the tab name used for display on Tensorboard.
-
- Returns:
- A summary writer function for scalars.
- """
- with context.device(self._CPU_DEVICE):
- with summary_op_util.summary_scope(
- name, family, values=[tensor]) as (tag, scope):
- gen_summary_ops.write_scalar_summary(
- self._resource, self._update_global_step_tensor(),
- tag, _maybe_cpu(tensor), name=scope)
-
- def histogram(self, name, tensor, family=None):
- """Write a histogram summary.
-
- Args:
- name: A name for the generated node. Will also serve as a series name in
- TensorBoard.
- tensor: A real numeric `Tensor` or compatible value type. Any shape.
- Values to use to build the histogram.
- family: Optional; if provided, used as the prefix of the summary tag name,
- which controls the tab name used for display on Tensorboard.
- """
- with context.device(self._CPU_DEVICE):
- with summary_op_util.summary_scope(
- name, family, values=[tensor]) as (tag, scope):
- gen_summary_ops.write_histogram_summary(
- self._resource, self._update_global_step_tensor(),
- tag, _maybe_cpu(tensor), name=scope)
-
- def image(self, name, tensor, bad_color=None, max_images=3, family=None):
- """Write an image summary."""
- with context.device(self._CPU_DEVICE):
- if bad_color is None:
- bad_color_ = constant_op.constant([255, 0, 0, 255], dtype=dtypes.uint8)
- with summary_op_util.summary_scope(
- name, family, values=[tensor]) as (tag, scope):
- gen_summary_ops.write_image_summary(
- self._resource, self._update_global_step_tensor(),
- tag, _maybe_cpu(tensor), bad_color_, max_images,
- name=scope)
-
- def audio(self, name, tensor, sample_rate, max_outputs, family=None):
- """Write an audio summary.
-
- Args:
- name: A name for the generated node. Will also serve as a series name in
- TensorBoard.
- tensor: A 3-D `float32` `Tensor` of shape `[batch_size, frames, channels]`
- or a 2-D `float32` `Tensor` of shape `[batch_size, frames]`, or
- compatible value type.
- sample_rate: A Scalar `float32` `Tensor` indicating the sample rate of the
- signal in hertz.
- max_outputs: Max number of batch elements to generate audio for.
- family: Optional; if provided, used as the prefix of the summary tag name,
- which controls the tab name used for display on Tensorboard.
- """
- with context.device(self._CPU_DEVICE):
- with summary_op_util.summary_scope(
- name, family, values=[tensor]) as (tag, scope):
- gen_summary_ops.write_audio_summary(
- self._resource, self._update_global_step_tensor(),
- tag,
- _maybe_cpu(tensor),
- sample_rate=_maybe_cpu(sample_rate),
- max_outputs=max_outputs,
- name=scope)
diff --git a/tensorflow/contrib/eager/python/summary_writer_test.py b/tensorflow/contrib/eager/python/summary_writer_test.py
deleted file mode 100644
index 5ebb36d04f..0000000000
--- a/tensorflow/contrib/eager/python/summary_writer_test.py
+++ /dev/null
@@ -1,150 +0,0 @@
-# Copyright 2017 The TensorFlow Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-# ==============================================================================
-"""Unit tests for eager execution SummaryWriter."""
-from __future__ import absolute_import
-from __future__ import division
-from __future__ import print_function
-
-import os
-import shutil
-import tempfile
-
-import numpy as np
-
-from tensorflow.contrib.eager.python import summary_writer
-from tensorflow.core.util import event_pb2
-from tensorflow.python.eager import context
-from tensorflow.python.eager import test
-from tensorflow.python.framework import constant_op
-from tensorflow.python.framework import dtypes
-from tensorflow.python.lib.io import tf_record
-from tensorflow.python.platform import gfile
-
-
-class SummaryWriterTest(test.TestCase):
-
- def setUp(self):
- super(SummaryWriterTest, self).setUp()
- self._test_device = "gpu:0" if context.num_gpus() else "cpu:0"
- self._tmp_logdir = tempfile.mkdtemp()
- with context.device(self._test_device):
- # Use max_queue=0 so that summaries are immediately flushed to filesystem,
- # making testing easier.
- self._writer = summary_writer.SummaryWriter(self._tmp_logdir, max_queue=0)
-
- def tearDown(self):
- if os.path.isdir(self._tmp_logdir):
- shutil.rmtree(self._tmp_logdir)
- super(SummaryWriterTest, self).tearDown()
-
- def _readLastEvent(self, logdir=None):
- if not logdir:
- logdir = self._tmp_logdir
- files = [f for f in gfile.ListDirectory(logdir)
- if not gfile.IsDirectory(os.path.join(logdir, f))]
- file_path = os.path.join(logdir, files[0])
- records = list(tf_record.tf_record_iterator(file_path))
- event = event_pb2.Event()
- event.ParseFromString(records[-1])
- return event
-
- def testGlobalStep(self):
- with context.device(self._test_device):
- orig_step = self._writer.global_step
- self._writer.step()
- self.assertEqual(orig_step + 1, self._writer.global_step)
- self.assertEqual(orig_step + 1, self._writer.global_step)
- self._writer.step()
- self._writer.step()
- self.assertEqual(orig_step + 3, self._writer.global_step)
-
- def testGenericSummary(self):
- with context.device(self._test_device):
- x = constant_op.constant(1337.0)
- with context.device("cpu:0"):
- metadata = constant_op.constant("foo")
- self._writer.generic("x", x, metadata)
- event = self._readLastEvent()
- self.assertEqual("x", event.summary.value[0].tag)
-
- def testScalarSummary(self):
- with context.device(self._test_device):
- x = constant_op.constant(1337.0)
- self._writer.scalar("x", x)
- event = self._readLastEvent()
- self.assertTrue("x", event.summary.value[0].tag)
- self.assertEqual(1337.0, event.summary.value[0].simple_value)
-
- def testHistogramSummary(self):
- with context.device(self._test_device):
- y = constant_op.constant([1.0, 3.0, 3.0, 7.0])
- self._writer.histogram("y", y)
- event = self._readLastEvent()
- self.assertEqual("y", event.summary.value[0].tag)
- self.assertTrue(event.summary.value[0].histo)
-
- def testImageSummary(self):
- with context.device(self._test_device):
- a = constant_op.constant([[10.0, 20.0], [-20.0, -10.0]])
- self._writer.histogram("image1", a)
- event = self._readLastEvent()
- self.assertEqual("image1", event.summary.value[0].tag)
- self.assertTrue(event.summary.value[0].image)
-
- def testAudioSummary(self):
- with context.device(self._test_device):
- w = constant_op.constant(np.random.rand(3, 10, 2), dtype=dtypes.float32)
- fs = constant_op.constant(44100.0, dtype=dtypes.float32)
- max_outputs = 1
- self._writer.audio("audio1", w, fs, max_outputs)
- event = self._readLastEvent()
- self.assertTrue(event.summary.value[0].audio)
-
- def testTwoSummaryWritersGlobalStepsWorkWithoutCrosstalk(self):
- tmp_logdir2 = os.path.join(self._tmp_logdir, "_writer2_")
- writer2 = summary_writer.SummaryWriter(tmp_logdir2, max_queue=0)
-
- self.assertEqual(0, writer2.global_step)
- self._writer.step()
- self.assertEqual(0, writer2.global_step)
- writer2.step()
- writer2.step()
- writer2.step()
- self.assertEqual(3, writer2.global_step)
-
- x = constant_op.constant(1337.0)
- writer_orig_step = self._writer.global_step
- self._writer.step()
- self._writer.scalar("x", x)
-
- event = self._readLastEvent()
- self.assertEqual(writer_orig_step + 1, event.step)
-
- writer2.scalar("x", x)
- event = self._readLastEvent(tmp_logdir2)
- self.assertEqual(3, event.step)
-
- self._writer.step()
- self._writer.scalar("x", x)
-
- event = self._readLastEvent()
- self.assertEqual(writer_orig_step + 2, event.step)
-
-
-# TODO(cais): Add performance benchmark for SummaryWriter.
-
-
-if __name__ == "__main__":
- test.main()
diff --git a/tensorflow/contrib/summary/BUILD b/tensorflow/contrib/summary/BUILD
index f34291c203..5ee5f1ae76 100644
--- a/tensorflow/contrib/summary/BUILD
+++ b/tensorflow/contrib/summary/BUILD
@@ -13,10 +13,7 @@ load(
tf_gen_op_wrapper_py(
name = "gen_summary_ops",
out = "gen_summary_ops.py",
- visibility = ["//tensorflow:internal"],
- deps = [
- "//tensorflow/core:summary_ops_op_lib",
- ],
+ deps = ["//tensorflow/core:summary_ops_op_lib"],
)
py_test(
diff --git a/tensorflow/tools/pip_package/BUILD b/tensorflow/tools/pip_package/BUILD
index e3cbd67721..48fc4c91be 100644
--- a/tensorflow/tools/pip_package/BUILD
+++ b/tensorflow/tools/pip_package/BUILD
@@ -156,7 +156,6 @@ sh_binary(
"//tensorflow/contrib/data/python/ops:prefetching_py",
"//tensorflow/contrib/eager/python/examples:examples_pip",
"//tensorflow/contrib/eager/python:evaluator",
- "//tensorflow/contrib/eager/python:summary_writer",
"//tensorflow/contrib/gan:gan",
"//tensorflow/contrib/graph_editor:graph_editor_pip",
"//tensorflow/contrib/keras:keras",