2016-09-07 16 views
5

ja wypróbowania ostatnie prace arXiv nazwie „Factorized CNNtf.nn.depthwise_conv2d jest zbyt wolny. Jest to normalne?

które głównie dowodzi, że przestrzennie oddzielone splotowi (głębokość mądry splot) razem z liniowym występem kanału zegara (1x1conv), można przyspieszyć operacji splotu .

this is the figure for their conv layer architecture

I okazało się, że mogę wdrożyć tę architekturę z tf.nn.depthwise_conv2d i splot 1x1, lub z tf.nn.separable_conv2d.

poniżej jest moje wykonanie:

#conv filter for depthwise convolution 
 
depthwise_filter = tf.get_variable("depth_conv_w", [3,3,64,1], initializer=tf.random_normal_initializer(stddev=np.sqrt(2.0/9/32))) 
 
#conv filter for linear channel projection 
 
pointwise_filter = tf.get_variable("point_conv_w", [1,1,64,64], initializer=tf.random_normal_initializer(stddev=np.sqrt(2.0/1/64))) 
 
conv_b = tf.get_variable("conv_b", [64], initializer=tf.constant_initializer(0)) 
 
#depthwise convolution, with multiplier 1 
 
conv_tensor = tf.nn.relu(tf.nn.depthwise_conv2d(tensor, depthwise_filter, [1,1,1,1], padding='SAME')) 
 
#linear channel projection with 1x1 convolution 
 
conv_tensor = tf.nn.bias_add(tf.nn.conv2d(conv_tensor, pointwise_filter, [1,1,1,1], padding='VALID'), conv_b) 
 
#residual 
 
tensor = tf.add(tensor, conv_tensor)

ta powinna wynosić około 9 razy szybciej niż oryginalny 3x3x64 -> 64 kanałów splotu.

Nie mogę jednak doświadczyć poprawy wydajności.

Muszę założyć, że robię to źle, lub coś jest nie tak z implementacją tensorflow.

Ponieważ istnieje kilka przykładów użycia depthwise_conv2d, pozostawiam to pytanie tutaj.

Czy ta wolna prędkość jest normalna? czy jest jakiś błąd?

Odpowiedz

0

obecna implementacja odnoszącym się do głębokości conv2d nie jest w pełni wykorzystuje moc równoległego z GPU, trzeba poczekać do szybszego wdrożenia w przyszłości, na przykład, w caffe, istnieje szybsze Impl innych firm tego jądra https://github.com/yonghenglh6/DepthwiseConvolution