Patrzyłem na dokumentację tensorflow o tf.nn.conv2d
tutaj . Ale nie mogę zrozumieć, co to robi ani co próbuje osiągnąć. W dokumentach jest napisane,
# 1: spłaszcza filtr do matrycy 2-D z kształtem
[filter_height * filter_width * in_channels, output_channels]
.
Co to teraz robi? Czy jest to mnożenie elementarne, czy po prostu zwykłe mnożenie macierzy? Też nie mogłem zrozumieć pozostałych dwóch punktów wymienionych w dokumentach. Napisałem je poniżej:
# 2: Wyodrębnia łaty obrazu z wejściowego tensora, aby utworzyć wirtualny tensor kształtu
[batch, out_height, out_width, filter_height * filter_width * in_channels]
.# 3: Dla każdego obszaru mnoży się w prawo macierz filtra i wektor wstawki obrazu.
Byłoby naprawdę pomocne, gdyby ktoś mógł podać przykład, może fragment kodu (niezwykle pomocny) i wyjaśnić, co się tam dzieje i dlaczego tak się dzieje.
Próbowałem zakodować małą część i wydrukować kształt operacji. Wciąż nie mogę tego zrozumieć.
Próbowałem czegoś takiego:
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)
Rozumiem bity i fragmenty konwolucyjnych sieci neuronowych. Studiowałem je tutaj . Ale implementacja na tensorflow nie jest tym, czego się spodziewałem. Więc to wywołało pytanie.
EDYCJA : Więc zaimplementowałem znacznie prostszy kod. Ale nie mogę dowiedzieć się, co się dzieje. Mam na myśli, jakie są takie wyniki. Byłoby niezwykle pomocne, gdyby ktokolwiek mógł mi powiedzieć, jaki proces daje taki wynik.
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)
wynik
input
[[[[ 1.60314465]
[-0.55022103]]
[[ 0.00595062]
[-0.69889867]]]]
filter
[[[[-0.59594476]]]]
result
[[[[-0.95538563]
[ 0.32790133]]
[[-0.00354624]
[ 0.41650501]]]]
tf.nn.conv2d()
, więc omawiana metoda nie jest w ogóle używana, gdy używamy TF z obsługą GPU, chyba że zostanieuse_cudnn_on_gpu=False
to wyraźnie określone.