Añadir capas bajas en un modelo Tensorflow

Tratando de desarrollar algún algoritmo de aprendizaje transferido, uso algunas redes neuronales entrenadas y añado capas. Estoy usando Tensorflow y python.

Parece bastante común usar los gráficos existentes en Tensorflow: importa el gráfico, por ejemplo, usando los gráficos de meta, luego establece nuevas capas altas agregando nodos. Por ejemplo, encontré este código aquí :

vgg_saver = tf.train.import_meta_graph(dir + '/vgg/results/vgg-16.meta') # Access the graph vgg_graph = tf.get_default_graph() # Retrieve VGG inputs self.x_plh = vgg_graph.get_tensor_by_name('input:0') # Choose some node output_conv =vgg_graph.get_tensor_by_name('conv1_2:0') # Build further operations output_conv_shape = output_conv.get_shape().as_list() W1 = tf.get_variable('W1', shape=[1, 1, output_conv_shape[3], 32],initializer=tf.random_normal_initializer(stddev=1e-1)) b1 = tf.get_variable('b1', shape=[32], initializer=tf.constant_initializer(0.1)) z1 = tf.nn.conv2d(output_conv, W1, strides=[1, 1, 1, 1], padding='SAME') + b1 a = tf.nn.relu(z1) 

Luego, en el entrenamiento, usarías tus capas más todas las siguientes. También puede congelar algunas capas, importar variables entrenadas durante la sesión, etc.

Sin embargo, en mi enfoque necesito agregar nuevas capas bajas entre la entrada y la primera capa, y usar mis capas más las anteriores. Por lo tanto, no puedo agregar nodos en la parte inferior del gráfico: necesito insertar nodos justo después de la entrada.

Hasta ahora no he encontrado una forma conveniente de hacerlo con tensorflow. Tienes alguna idea ? ¿O es simplemente imposible?

Gracias por adelantado.

No puede insertar capas entre las capas existentes de un gráfico, pero puede importar un gráfico con algunas modificaciones en el camino. Como señaló Pietro Tortella, el enfoque en Tensorflow: ¿Cómo reemplazar un nodo en un gráfico de cálculo? Deberia trabajar. Aquí hay un ejemplo:

 import tensorflow as tf with tf.Graph().as_default() as g1: input1 = tf.placeholder(dtype=tf.float32, name="input_1") l1 = tf.multiply(input1, tf.constant(2.0), name="mult_1") l2 = tf.multiply(l1, tf.constant(3.0), name="mult_2") g1_def = g1.as_graph_def() with tf.Graph().as_default() as new_g: new_input = tf.placeholder(dtype=tf.float32, name="new_input") op_to_insert = tf.add(new_input, tf.constant(4.0), name="inserted_op") mult_2, = tf.import_graph_def(g1_def, input_map={"input_1": op_to_insert}, return_elements=["mult_2"]) 

El gráfico original tiene este aspecto y el gráfico importado tiene este aspecto.

Si desea utilizar tf.train.import_meta_graph , todavía puede pasar el

 input_map={"input_1": op_to_insert} 

kwarg Se pasará a import_graph_def.