numpy - Tensorflow: ¿Cómo puedo asignar pesas numeradas preentrenadas a las subsecciones del gráfico?
(2)
Le sugiero que tenga una vista detallada de network.py desde https://github.com/ethereon/caffe-tensorflow , especialmente la función load (). Te ayudaría a entender lo que sucedió cuando llamaste a net.load (weight_path, session).
Para su información, las variables en Tensorflow se pueden asignar a la matriz numpy usando var.assign (np_array) que se ejecuta en la sesión. Aquí está la solución a su pregunta:
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)
Probablemente tenga la amabilidad de recordarle los siguientes puntos:
- var.assign (data) donde ''data'' es una matriz numpy y ''var'' es una variable de tensorflow que debe ejecutarse en la misma sesión en la que desea continuar ejecutando su inferencia o entrenamiento.
- La ''var'' debe crearse con la misma forma que los ''datos'' por defecto. Por lo tanto, si puede obtener los "datos" antes de crear la "var", le sugiero que cree la "var" mediante el método
var=tf.Variable(shape=data.shape)
. De lo contrario, debe crear la ''var'' mediante el métodovar=tf.Variable(validate_shape=False)
, lo que significa que la forma de la variable es factible. Las explicaciones detalladas se pueden encontrar en el documento API de Tensorflow.
Extiendo el mismo repo caffe-tensorflow para apoyar theano en el kaffe que puedo cargar el modelo transformado de caffe en el Theano. Por lo tanto, soy un experto razonable para el código de este repositorio. Por favor, no dude en ponerse en contacto conmigo ya que tiene alguna otra pregunta.
Esto es algo simple que simplemente no pude descifrar cómo hacerlo.
Convertí un modelo de caffe VGG preentrenado para tensorflow usando el código github de https://github.com/ethereon/caffe-tensorflow y lo guardé en vgg16.npy ...
Luego cargo la red en mi sesión predeterminada de sess como "net" usando:
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)
Después de net.load, obtengo un gráfico con una lista de tensores. Puedo acceder a tensores individuales por capa usando net.layers [''conv1_1''] ... para obtener pesos y sesgos para la primera capa convolucional de VGG, etc.
Ahora supongamos que hago otro gráfico que tiene como primera capa "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)
Mi pregunta es: ¿cómo puedes asignar los pesos pre-entrenados de net.layers [''conv1_1''] a h_conv1_b ?? (ambos son ahora tensores)