示例#1
0
  def ConvOuter(self, grad):
    w = self.params['weight']
    conv = self.conv_params
    size = conv.size
    stride = conv.stride
    padding = conv.padding
    num_filters = conv.num_filters
    num_colors = conv.num_colors

    f, numdims = w.shape
    assert f == num_filters, 'f is %d but num_filters is %d' % (f, num_filters)
    assert numdims == size**2 * num_colors

    input_t = self.input_t
    if conv.max_pool:
      output_t = self.unpooled_layer
    else:
      output_t = self.output_t
    numimages, numdims = input_t.shape

    assert numdims % num_colors == 0
    x = int(np.sqrt(numdims / num_colors))
    assert x**2 == numdims/num_colors

    n_locs = (x + 2 * padding - size) / stride + 1

    self.node1.state.transpose(input_t)
    cc.convOutp(input_t, output_t, grad, n_locs, size, stride, num_colors)
示例#2
0
def ConvOuter(edge, grad):
  """Get the gradient for the weights in this edge.
  Args:
    grad: (output) the gradient for the weights in this edge.
  """
  w = edge.params['weight']
  conv = edge.conv_params
  size = conv.size
  stride = conv.stride
  padding = conv.padding
  num_filters = conv.num_filters
  num_colors = conv.num_colors

  f, numdims = w.shape
  assert f == num_filters, 'f is %d but num_filters is %d' % (f, num_filters)
  if edge.conv:
    assert numdims == size**2 * num_colors
  input_t = edge.input_t
  if conv.max_pool:
    output_t = edge.unpooled_layer
  elif conv.rnorm:
    output_t = edge.rnorm_temp2
  else:
    output_t = edge.output_t2
  numdims, numimages = edge.node1.state.shape

  assert numdims % num_colors == 0
  x = int(math.sqrt(numdims / num_colors))

  assert x**2 == numdims/num_colors

  n_locs = (x + 2 * padding - size) / stride + 1

  if edge.conv:
    cc.convOutp(input_t, output_t, grad, n_locs, padding, size, stride, num_colors)
  else:
    cc.localOutp(input_t, output_t, grad, n_locs, padding, size, stride, num_colors)