0

Ich versuche, eine Implementierung von this Papier in TensorFlow zu schreiben, und ich habe ein bisschen ein Haken gefunden. In meiner Pooling-Ebene muss ich alles miteinander verketten. Dies ist der Code, den ich verwenden:Wie man "Jagged" Tensoren verketten kann

pooled_outputs = [] 
    for i, filter_size in enumerate(filter_sizes): 
     with tf.name_scope("conv-maxpool-%s" % filter_size): 
      # Conv layer 
      filter_shape = [filter_size, embedding_size, 1, num_filters] 
      # W is the filter matrix 
      W = tf.Variable(tf.truncated_normal(filter_shape, stddev=0.1), name="W") 
      b = tf.Variable(tf.constant(0.1, shape=[num_filters]), name="b") 
      conv = tf.nn.conv2d(
       self.embedded_chars_expanded, 
       W, 
       strides=[1, 1, 1, 1], 
       padding="VALID", 
       name="conv" 
      ) 

      # Apply nonlinearity 
      h = tf.nn.relu(tf.nn.bias_add(conv, b), name="relu") 

      # Max-pooling layer over the outputs 
      pooled = tf.nn.max_pool(
       h, 
       ksize=[1, sequence_lengths[i] - filter_size + 1, 1, 1], 
       strides=[1, 1, 1, 1], 
       padding="VALID", 
       name="pool" 
      ) 
      pooled_outputs.append(pooled) 

    # Combine all of the pooled features 
    num_filters_total = num_filters * len(filter_sizes) 

    print(pooled_outputs) 
    pooled_outputs = [tf.reshape(out, ["?", 94, 1, self.max_length]) for out in pooled_outputs] # The problem line 

    self.h_pool = tf.concat(3, pooled_outputs) 

Wenn ich diesen Code ausführen, es druckt diese für pooled_outputs:

[<tf.Tensor 'conv-maxpool-3/pool:0' shape=(?, 94, 1, 128) dtype=float32>, <tf.Tensor 'conv-maxpool-4/pool:0' shape=(?, 51, 1, 128) dtype=float32>, <tf.Tensor 'conv-maxpool-5/pool:0' shape=(?, 237, 1, 128) dtype=float32>] 

ich ursprünglich versucht diesen Code ohne die pooled_outputs = [tf.reshape(out, ["?", 94, 1, self.max_length]) for out in pooled_outputs] Linie dort, und ich habe diesen Fehler :

ValueError: Dimension 1 in both shapes must be equal, but are 51 and 237 

Als ich in der reshape Zeile hinzugefügt, bekam ich diese Fehlermeldung:

TypeError: Expected binary or unicode string, got 94 

Der zweite Fehler, den ich kenne, ist, weil ich ein "?" für die neue Größe, und der erste Fehler denke ich ist, weil die Tensoren nicht die gleiche Größe haben. Wie kann ich diese Tensors richtig auffüllen, damit ich sie ohne Probleme verketten kann?

Antwort

1

Sie können -1 als eine der Komponenten der Form an die tf.reshape Methode übergeben; es wird automatisch aus der Form Ihres Tensors abgeleitet, so dass die Gesamtgröße gleich ist.

Also, versuchen Sie das Problem Linie

pooled_outputs = [tf.reshape(out, [-1, 94, 1, self.max_length]) for out in pooled_outputs] 

Siehe documentation für Details zu ändern

Verwandte Themen