이현규

Import new kaggle solution

This diff could not be displayed because it is too large.
This diff is collapsed. Click to expand it.
1 +# Copyright 2016 Google Inc. 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 +"""Contains a collection of util functions for training and evaluating."""
15 +
16 +import numpy
17 +import tensorflow as tf
18 +from tensorflow import logging
19 +
20 +try:
21 + xrange # Python 2
22 +except NameError:
23 + xrange = range # Python 3
24 +
25 +
26 +def Dequantize(feat_vector, max_quantized_value=2, min_quantized_value=-2):
27 + """Dequantize the feature from the byte format to the float format.
28 +
29 + Args:
30 + feat_vector: the input 1-d vector.
31 + max_quantized_value: the maximum of the quantized value.
32 + min_quantized_value: the minimum of the quantized value.
33 +
34 + Returns:
35 + A float vector which has the same shape as feat_vector.
36 + """
37 + assert max_quantized_value > min_quantized_value
38 + quantized_range = max_quantized_value - min_quantized_value
39 + scalar = quantized_range / 255.0
40 + bias = (quantized_range / 512.0) + min_quantized_value
41 + return feat_vector * scalar + bias
42 +
43 +
44 +def MakeSummary(name, value):
45 + """Creates a tf.Summary proto with the given name and value."""
46 + summary = tf.Summary()
47 + val = summary.value.add()
48 + val.tag = str(name)
49 + val.simple_value = float(value)
50 + return summary
51 +
52 +
53 +def AddGlobalStepSummary(summary_writer,
54 + global_step_val,
55 + global_step_info_dict,
56 + summary_scope="Eval"):
57 + """Add the global_step summary to the Tensorboard.
58 +
59 + Args:
60 + summary_writer: Tensorflow summary_writer.
61 + global_step_val: a int value of the global step.
62 + global_step_info_dict: a dictionary of the evaluation metrics calculated for
63 + a mini-batch.
64 + summary_scope: Train or Eval.
65 +
66 + Returns:
67 + A string of this global_step summary
68 + """
69 + this_hit_at_one = global_step_info_dict["hit_at_one"]
70 + this_perr = global_step_info_dict["perr"]
71 + this_loss = global_step_info_dict["loss"]
72 + examples_per_second = global_step_info_dict.get("examples_per_second", -1)
73 +
74 + summary_writer.add_summary(
75 + MakeSummary("GlobalStep/" + summary_scope + "_Hit@1", this_hit_at_one),
76 + global_step_val)
77 + summary_writer.add_summary(
78 + MakeSummary("GlobalStep/" + summary_scope + "_Perr", this_perr),
79 + global_step_val)
80 + summary_writer.add_summary(
81 + MakeSummary("GlobalStep/" + summary_scope + "_Loss", this_loss),
82 + global_step_val)
83 +
84 + if examples_per_second != -1:
85 + summary_writer.add_summary(
86 + MakeSummary("GlobalStep/" + summary_scope + "_Example_Second",
87 + examples_per_second), global_step_val)
88 +
89 + summary_writer.flush()
90 + info = (
91 + "global_step {0} | Batch Hit@1: {1:.3f} | Batch PERR: {2:.3f} | Batch "
92 + "Loss: {3:.3f} | Examples_per_sec: {4:.3f}").format(
93 + global_step_val, this_hit_at_one, this_perr, this_loss,
94 + examples_per_second)
95 + return info
96 +
97 +
98 +def AddEpochSummary(summary_writer,
99 + global_step_val,
100 + epoch_info_dict,
101 + summary_scope="Eval"):
102 + """Add the epoch summary to the Tensorboard.
103 +
104 + Args:
105 + summary_writer: Tensorflow summary_writer.
106 + global_step_val: a int value of the global step.
107 + epoch_info_dict: a dictionary of the evaluation metrics calculated for the
108 + whole epoch.
109 + summary_scope: Train or Eval.
110 +
111 + Returns:
112 + A string of this global_step summary
113 + """
114 + epoch_id = epoch_info_dict["epoch_id"]
115 + avg_hit_at_one = epoch_info_dict["avg_hit_at_one"]
116 + avg_perr = epoch_info_dict["avg_perr"]
117 + avg_loss = epoch_info_dict["avg_loss"]
118 + aps = epoch_info_dict["aps"]
119 + gap = epoch_info_dict["gap"]
120 + mean_ap = numpy.mean(aps)
121 +
122 + summary_writer.add_summary(
123 + MakeSummary("Epoch/" + summary_scope + "_Avg_Hit@1", avg_hit_at_one),
124 + global_step_val)
125 + summary_writer.add_summary(
126 + MakeSummary("Epoch/" + summary_scope + "_Avg_Perr", avg_perr),
127 + global_step_val)
128 + summary_writer.add_summary(
129 + MakeSummary("Epoch/" + summary_scope + "_Avg_Loss", avg_loss),
130 + global_step_val)
131 + summary_writer.add_summary(
132 + MakeSummary("Epoch/" + summary_scope + "_MAP", mean_ap), global_step_val)
133 + summary_writer.add_summary(
134 + MakeSummary("Epoch/" + summary_scope + "_GAP", gap), global_step_val)
135 + summary_writer.flush()
136 +
137 + info = ("epoch/eval number {0} | Avg_Hit@1: {1:.3f} | Avg_PERR: {2:.3f} "
138 + "| MAP: {3:.3f} | GAP: {4:.3f} | Avg_Loss: {5:3f} | num_classes: {6}"
139 + ).format(epoch_id, avg_hit_at_one, avg_perr, mean_ap, gap, avg_loss,
140 + len(aps))
141 + return info
142 +
143 +
144 +def GetListOfFeatureNamesAndSizes(feature_names, feature_sizes):
145 + """Extract the list of feature names and the dimensionality of each feature
146 +
147 + from string of comma separated values.
148 +
149 + Args:
150 + feature_names: string containing comma separated list of feature names
151 + feature_sizes: string containing comma separated list of feature sizes
152 +
153 + Returns:
154 + List of the feature names and list of the dimensionality of each feature.
155 + Elements in the first/second list are strings/integers.
156 + """
157 + list_of_feature_names = [
158 + feature_names.strip() for feature_names in feature_names.split(",")
159 + ]
160 + list_of_feature_sizes = [
161 + int(feature_sizes) for feature_sizes in feature_sizes.split(",")
162 + ]
163 + if len(list_of_feature_names) != len(list_of_feature_sizes):
164 + logging.error("length of the feature names (=" +
165 + str(len(list_of_feature_names)) + ") != length of feature "
166 + "sizes (=" + str(len(list_of_feature_sizes)) + ")")
167 +
168 + return list_of_feature_names, list_of_feature_sizes
169 +
170 +
171 +def clip_gradient_norms(gradients_to_variables, max_norm):
172 + """Clips the gradients by the given value.
173 +
174 + Args:
175 + gradients_to_variables: A list of gradient to variable pairs (tuples).
176 + max_norm: the maximum norm value.
177 +
178 + Returns:
179 + A list of clipped gradient to variable pairs.
180 + """
181 + clipped_grads_and_vars = []
182 + for grad, var in gradients_to_variables:
183 + if grad is not None:
184 + if isinstance(grad, tf.IndexedSlices):
185 + tmp = tf.clip_by_norm(grad.values, max_norm)
186 + grad = tf.IndexedSlices(tmp, grad.indices, grad.dense_shape)
187 + else:
188 + grad = tf.clip_by_norm(grad, max_norm)
189 + clipped_grads_and_vars.append((grad, var))
190 + return clipped_grads_and_vars
191 +
192 +
193 +def combine_gradients(tower_grads):
194 + """Calculate the combined gradient for each shared variable across all towers.
195 +
196 + Note that this function provides a synchronization point across all towers.
197 +
198 + Args:
199 + tower_grads: List of lists of (gradient, variable) tuples. The outer list is
200 + over individual gradients. The inner list is over the gradient calculation
201 + for each tower.
202 +
203 + Returns:
204 + List of pairs of (gradient, variable) where the gradient has been summed
205 + across all towers.
206 + """
207 + filtered_grads = [
208 + [x for x in grad_list if x[0] is not None] for grad_list in tower_grads
209 + ]
210 + final_grads = []
211 + for i in xrange(len(filtered_grads[0])):
212 + grads = [filtered_grads[t][i] for t in xrange(len(filtered_grads))]
213 + grad = tf.stack([x[0] for x in grads], 0)
214 + grad = tf.reduce_sum(grad, 0)
215 + final_grads.append((
216 + grad,
217 + filtered_grads[0][i][1],
218 + ))
219 +
220 + return final_grads