Tensorflow: Как я могу назначить numpy предварительно подготовленные веса для подразделов графика?

Это простая вещь, которую я просто не мог понять, как это сделать.

Я преобразовал предварительно обученную модель VGG caffe в tensorflow, используя код github из https://github.com/ethereon/caffe-tensorflow и сохранил его на vgg16.npy...

Затем я загружаю сеть в мой сеанс по умолчанию sess как "net", используя:

images = tf.placeholder(tf.float32, [1, 224, 224, 3])
net = VGGNet_xavier({'data': images, 'label' : 1}) 
with tf.Session() as sess:
  net.load("vgg16.npy", sess) 

После net.load, я получаю график со списком тензоров. Я могу получить доступ к отдельным тензорам на каждый слой, используя net.layers ['conv1_1']... для получения весов и смещений для первого сверточного слоя VGG и т.д.

Теперь предположим, что я делаю еще один граф, который имеет в качестве первого слоя "h_conv1_b":

  W_conv1_b = weight_variable([3,3,3,64])
  b_conv1_b = bias_variable([64])
  h_conv1_b = tf.nn.relu(conv2d(im_batch, W_conv1_b) + b_conv1_b)

Мой вопрос: как вы можете назначить предварительно обученные веса из net.layers ['conv1_1'] в h_conv1_b?? (оба являются тензорами)

Ответ 1

Я предлагаю вам подробно ознакомиться с network.py из https://github.com/ethereon/caffe-tensorflow, особенно с функцией load(). Это поможет вам понять, что произошло, когда вы позвонили net.load(weight_path, session).

К вашему сведению, переменные в Tensorflow могут быть назначены массиву с помощью var.assign(np_array), который выполняется в сеансе. Вот решение вашего вопроса:

with tf.Session() as sess:    
  W_conv1_b = weight_variable([3,3,3,64])
  sess.run(W_conv1_b.assign(net.layers['conv1_1'].weights))
  b_conv1_b = bias_variable([64])
  sess.run(b_conv1_b.assign(net.layers['conv1_1'].biases))
  h_conv1_b = tf.nn.relu(conv2d(im_batch, W_conv1_b) + b_conv1_b)

Я хотел бы напомнить вам следующее:

  1. var.assign(data) где "data" - это пустой массив, а "var" - это переменная TensorFlow, которая должна выполняться в том же сеансе, где вы хотите продолжить выполнение вашей сети, как логического вывода, так и обучения.
  2. 'Var' должен быть создан по умолчанию в той же форме, что и 'data'. Поэтому, если вы можете получить "данные" до создания "var", я предлагаю вам создать "var" методом var=tf.Variable(shape=data.shape). В противном случае вам нужно создать 'var' методом var=tf.Variable(validate_shape=False), что означает, что переменная форма возможна. Подробные объяснения можно найти в документе Tensorflow API.

Я расширяю тот же поток репозитория caffe-тензор для поддержки theano в caffe, чтобы я мог загрузить преобразованную модель из caffe в Theano. Поэтому я разумный эксперт с этим кодом репо. Пожалуйста, не стесняйтесь связаться со мной, так как у вас есть дополнительные вопросы.

Ответ 2

Вы можете получить значения переменных, используя eval метод tf.Variable -s из первой сети и загрузить эти значения в переменные вторая сеть использует метод load (также метод tf.Variable).