0

Ich versuche, eine "doppelte" Ebene mit Faltung erst dann max Pooling zu erstellen. Das Netzwerk soll 20x20 Eingangsbilder erhalten und eine Klasse von [0,25] ausgeben. Beim Versuch, die Funktionen zu erstellen, erhalte ich den Fehler TypeError: conv2d() got multiple values for argument 'input' beim Aktivieren der Faltungspooling-Schicht.Theano Faltung: TypeError: conv2d() hat mehrere Werte für das Argument 'input'

class ConvPoolLayer: 
    conv_func = T.nnet.conv2d 
    pool_func = max_pool_2d 

    def __init__(self, image_shape, n_feature_maps, act_func, 
       local_receptive_field_size=(5,5), pool_size=(2,2), 
       init_weight_func=init_rand_weights, init_bias_weight_func=init_rand_weights): 
     """ 
     Generate a convolutional and a subsequent pooling layer with one bias node for each channel in the pooling layer. 
     :param image_shape: tuple(batch size, input channels, input rows, input columns) where 
      input_channels = number of feature maps in upstream layer 
      input rows, input columns = output size of upstream layer 
     :param n_feature_maps: number of feature maps/filters in this layer 
     :param local_receptive_field_size: = size of local receptive field 
     :param pool_size: 
     :param act_func: 
     :param init_weight_func: 
     :param init_bias_weight_func: 
     """ 
     self.image_shape = image_shape 
     self.filter_shape = (n_feature_maps, image_shape[1]) + local_receptive_field_size 
     self.act_func = act_func 
     self.pool_size = pool_size 
     self.weights = init_weight_func(self.filter_shape) 
     self.bias_weights = init_bias_weight_func((n_feature_maps,)) 
     self.params = [self.weights, self.bias_weights] 
     self.output_values = None 

    def activate(self, input_values): 
     """ 
     :param input_values: the output from the upstream layer (which is input to this layer) 
     :return: 
     """ 
     input_values = input_values.reshape(self.image_shape) 
     conv = self.conv_func(
      input=input_values, 
      image_shape=self.image_shape, 
      filters=self.weights, 
      filter_shape=self.filter_shape 
     ) 
     pooled = self.pool_func(
      input=conv, 
      ds=self.pool_size, 
      ignore_border=True 
     ) 
     self.output_values = self.act_func(pooled + self.bias_weights.dimshuffle('x', 0, 'x', 'x')) 

    def output(self): 
     assert self.output_values is not None, 'Asking for output before activating layer' 
     return self.output_values 


def test_conv_layer(): 
    batch_size = 10 
    input_shape = (20, 20) 
    output_shape = (26,) 
    image_shape = (batch_size, 1) + input_shape # e.g image_shape = (10, 1, 20, 20) 
    n_feature_maps = 10 
    convpool_layer = ConvPoolLayer(image_shape, n_feature_maps, T.nnet.relu) 

    x = T.fmatrix('X') 
    y = T.fmatrix('Y') 

    convpool_layer.activate(x) 


test_conv_layer() 

Antwort

1

Das Problem ist, dass Sie conv_func() als eine Methode für Ihre Klasse ConvPoolLayer() festlegen. Also, wenn Sie tun:

conv = self.conv_func(input=input_values, 
         image_shape=self.image_shape, 
         filters=self.weights, 
         filter_shape=self.filter_shape) 

Python, hinter der Szene dies tut:

conv = ConvPoolLayer.conv_func(self, input=input_values, 
           image_shape=self.image_shape, 
           filters=self.weights, 
           filter_shape=self.filter_shape) 

und seit input der erste Parameter ist dann mehrere Werte für sie liefern.

Sie können dies vermeiden, indem Sie die Methoden in static Einwickeln() wie folgt aus:

conv_func = staticmethod(T.nnet.conv2d) 

oder aus __init__ die conv_func Attribut festlegen. Beachten Sie, dass Sie das gleiche Problem für pool_func haben werden.

+0

Vielen Dank. Ich habe stundenlang darüber nachgedacht, nirgendwohin zu kommen! Optionale Folgefrage: Warum ist es notwendig, die Bias-Gewichte zu "verdunkeln", bevor sie zum Pooling-Layer hinzugefügt werden? 'self.output_values ​​= self.act_func (gepoolte + self.bias_weights.dimshuffle ('x', 0, 'x', 'x'))' Ist es möglich, die Gewichte auf die richtige Form zu bringen? – tsorn

+1

Sie könnten die bias_weights so gestalten, dass sie (1, n_feature_maps, 1, 1) sind, wenn Sie möchten, aber das Dimming-Shuffling macht das nur vorübergehend. Der Grund, warum Sie das brauchen, ist, dass die Dinge die gleiche (Broadcast-kompatible) Form haben müssen, um zusammengefügt zu werden. – abergeron

Verwandte Themen