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?