Stavo guardando i documenti di Tensorflow tf.nn.conv2d
qui intorno . Ma non riesco a capire cosa fa o cosa cerca di raggiungere. Dice sui documenti,
# 1: appiattisce il filtro su una matrice 2D con forma
[filter_height * filter_width * in_channels, output_channels]
.
Ora che cosa fa? È una moltiplicazione saggia o semplicemente una moltiplicazione a matrice? Inoltre non riuscivo a capire gli altri due punti menzionati nei documenti. Le ho scritte di seguito:
# 2: estrae le patch di immagine dal tensore di input per formare un tensore virtuale di forma
[batch, out_height, out_width, filter_height * filter_width * in_channels]
.# 3: per ogni patch, moltiplica a destra la matrice del filtro e il vettore della patch dell'immagine.
Sarebbe davvero utile se qualcuno potesse dare un esempio, un pezzo di codice (estremamente utile) forse e spiegare cosa sta succedendo lì e perché l'operazione è così.
Ho provato a codificare una piccola porzione e a stampare la forma dell'operazione. Tuttavia, non riesco a capire.
Ho provato qualcosa del genere:
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)
Capisco frammenti di reti neurali convoluzionali. Li ho studiati qui . Ma l'implementazione su tensorflow non è quella che mi aspettavo. Quindi ha sollevato la domanda.
EDIT : Quindi, ho implementato un codice molto più semplice. Ma non riesco a capire cosa sta succedendo. Voglio dire come i risultati sono così. Sarebbe estremamente utile se qualcuno potesse dirmi quale processo produce questo output.
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)
produzione
input
[[[[ 1.60314465]
[-0.55022103]]
[[ 0.00595062]
[-0.69889867]]]]
filter
[[[[-0.59594476]]]]
result
[[[[-0.95538563]
[ 0.32790133]]
[[-0.00354624]
[ 0.41650501]]]]
tf.nn.conv2d()
, quindi il metodo in questione non è affatto usato quando usiamo TF con supporto GPU, a meno che nonuse_cudnn_on_gpu=False
sia specificato esplicitamente.