| 102 | self.built = True |
| 103 | |
| 104 | def call(self, inputs, training=None): |
| 105 | input_shape = K.int_shape(inputs) |
| 106 | reduction_axes = list(range(0, len(input_shape))) |
| 107 | |
| 108 | if (self.axis is not None): |
| 109 | del reduction_axes[self.axis] |
| 110 | |
| 111 | del reduction_axes[0] |
| 112 | |
| 113 | mean, var = tf.nn.moments(inputs, reduction_axes, keep_dims=True) |
| 114 | stddev = tf.sqrt(var) + self.epsilon |
| 115 | normed = (inputs - mean) / stddev |
| 116 | |
| 117 | broadcast_shape = [1] * len(input_shape) |
| 118 | if self.axis is not None: |
| 119 | broadcast_shape[self.axis] = input_shape[self.axis] |
| 120 | |
| 121 | if self.scale: |
| 122 | broadcast_gamma = K.reshape(self.gamma, broadcast_shape) |
| 123 | normed = normed * broadcast_gamma |
| 124 | if self.center: |
| 125 | broadcast_beta = K.reshape(self.beta, broadcast_shape) |
| 126 | normed = normed + broadcast_beta |
| 127 | return normed |
| 128 | |
| 129 | def get_config(self): |
| 130 | config = { |