def call(self, inputs):
   if self._reshape_required:
     reshaped_inputs = []
     input_ndims = list(map(K.ndim, inputs))
     if None not in input_ndims:
       # If ranks of all inputs are available,
       # we simply expand each of them at axis=1
       # until all of them have the same rank.
       max_ndim = max(input_ndims)
       for x in inputs:
         x_ndim = K.ndim(x)
         for _ in range(max_ndim - x_ndim):
           x = K.expand_dims(x, 1)
         reshaped_inputs.append(x)
       return self._merge_function(reshaped_inputs)
     else:
       # Transpose all inputs so that batch size is the last dimension.
       # (batch_size, dim1, dim2, ... ) -> (dim1, dim2, ... , batch_size)
       transposed = False
       for x in inputs:
         x_ndim = K.ndim(x)
         if x_ndim is None:
           x_shape = K.shape(x)
           batch_size = x_shape[0]
           new_shape = K.concatenate([x_shape[1:], K.expand_dims(batch_size)])
           x_transposed = K.reshape(x,
                                    K.stack([batch_size,
                                             K.prod(x_shape[1:])]))
           x_transposed = K.permute_dimensions(x_transposed, (1, 0))
           x_transposed = K.reshape(x_transposed, new_shape)
           reshaped_inputs.append(x_transposed)
           transposed = True
         elif x_ndim > 1:
           dims = list(range(1, x_ndim)) + [0]
           reshaped_inputs.append(K.permute_dimensions(x, dims))
           transposed = True
         else:
           # We don't transpose inputs if they are 1D vectors or scalars.
           reshaped_inputs.append(x)
       y = self._merge_function(reshaped_inputs)
       y_ndim = K.ndim(y)
       if transposed:
         # If inputs have been transposed, we have to transpose the output too.
         if y_ndim is None:
           y_shape = K.shape(y)
           y_ndim = K.shape(y_shape)[0]
           batch_size = y_shape[y_ndim - 1]
           new_shape = K.concatenate(
               [K.expand_dims(batch_size), y_shape[:y_ndim - 1]])
           y = K.reshape(y, (-1, batch_size))
           y = K.permute_dimensions(y, (1, 0))
           y = K.reshape(y, new_shape)
         elif y_ndim > 1:
           dims = [y_ndim - 1] + list(range(y_ndim - 1))
           y = K.permute_dimensions(y, dims)
       return y
   else:
     return self._merge_function(inputs)
 def compute_mask(self, inputs, mask=None):
   if mask is None:
     return None
   if not isinstance(mask, list):
     raise ValueError('`mask` should be a list.')
   if not isinstance(inputs, list):
     raise ValueError('`inputs` should be a list.')
   if len(mask) != len(inputs):
     raise ValueError('The lists `inputs` and `mask` '
                      'should have the same length.')
   if all([m is None for m in mask]):
     return None
   # Make a list of masks while making sure
   # the dimensionality of each mask
   # is the same as the corresponding input.
   masks = []
   for input_i, mask_i in zip(inputs, mask):
     if mask_i is None:
       # Input is unmasked. Append all 1s to masks,
       # but cast it to bool first
       masks.append(K.cast(K.ones_like(input_i), 'bool'))
     elif K.ndim(mask_i) < K.ndim(input_i):
       # Mask is smaller than the input, expand it
       masks.append(K.expand_dims(mask_i))
     else:
       masks.append(mask_i)
   concatenated = K.concatenate(masks, axis=self.axis)
   return K.all(concatenated, axis=-1, keepdims=False)
Exemplo n.º 3
0
 def call(self, inputs):
     inputs = K.expand_dims(inputs, 2)  # add dummy last dimension
     output = self._pooling_function(inputs=inputs,
                                     pool_size=self.pool_size + (1, ),
                                     strides=self.strides + (1, ),
                                     padding=self.padding,
                                     data_format='channels_last')
     return K.squeeze(output, 2)  # remove dummy last dimension
Exemplo n.º 4
0
 def get_initial_states(self, inputs):
   # build an all-zero tensor of shape (samples, output_dim)
   initial_state = K.zeros_like(inputs)  # (samples, timesteps, input_dim)
   initial_state = K.sum(initial_state, axis=(1, 2))  # (samples,)
   initial_state = K.expand_dims(initial_state)  # (samples, 1)
   initial_state = K.tile(initial_state, [1,
                                          self.units])  # (samples, output_dim)
   initial_states = [initial_state for _ in range(len(self.states))]
   return initial_states
