2016-05-24 6 views
1

В Tensorflow docs, то tf.nn.conv2d -операция описано в:Автономные патч изображения извлечение оп в Tensorflow

  1. Сплющит фильтр к матрице 2-D с формой [filter_height * filter_width * in_channels, output_channels].
  2. Извлечь пятна изображения из входного тензора для формирования виртуального тензора формы [batch, out_height, out_width, filter_height * filter_width * in_channels].
  3. Для каждого патча умножьте матрицу фильтра и вектор паттерна изображения.

Есть ли операция по нанесению только Шаг 2? Я не могу найти ничего подобного в документах API. Возможно, я искал неправильные ключевые слова.

ответ

2

Я думаю, трюк, чтобы сделать это было бы:

  1. Возьмите фильтр формы [filter_height, filter_width, in_channels, output_channels] с output_channels = filter_height * filter_width * in_channels
  2. Зафиксировать значение этого фильтра таким образом, что когда фильтр сплющивается к 2-D матрица (см. Ваш шаг 2) , это единичная матрица. Проверьте мой пример код ниже для простого способа сделать это с np.eye().reshape()
  3. Выполнить нормальный tf.nn.conv2d(input, filter, strides=[1, 1, 1, 1], padding='SAME')

Теперь у вас есть выход формы [batch, out_height, out_width, filter_height * filter_width * in_channels]


Вот простой код для входа изображение размером 3 * 3 с 1 каналом (и размером партии 1).

import tensorflow as tf 
import numpy as np 

input_value = np.arange(1, 10).reshape((1, 3, 3, 1)) 
input = tf.constant(input_value) 
input = tf.cast(input, tf.float32) 

filter_value = np.eye(9).reshape((3, 3, 1, 9)) 
filter = tf.constant(filter_value) 
filter = tf.cast(filter, tf.float32) 

output = tf.nn.conv2d(input, filter, strides=[1, 1, 1, 1], padding='SAME') 
+0

Спасибо, я передам этот подход попробовать. Жаль, что мы должны делать «ненужную работу», но, вероятно, это быстрее, чем мой текущий пользовательский опциональный CPU. – Thijs

Смежные вопросы