1# Copyright 2016 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 16from __future__ import absolute_import 17from __future__ import division 18from __future__ import print_function 19 20from six.moves import xrange # pylint: disable=redefined-builtin 21 22from tensorflow.core.framework import summary_pb2 23from tensorflow.python.framework import constant_op 24from tensorflow.python.framework import meta_graph 25from tensorflow.python.framework import ops 26from tensorflow.python.ops import array_ops 27from tensorflow.python.ops import variables 28from tensorflow.python.platform import test 29from tensorflow.python.summary import summary as summary_lib 30 31 32class ScalarSummaryTest(test.TestCase): 33 34 def testScalarSummary(self): 35 with self.test_session() as s: 36 i = constant_op.constant(3) 37 with ops.name_scope('outer'): 38 im = summary_lib.scalar('inner', i) 39 summary_str = s.run(im) 40 summary = summary_pb2.Summary() 41 summary.ParseFromString(summary_str) 42 values = summary.value 43 self.assertEqual(len(values), 1) 44 self.assertEqual(values[0].tag, 'outer/inner') 45 self.assertEqual(values[0].simple_value, 3.0) 46 47 def testScalarSummaryWithFamily(self): 48 with self.test_session() as s: 49 i = constant_op.constant(7) 50 with ops.name_scope('outer'): 51 im1 = summary_lib.scalar('inner', i, family='family') 52 self.assertEquals(im1.op.name, 'outer/family/inner') 53 im2 = summary_lib.scalar('inner', i, family='family') 54 self.assertEquals(im2.op.name, 'outer/family/inner_1') 55 sm1, sm2 = s.run([im1, im2]) 56 summary = summary_pb2.Summary() 57 58 summary.ParseFromString(sm1) 59 values = summary.value 60 self.assertEqual(len(values), 1) 61 self.assertEqual(values[0].tag, 'family/outer/family/inner') 62 self.assertEqual(values[0].simple_value, 7.0) 63 64 summary.ParseFromString(sm2) 65 values = summary.value 66 self.assertEqual(len(values), 1) 67 self.assertEqual(values[0].tag, 'family/outer/family/inner_1') 68 self.assertEqual(values[0].simple_value, 7.0) 69 70 def testSummarizingVariable(self): 71 with self.test_session() as s: 72 c = constant_op.constant(42.0) 73 v = variables.Variable(c) 74 ss = summary_lib.scalar('summary', v) 75 init = variables.global_variables_initializer() 76 s.run(init) 77 summ_str = s.run(ss) 78 summary = summary_pb2.Summary() 79 summary.ParseFromString(summ_str) 80 self.assertEqual(len(summary.value), 1) 81 value = summary.value[0] 82 self.assertEqual(value.tag, 'summary') 83 self.assertEqual(value.simple_value, 42.0) 84 85 def testImageSummary(self): 86 with self.test_session() as s: 87 i = array_ops.ones((5, 4, 4, 3)) 88 with ops.name_scope('outer'): 89 im = summary_lib.image('inner', i, max_outputs=3) 90 summary_str = s.run(im) 91 summary = summary_pb2.Summary() 92 summary.ParseFromString(summary_str) 93 values = summary.value 94 self.assertEqual(len(values), 3) 95 tags = sorted(v.tag for v in values) 96 expected = sorted('outer/inner/image/{}'.format(i) for i in xrange(3)) 97 self.assertEqual(tags, expected) 98 99 def testImageSummaryWithFamily(self): 100 with self.test_session() as s: 101 i = array_ops.ones((5, 2, 3, 1)) 102 with ops.name_scope('outer'): 103 im = summary_lib.image('inner', i, max_outputs=3, family='family') 104 self.assertEquals(im.op.name, 'outer/family/inner') 105 summary_str = s.run(im) 106 summary = summary_pb2.Summary() 107 summary.ParseFromString(summary_str) 108 values = summary.value 109 self.assertEqual(len(values), 3) 110 tags = sorted(v.tag for v in values) 111 expected = sorted('family/outer/family/inner/image/{}'.format(i) 112 for i in xrange(3)) 113 self.assertEqual(tags, expected) 114 115 def testHistogramSummary(self): 116 with self.test_session() as s: 117 i = array_ops.ones((5, 4, 4, 3)) 118 with ops.name_scope('outer'): 119 summ_op = summary_lib.histogram('inner', i) 120 summary_str = s.run(summ_op) 121 summary = summary_pb2.Summary() 122 summary.ParseFromString(summary_str) 123 self.assertEqual(len(summary.value), 1) 124 self.assertEqual(summary.value[0].tag, 'outer/inner') 125 126 def testHistogramSummaryWithFamily(self): 127 with self.test_session() as s: 128 i = array_ops.ones((5, 4, 4, 3)) 129 with ops.name_scope('outer'): 130 summ_op = summary_lib.histogram('inner', i, family='family') 131 self.assertEquals(summ_op.op.name, 'outer/family/inner') 132 summary_str = s.run(summ_op) 133 summary = summary_pb2.Summary() 134 summary.ParseFromString(summary_str) 135 self.assertEqual(len(summary.value), 1) 136 self.assertEqual(summary.value[0].tag, 'family/outer/family/inner') 137 138 def testAudioSummary(self): 139 with self.test_session() as s: 140 i = array_ops.ones((5, 3, 4)) 141 with ops.name_scope('outer'): 142 aud = summary_lib.audio('inner', i, 0.2, max_outputs=3) 143 summary_str = s.run(aud) 144 summary = summary_pb2.Summary() 145 summary.ParseFromString(summary_str) 146 values = summary.value 147 self.assertEqual(len(values), 3) 148 tags = sorted(v.tag for v in values) 149 expected = sorted('outer/inner/audio/{}'.format(i) for i in xrange(3)) 150 self.assertEqual(tags, expected) 151 152 def testAudioSummaryWithFamily(self): 153 with self.test_session() as s: 154 i = array_ops.ones((5, 3, 4)) 155 with ops.name_scope('outer'): 156 aud = summary_lib.audio('inner', i, 0.2, max_outputs=3, family='family') 157 self.assertEquals(aud.op.name, 'outer/family/inner') 158 summary_str = s.run(aud) 159 summary = summary_pb2.Summary() 160 summary.ParseFromString(summary_str) 161 values = summary.value 162 self.assertEqual(len(values), 3) 163 tags = sorted(v.tag for v in values) 164 expected = sorted('family/outer/family/inner/audio/{}'.format(i) 165 for i in xrange(3)) 166 self.assertEqual(tags, expected) 167 168 def testSummaryNameConversion(self): 169 c = constant_op.constant(3) 170 s = summary_lib.scalar('name with spaces', c) 171 self.assertEqual(s.op.name, 'name_with_spaces') 172 173 s2 = summary_lib.scalar('name with many $#illegal^: characters!', c) 174 self.assertEqual(s2.op.name, 'name_with_many___illegal___characters_') 175 176 s3 = summary_lib.scalar('/name/with/leading/slash', c) 177 self.assertEqual(s3.op.name, 'name/with/leading/slash') 178 179 def testSummaryWithFamilyMetaGraphExport(self): 180 with ops.name_scope('outer'): 181 i = constant_op.constant(11) 182 summ = summary_lib.scalar('inner', i) 183 self.assertEquals(summ.op.name, 'outer/inner') 184 summ_f = summary_lib.scalar('inner', i, family='family') 185 self.assertEquals(summ_f.op.name, 'outer/family/inner') 186 187 metagraph_def, _ = meta_graph.export_scoped_meta_graph(export_scope='outer') 188 189 with ops.Graph().as_default() as g: 190 meta_graph.import_scoped_meta_graph(metagraph_def, graph=g, 191 import_scope='new_outer') 192 # The summaries should exist, but with outer scope renamed. 193 new_summ = g.get_tensor_by_name('new_outer/inner:0') 194 new_summ_f = g.get_tensor_by_name('new_outer/family/inner:0') 195 196 # However, the tags are unaffected. 197 with self.test_session() as s: 198 new_summ_str, new_summ_f_str = s.run([new_summ, new_summ_f]) 199 new_summ_pb = summary_pb2.Summary() 200 new_summ_pb.ParseFromString(new_summ_str) 201 self.assertEquals('outer/inner', new_summ_pb.value[0].tag) 202 new_summ_f_pb = summary_pb2.Summary() 203 new_summ_f_pb.ParseFromString(new_summ_f_str) 204 self.assertEquals('family/outer/family/inner', 205 new_summ_f_pb.value[0].tag) 206 207 208if __name__ == '__main__': 209 test.main() 210