Exemplo n.º 5
0
 def call(self, inputs):
   inputs = K.expand_dims(inputs, 2)  # add dummy last dimension
   output = self._pooling_function(
       inputs=inputs,
       pool_size=self.pool_size + (1,),
       strides=self.strides + (1,),
       padding=self.padding,
       data_format='channels_last')
   return K.squeeze(output, 2)  # remove dummy last dimension
Exemplo n.º 6
0
 def get_initial_state(self, inputs):
   # build an all-zero tensor of shape (samples, output_dim)
   initial_state = K.zeros_like(inputs)  # (samples, timesteps, input_dim)
   initial_state = K.sum(initial_state, axis=(1, 2))  # (samples,)
   initial_state = K.expand_dims(initial_state)  # (samples, 1)
   initial_state = K.tile(initial_state, [1,
                                          self.units])  # (samples, output_dim)
   initial_state = [initial_state for _ in range(len(self.states))]
   return initial_state
Exemplo n.º 7
0
 def call(self, x, mask=None):
     input_shape = K.int_shape(x)
     layer_width = input_shape[self.waxis]
     layer_height = input_shape[self.haxis]
     img_width = self.img_size[0]
     img_height = self.img_size[1]
     # define prior boxes shapes
     box_widths = []
     box_heights = []
     for ar in self.aspect_ratios:
         if ar == 1 and len(box_widths) == 0:
             box_widths.append(self.min_size)
             box_heights.append(self.min_size)
         elif ar == 1 and len(box_widths) > 0:
             box_widths.append(np.sqrt(self.min_size * self.max_size))
             box_heights.append(np.sqrt(self.min_size * self.max_size))
         elif ar != 1:
             box_widths.append(self.min_size * np.sqrt(ar))
             box_heights.append(self.min_size / np.sqrt(ar))
     box_widths = 0.5 * np.array(box_widths)
     box_heights = 0.5 * np.array(box_heights)
     # define centers of prior boxes
     step_x = img_width / layer_width
     step_y = img_height / layer_height
     linx = np.linspace(0.5 * step_x, img_width - 0.5 * step_x, layer_width)
     liny = np.linspace(0.5 * step_y, img_height - 0.5 * step_y,
                        layer_height)
     centers_x, centers_y = np.meshgrid(linx, liny)
     centers_x = centers_x.reshape(-1, 1)
     centers_y = centers_y.reshape(-1, 1)
     # define xmin, ymin, xmax, ymax of prior boxes
     num_priors_ = len(self.aspect_ratios)
     prior_boxes = np.concatenate((centers_x, centers_y), axis=1)
     prior_boxes = np.tile(prior_boxes, (1, 2 * num_priors_))
     prior_boxes[:, ::4] -= box_widths
     prior_boxes[:, 1::4] -= box_heights
     prior_boxes[:, 2::4] += box_widths
     prior_boxes[:, 3::4] += box_heights
     prior_boxes[:, ::2] /= img_width
     prior_boxes[:, 1::2] /= img_height
     prior_boxes = prior_boxes.reshape(-1, 4)
     if self.clip:
         prior_boxes = np.minimum(np.maximum(prior_boxes, 0.0), 1.0)
     # define variances
     num_boxes = len(prior_boxes)
     if len(self.variances) == 1:
         variances = np.ones((num_boxes, 4)) * self.variances[0]
     elif len(self.variances) == 4:
         variances = np.tile(self.variances, (num_boxes, 1))
     else:
         raise Exception('Must provide one or four variances.')
     prior_boxes = np.concatenate((prior_boxes, variances), axis=1)
     prior_boxes_tensor = K.expand_dims(K.variable(prior_boxes), 0)
     pattern = [tf.shape(x)[0], 1, 1]
     prior_boxes_tensor = tf.tile(prior_boxes_tensor, pattern)
     return prior_boxes_tensor
 def compute_mask(self, inputs, mask=None):
   if mask is None:
     return None
   if not isinstance(mask, list):
     raise ValueError('`mask` should be a list.')
   if not isinstance(inputs, list):
     raise ValueError('`inputs` should be a list.')
   if len(mask) != len(inputs):
     raise ValueError('The lists `inputs` and `mask` '
                      'should have the same length.')
   if all([m is None for m in mask]):
     return None
   masks = [K.expand_dims(m, 0) for m in mask if m is not None]
   return K.all(K.concatenate(masks, axis=0), axis=0, keepdims=False)
Exemplo n.º 9
0
 def _forward_step(inputs, state):
     state = K.expand_dims(state, 2)
     transition_scores = state + U_expanded
     new_alphas = inputs + math_ops.reduce_logsumexp(transition_scores, [1])
     return new_alphas, new_alphas