Канальный первый сверточный слой в Tensorflow - PullRequest
0 голосов
/ 25 августа 2018

Чтобы сгенерировать тесты для операций другой системы, которую я создаю, я пытаюсь создать 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)

И не трогать ли тензоры ядра и ядра?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...