Je regardais la documentation de tensorflow tf.nn.conv2d
ici . Mais je ne peux pas comprendre ce qu'il fait ou ce qu'il essaie de réaliser. Il dit sur les documents,
# 1: Aplatit le filtre en une matrice 2D avec forme
[filter_height * filter_width * in_channels, output_channels]
.
Maintenant qu'est-ce que cela fait? Est-ce une multiplication élémentaire ou simplement une multiplication matricielle? Je ne pouvais pas non plus comprendre les deux autres points mentionnés dans la documentation. Je les ai écrits ci-dessous:
# 2: Extrait des patchs d'image du tenseur d'entrée pour former un tenseur virtuel de forme
[batch, out_height, out_width, filter_height * filter_width * in_channels]
.# 3: Pour chaque patch, multiplie à droite la matrice de filtre et le vecteur de patch d'image.
Ce serait vraiment utile si quelqu'un pouvait donner un exemple, un morceau de code (extrêmement utile) peut-être et expliquer ce qui se passe là-bas et pourquoi l'opération est comme ça.
J'ai essayé de coder une petite partie et d'imprimer la forme de l'opération. Pourtant, je ne comprends pas.
J'ai essayé quelque chose comme ça:
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)
Je comprends des morceaux de réseaux de neurones convolutifs. Je les ai étudiés ici . Mais l'implémentation sur tensorflow n'est pas ce à quoi je m'attendais. Cela a donc soulevé la question.
EDIT : Donc, j'ai implémenté un code beaucoup plus simple. Mais je ne peux pas comprendre ce qui se passe. Je veux dire comment les résultats sont comme ça. Il serait extrêmement utile que quelqu'un puisse me dire quel processus produit ce résultat.
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)
production
input
[[[[ 1.60314465]
[-0.55022103]]
[[ 0.00595062]
[-0.69889867]]]]
filter
[[[[-0.59594476]]]]
result
[[[[-0.95538563]
[ 0.32790133]]
[[-0.00354624]
[ 0.41650501]]]]
tf.nn.conv2d()
, donc la méthode en question n'est pas du tout utilisée lorsque nous utilisons TF avec le support GPU, sauf si celause_cudnn_on_gpu=False
est spécifié explicitement.