尝试开发一些transfert学习算法,我使用一些训练有素的神经网络并添加图层。我正在使用Tensorflow和python。
在Tensorflow中使用现有图表似乎很常见:您导入图形,例如使用metaGraphs,然后通过添加节点设置新的高图层。例如,我找到了此代码here:
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)
然后在训练中,您将使用您的图层以及下面的所有图层。您还可以冻结某些图层,在会话期间导入训练过的变量等。
但是,在我的方法中,我需要在输入和第一层之间添加新的低层,并使用我的图层加上上面的图层。因此,我无法在图表的底部添加节点:我需要在输入后立即插入节点。
到目前为止,我发现使用张量流没有方便的方法。你知道吗?或者这是不可能的?
提前致谢。
答案 0 :(得分:3)
您无法在图表的现有图层之间插入图层,但您可以在此过程中导入带有重新布线的图表。正如Pietro Tortella指出的那样,Tensorflow: How to replace a node in a calculation graph?中的方法应该有效。这是一个例子:
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"])
如果您想使用tf.train.import_meta_graph
,您仍然可以传入
input_map={"input_1": op_to_insert}
kwarg。它将传递给import_graph_def。