Ответ 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)
Я хотел бы напомнить вам следующее:
var.assign(data)
где "data" - это пустой массив, а "var" - это переменная TensorFlow, которая должна выполняться в том же сеансе, где вы хотите продолжить выполнение вашей сети, как логического вывода, так и обучения.- 'Var' должен быть создан по умолчанию в той же форме, что и 'data'. Поэтому, если вы можете получить "данные" до создания "var", я предлагаю вам создать "var" методом
var=tf.Variable(shape=data.shape)
. В противном случае вам нужно создать 'var' методомvar=tf.Variable(validate_shape=False)
, что означает, что переменная форма возможна. Подробные объяснения можно найти в документе Tensorflow API.
Я расширяю тот же поток репозитория caffe-тензор для поддержки theano в caffe, чтобы я мог загрузить преобразованную модель из caffe в Theano. Поэтому я разумный эксперт с этим кодом репо. Пожалуйста, не стесняйтесь связаться со мной, так как у вас есть дополнительные вопросы.