Eu estava olhando os documentos do tensorflow tf.nn.conv2d
aqui . Mas não consigo entender o que faz ou o que está tentando alcançar. Diz nos documentos,
# 1: Nivela o filtro para uma matriz 2-D com forma
[filter_height * filter_width * in_channels, output_channels]
.
Agora o que isso faz? Isso é multiplicação por elementos ou simplesmente multiplicação por matriz? Também não consegui entender os outros dois pontos mencionados nos documentos. Eu os escrevi abaixo:
# 2: Extrai amostras de imagens do tensor de entrada para formar um tensor virtual de forma
[batch, out_height, out_width, filter_height * filter_width * in_channels]
.Nº 3: para cada patch, multiplica à direita a matriz do filtro e o vetor de patch da imagem.
Seria realmente útil se alguém pudesse dar um exemplo, um pedaço de código (extremamente útil) talvez e explicar o que está acontecendo lá e por que a operação é assim.
Tentei codificar uma pequena parte e imprimir a forma da operação. Ainda assim, eu não consigo entender.
Eu tentei algo assim:
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)
Entendo pedaços de redes neurais convolucionais. Eu os estudei aqui . Mas a implementação no tensorflow não é o que eu esperava. Por isso, levantou a questão.
EDIT : Então, eu implementei um código muito mais simples. Mas não consigo descobrir o que está acontecendo. Quero dizer como os resultados são assim. Seria extremamente útil se alguém pudesse me dizer qual processo produz essa saída.
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)
resultado
input
[[[[ 1.60314465]
[-0.55022103]]
[[ 0.00595062]
[-0.69889867]]]]
filter
[[[[-0.59594476]]]]
result
[[[[-0.95538563]
[ 0.32790133]]
[[-0.00354624]
[ 0.41650501]]]]
tf.nn.conv2d()
, portanto o método em questão não é usado quando usamos o TF com suporte à GPU, a menos queuse_cudnn_on_gpu=False
seja especificado explicitamente.