So habe ich einen Tensor h_in
der Form (50, ?, 1, 100)
, die ich jetzt gerne in Form (50, 1, 1, 100)
durch die Übernahme der max über die Achse 1
werden würde.tensorflow - get max von Tensor
Wie mache ich das?
Ich versuchte
h_out = max_pool(h_in)
mit
def max_pool(h,ksize=[1,-1,1,1],strides=[1,1,1,1],padding='VALID'):
return tf.nn.max_pool(h,ksize=ksize,strides=strides,padding=padding)
aber das scheint nicht die Größe zu reduzieren.
runnable Beispiel:
import tensorflow as tf
import numpy as np
import numpy.random as nprand
def _weight_variable(shape,name):
initial = tf.truncated_normal(shape,stddev=0.1)
v = tf.Variable(initial,name=name)
return v
def _bias_variable(shape,name):
initial = tf.constant(0.1,shape=shape)
v = tf.Variable(initial,name=name)
return v
def _embedding_variable(shape,name):
initial = tf.truncated_normal(shape)
v = tf.Variable(initial,name=name)
return v
def conv2d(x,W,strides=[1,1,1,1],padding='VALID'):
return tf.nn.conv2d(x,W,strides=strides,padding=padding)
def max_pool(h,ksize=[1,-1,1,1],strides=[1,1,1,1],padding='VALID'):
return tf.nn.max_pool(h,ksize=ksize,strides=strides,padding=padding)
nof_embeddings= 55000
dim_embeddings = 300
batch_size = 50
filter_size = 100
x_input = tf.placeholder(tf.int32, shape=[batch_size, None])
def _model():
embeddings = _embedding_variable([nof_embeddings,dim_embeddings],'embeddings')
h_lookup = tf.nn.embedding_lookup(embeddings,x_input)
h_embed = tf.reshape(h_lookup,[batch_size,-1,dim_embeddings,1])
f = 3
W_conv1f = _weight_variable([f,dim_embeddings,1,filter_size],f'W_conv1_{f}')
b_conv1f = _bias_variable([filter_size],f'b_conv1_{f}')
h_conv1f = tf.nn.relu(conv2d(h_embed,W_conv1f) + b_conv1f)
h_pool1f = max_pool(h_conv1f)
print("h_embed:",h_embed.get_shape())
print()
print(f'h_conv1_{f}:',h_conv1f.get_shape())
print(f'h_pool1_{f}:',h_pool1f.get_shape())
print()
return tf.shape(h_pool1f)
if __name__ == '__main__':
tensor_length = 35
model = _model()
with tf.Session() as sess:
tf.global_variables_initializer().run()
batch = nprand.randint(0,nof_embeddings,size=[batch_size,tensor_length])
shape = sess.run(model,
feed_dict ={
x_input : batch
})
print('result:',shape)
die Ausgänge
h_embed: (50, ?, 300, 1)
h_conv1_3: (50, ?, 1, 100)
h_pool1_3: (50, ?, 1, 100)
result: [ 50 35 1 100]
Sagen wir, ich stattdessen die Größe codieren, was ich will:
h_pool1f = max_pool(h_conv1f,ksize=[1,35-f+1,1,1])
, das funktioniert. Aber jetzt bin ich in Schwierigkeiten, sobald ich die tensor_length
(die zur Laufzeit festgelegt ist, also nein, ich kann es nicht fest codieren).
Eine "Lösung" wäre es, die Eingabe bis zu einer festen maximalen Länge durch Auffüllen oder etwas zu blasen, aber das führt wiederum unnötige Berechnungen und eine künstliche Kappe ein, die ich sehr gerne vermeiden würde.
So gibt es
- einen Weg tensorflow "richtig" erkennt die
-1
ink_size
zu machen? - oder eine andere Möglichkeit, das Maximum zu berechnen?
Ich denke, 'tf.reduce_max' ist das, was Sie suchen –
@PietroTortella getestet es für ein bisschen, bereit zu glauben, dass es tut, was ich suche, danke. Möchten Sie Ihren Kommentar zu einer Antwort erweitern? – User1291