Я дивився на документи тензорфлоу tf.nn.conv2d
тут . Але я не можу зрозуміти, що це робить або чого намагається досягти. На документах написано,
№1: Вирівняє фільтр до двовимірної матриці з формою
[filter_height * filter_width * in_channels, output_channels]
.
Тепер що це робить? Це мультиплікаційне множення чи просто множення матриці? Я також не міг зрозуміти інші два моменти, згадані в документах. Я написав їх нижче:
№2: Витягує виправлення зображень із вхідного тензора, щоб утворити віртуальний тензор форми
[batch, out_height, out_width, filter_height * filter_width * in_channels]
.# 3: Для кожного патча право-множиться матриця фільтра та вектор патчу зображення.
Було б дуже корисно, якби хтось міг навести приклад, фрагмент коду (надзвичайно корисний), можливо, і пояснити, що там відбувається і чому операція така.
Я спробував кодувати невелику частину і роздрукувати форму операції. Все-таки я не можу зрозуміти.
Я спробував щось подібне:
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)
Я розумію шматочки і шматочки згорткових нейронних мереж. Я їх тут вивчав . Але реалізація на тензорфлоу - це не те, чого я очікував. Тож воно порушило питання.
EDIT : Отже, я реалізував набагато простіший код. Але я не можу зрозуміти, що відбувається. Я маю на увазі, як такі результати. Було б дуже корисно, якби хто-небудь міг сказати мені, який процес дає цей результат.
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)
вихід
input
[[[[ 1.60314465]
[-0.55022103]]
[[ 0.00595062]
[-0.69889867]]]]
filter
[[[[-0.59594476]]]]
result
[[[[-0.95538563]
[ 0.32790133]]
[[-0.00354624]
[ 0.41650501]]]]
tf.nn.conv2d()
, тому розглянутий метод взагалі не використовується, коли ми використовуємо TF з підтримкою GPU, якщоuse_cudnn_on_gpu=False
прямо не вказано.