Estaba mirando los documentos de Tensorflow por tf.nn.conv2d
aquí . Pero no puedo entender lo que hace o lo que está tratando de lograr. Dice en los documentos,
# 1: aplana el filtro a una matriz 2D con forma
[filter_height * filter_width * in_channels, output_channels]
.
¿Y ahora qué hace eso? ¿Es esa multiplicación por elementos o simplemente multiplicación de matriz simple? Tampoco pude entender los otros dos puntos mencionados en los documentos. Los he escrito a continuación:
# 2: extrae parches de imagen del tensor de entrada para formar un tensor de forma virtual
[batch, out_height, out_width, filter_height * filter_width * in_channels]
.# 3: Para cada parche, multiplica a la derecha la matriz del filtro y el vector del parche de imagen.
Sería realmente útil si alguien pudiera dar un ejemplo, un fragmento de código (extremadamente útil) tal vez y explicar qué está sucediendo allí y por qué la operación es así.
He intentado codificar una pequeña porción e imprimir la forma de la operación. Aún así, no puedo entender.
Intenté algo como esto:
op = tf.shape(tf.nn.conv2d(tf.random_normal([1,10,10,10]),
tf.random_normal([2,10,10,10]),
strides=[1, 2, 2, 1], padding='SAME'))
with tf.Session() as sess:
result = sess.run(op)
print(result)
Entiendo partes de redes neuronales convolucionales. Los estudié aquí . Pero la implementación en tensorflow no es lo que esperaba. Entonces planteó la pregunta.
EDITAR : Entonces, implementé un código mucho más simple. Pero no puedo entender qué está pasando. Me refiero a cómo son los resultados así. Sería extremadamente útil si alguien pudiera decirme qué proceso produce este resultado.
input = tf.Variable(tf.random_normal([1,2,2,1]))
filter = tf.Variable(tf.random_normal([1,1,1,1]))
op = tf.nn.conv2d(input, filter, strides=[1, 1, 1, 1], padding='SAME')
init = tf.initialize_all_variables()
with tf.Session() as sess:
sess.run(init)
print("input")
print(input.eval())
print("filter")
print(filter.eval())
print("result")
result = sess.run(op)
print(result)
salida
input
[[[[ 1.60314465]
[-0.55022103]]
[[ 0.00595062]
[-0.69889867]]]]
filter
[[[[-0.59594476]]]]
result
[[[[-0.95538563]
[ 0.32790133]]
[[-0.00354624]
[ 0.41650501]]]]
tf.nn.conv2d()
, por lo que el método en cuestión no se usa en absoluto cuando usamos TF con soporte de GPU, a menos queuse_cudnn_on_gpu=False
se especifique explícitamente.