Какова стратегия заполнения тензорного потока conv2d? - PullRequest
0 голосов
/ 26 мая 2018

Я следую за вопросом и ответом от stackoverflow

, однако я все еще не понимаю, что такое начальный индекс и стратегия заполнения из tf.nn.conv2d после того, как у меня пройдут следующие тесты, надеюсь, кто-нибудь подскажет мне, особенно на нечетных и четных шагах

высота массива (h), размер ядра (f), номер шага (ов)

h,f,s = 4,3,2 

номер заполнения в левом столбце (pl), заполнение в правом столбце (pr) изmatrix x

pl = int((f-1)/2)                           
pr = int(np.ceil((f-1)/2))                  

tf.reset_default_graph()
x = np.arange(1*h*h*1).reshape(1,h,h,1)
w = np.ones((f,f,1,1))
xc = tf.constant(x,np.float32)
wc = tf.constant(w,np.float32)
xp = np.pad(x,((0,0),(pl,pr),(pl,pr),(0,0)),'constant',constant_values = 0)
xcp = tf.constant(xp,np.float32)
zs = tf.nn.conv2d(xc,wc,strides=[1,s,s,1],padding='SAME')
zv = tf.nn.conv2d(xc,wc,strides=[1,s,s,1],padding='VALID')
zp = tf.nn.conv2d(xcp,wc,strides=[1,s,s,1],padding='VALID')

with tf.Session() as sess:
    os = sess.run(zs)
    ov = sess.run(zv)
    op = sess.run(zp)

print('x shape: ', x.shape,' kernel: ',f,' stride: ',s,'\n',x[0,:,:,0])
print(' 'SAME' os shape: ', os.shape,'\n',os[0,:,:,0])
print(' 'VALID' ov shape: ', ov.shape,'\n',ov[0,:,:,0])
print(' 'VALID' op shape: ', op.shape,' pl: ',pl,' pr: ', pr,'\n',op[0,:,:,0])

в случае объединения в свертку, заполнение нулями должно заполнять массив x так, как я определяю xp , однакоя не могу понять, как убедить его начальный индекс

исходная матрица x

x shape:  (1, 4, 4, 1)  kernel:  3  stride:  2 
[[ 0  1  2  3]
[ 4  5  6  7]
[ 8  9 10 11]
[12 13 14 15]]

В свертке «того же» типа, почему tf.nn.conv2d не дополняет нольслева в этом случае?

'SAME' os shape:  (1, 2, 2, 1) 
[[45. 39.]
[66. 50.]]

действительная свертка на матрице x

'VALID' ov shape:  (1, 1, 1, 1) 
[[45.]]

действительная свертка типа после нуля в годdding from xp (как мой ожидаемый результат)

'VALID' op shape:  (1, 2, 2, 1)  pl:  1  pr:  1 
[[10. 24.]
[51. 90.]]

1 Ответ

0 голосов
/ 26 мая 2018

Формула для (общего) заполнения объясняется здесь :

enter image description here

В вашем случае n mod s = 4 mod 2 = 0 так

p = max(3 - 2, 0) = 1

, поэтому

p_left = p // 2 = 0
p_right = 1 - p_left = 1

Это объясняет, почему вы не видите никаких отступов слева.

...