VALID padding: это с нулевым заполнением. Надеюсь, нет путаницы.
x = tf.constant([[1., 2., 3.], [4., 5., 6.],[ 7., 8., 9.], [ 7., 8., 9.]])
x = tf.reshape(x, [1, 4, 3, 1])
valid_pad = tf.nn.max_pool(x, [1, 2, 2, 1], [1, 2, 2, 1], padding='VALID')
print (valid_pad.get_shape()) # output-->(1, 2, 1, 1)
SAME padding: Это очень сложно понять в первую очередь, потому что мы должны рассмотреть два условия отдельно, как указано в официальных документах .
Возьмем ввод как [/g1], выведите его как [/g2], добавьте в качестве [/g3], шаг как [/g4] и ядро размер как [/g5]. (сингл dimentina считается)
Случай 01: [/g6]: [/g7]
Дело 02: [/g8]: [/g9]
[/g10] рассчитано su, что минимальное значение, которое можно принять для заполнения. Поскольку значение [/g11] известно, значение [/g12] можно найти, используя этот формуляр [/g13].
Давайте рассмотрим этот пример:
x = tf.constant([[1., 2., 3.], [4., 5., 6.],[ 7., 8., 9.], [ 7., 8., 9.]])
x = tf.reshape(x, [1, 4, 3, 1])
same_pad = tf.nn.max_pool(x, [1, 2, 2, 1], [1, 2, 2, 1], padding='SAME')
print (same_pad.get_shape()) # --> output (1, 2, 2, 1)
Здесь размерность x равна (3,4). Затем, если выполнено горизонтальное направление (3):
[/g14]
Если выполняется вертикальное направление (4):
[/g15]
Надеюсь, это поможет понять, как на самом деле SAME работает в TF.
OpenGL был бы моим выбором, привязка.NET существует от многих оберток с открытым исходным кодом с OpenGL, Вы установлены для кросс-платформенного.
Существует более современная оболочка OpenGL для .NET / Mono под названием OpenTK.