Чтобы сгенерировать тесты для операций другой системы, которую я создаю, я пытаюсь создать 1-слойную ConvNet в Tensorflow, а затем извлечь весовые коэффициенты, смещения и выходные данные.
Моя система работает в первом канале, поэтому я хочу, чтобы мой график Tensorflow работал таким же образом. Однако мой график не работает должным образом, поскольку по умолчанию Tensorflow имеет значение channel-last.
У меня есть некоторые случайные входные данные, которые я генерирую, используя numpy.
import numpy as np
batch_size = 1
image_size = 5
image_channel = 3
shape = (batch_size, image_channel, image_size, image_size)
inputs = np.float32(np.random.random_sample(shape))
np.set_printoptions(formatter={'float,': '{: 0.b3f}'.format})
print(np.array2string(inputs, separator=', '))
Я определяю свою структуру сети следующим образом:
def network(x, mode_name):
num_filters = 4
filter_size = 2
input_channels = 3
stride = 1
conv1 = conv_layer(x, conv_size=[filter_size, filter_size, input_channels, num_filters],
stride_size=[1, 1, stride, stride], name=mode_name + "_conv1")
return conv1
def conv_layer(prev_layer, conv_size, stride_size, name):
W_initer = tf.random_uniform_initializer(dtype=tf.float32)
W = tf.get_variable(name + '_W', dtype=tf.float32, shape=conv_size,
initializer=W_initer)
bias_init = tf.constant(np.float32(np.random.random_sample(conv_size[3])))
b = tf.get_variable(name + '_b', dtype=tf.float32, initializer=bias_init)
return tf.nn.conv2d(prev_layer, W, stride_size, data_format='NCHW', padding='VALID') + b
И мой график Tensorflow:
graph = tf.Graph()
with graph.as_default():
tf.set_random_seed(1)
with tf.variable_scope("simple_cnn") as scope:
outputs = network(inputs, "simple_cnn")
with tf.name_scope('init'):
init_op = tf.global_variables_initializer()
Тогда я думаю, что извлеку свои тензоры так:
with tf.Session(graph=graph) as sess:
sess.run(init_op)
kernels = tf.trainable_variables()[0]
biases = tf.trainable_variables()[1]
print("kernels:")
print(sess.run(kernels))
print("\nbiases:")
print(sess.run(biases))
print("\noutputs")
sess.run(outputs)
К сожалению, эта последняя операция завершается неудачно с ошибкой Generic conv implementation only supports NHWC tensor format for now.
Кажется, что раньше это была проблема с Tensorflow , но я не уверен, что она все еще применяется. Кто-нибудь знает способ заставить это работать на CPU?
В качестве альтернативы, если бы сеть работала в режиме последнего канала с входными данными, имеющими форму [batch_size, image_size, image_size, image_channel]
, все равно были бы правильные тесты, предполагая, что я изменил свои тензоры следующим образом:
print("inputs")
inputs_chan_first = np.rollaxis(inputs, 1, 3)
print(inputs_chan_first)
print("\noutputs")
outputs_chan_first = np.rollaxis(outputs, 1, 3)
print(outputs_chan_first)
И не трогать ли тензоры ядра и ядра?