Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在tensorflow中的卷积层上使用tf.train.Saver()_Tensorflow - Fatal编程技术网

在tensorflow中的卷积层上使用tf.train.Saver()

在tensorflow中的卷积层上使用tf.train.Saver(),tensorflow,Tensorflow,我试图使用tf.train.Saver()在tensorflow中的两个卷积神经网络图之间应用转移学习,我想验证我的方法是否如预期的那样工作。是否有办法检查tf.layers.conv2d()层中的可培训功能 我的方法 1.初始化层 2.{训练网络} 3.保存当前图形 tf.train.Saver().save(sess,“/my\u model\u final.ckpt”) 4.构建包含同一层的新图形,使用Saver()加载指定的权重 restore\u saver.restore(sess

我试图使用
tf.train.Saver()
在tensorflow中的两个卷积神经网络图之间应用转移学习,我想验证我的方法是否如预期的那样工作。是否有办法检查
tf.layers.conv2d()
层中的可培训功能

我的方法 1.初始化层 2.{训练网络} 3.保存当前图形
tf.train.Saver().save(sess,“/my\u model\u final.ckpt”)

4.构建包含同一层的新图形,使用
Saver()加载指定的权重

restore\u saver.restore(sess,“./my\u model\u final.ckpt”)

5.{训练并评估新图} 我的问题: 1) 我的代码“按预期”工作,没有错误,但我不能100%相信它能像我想的那样工作。是否有方法从图层打印可训练的特征,以确保正确加载和保存重量?使用
tf.layers
API保存/加载参数是否有“更好”的方法?我注意到GitHub上有一个与此相关的链接。理想情况下,我希望在初始化后的第一个图形a)上检查这些值,在训练后检查这些值,在加载权重后检查新图形I)在训练/评估后检查这些值。

  • 是否有方法从图层打印可训练的特征,以确保正确加载和保存重量
是的,首先需要获得层变量的句柄。有几种方法可以做到这一点,但可以说最简单的方法是使用
get\u collection()
函数:

conv1_vars = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES,
                               scope="conv1")
请注意,此处的作用域被视为正则表达式,因此,如果希望所有变量都来自作用域
conv1
conv2
conv3
,则可以编写类似于
conv[123]
的代码

如果您只需要可训练变量,可以将
全局变量
替换为
可训练变量

如果您只想检查单个变量,例如层的内核,那么可以使用
get\u tensor\u by\u name()
如下所示:

graph = tf.get_default_graph()
kernel_var = graph.get_tensor_by_name("conv1/kernel:0")
conv1_kernel_value = conv1.kernel.eval()
conv1 = tf.layers.conv2d(...)
new_kernel = tf.placeholder(...)
assign_kernel = conv1.kernel.assign(new_kernel)
init = tf.global_variables_initializer()

with tf.Session() as sess:
    init.run()
    loaded_kernel = my_function_to_load_kernel_value_from_disk(...)
    assign_kernel.run(feed_dict={new_kernel: loaded_kernel})
    ...
另一种选择是迭代所有变量并根据它们的名称进行过滤:

conv1_vars = [var for var in tf.global_variables()
              if var.op.name.startswith("conv1/")]  
一旦掌握了这些变量的句柄,就可以在不同的点对它们进行求值,例如初始化之后、恢复图形之后、训练之后等等,然后比较这些值。例如,这是初始化后获取值的方式:

with tf.Session() as sess:
    init.run()
    conv1_var_values_after_init = sess.run(conv1_vars)
然后,在您感兴趣的各个点捕获变量值后,您可以检查它们是否相等(或足够接近,考虑到微小的浮点不精确性),如下所示:

  • 使用tf.layers API保存/加载参数是否有“更好”的方法
我不知道。您所指的功能请求实际上不是关于将参数保存/加载到磁盘,而是为了能够轻松获得图层变量的句柄,并轻松创建分配节点以设置其值

例如,可以(在TF1.4中)在层的内核上获取句柄并非常简单地获取其值,如下所示:

graph = tf.get_default_graph()
kernel_var = graph.get_tensor_by_name("conv1/kernel:0")
conv1_kernel_value = conv1.kernel.eval()
conv1 = tf.layers.conv2d(...)
new_kernel = tf.placeholder(...)
assign_kernel = conv1.kernel.assign(new_kernel)
init = tf.global_variables_initializer()

with tf.Session() as sess:
    init.run()
    loaded_kernel = my_function_to_load_kernel_value_from_disk(...)
    assign_kernel.run(feed_dict={new_kernel: loaded_kernel})
    ...
当然,您可以使用它来获取/设置变量的值并将其加载/保存到磁盘,如下所示:

graph = tf.get_default_graph()
kernel_var = graph.get_tensor_by_name("conv1/kernel:0")
conv1_kernel_value = conv1.kernel.eval()
conv1 = tf.layers.conv2d(...)
new_kernel = tf.placeholder(...)
assign_kernel = conv1.kernel.assign(new_kernel)
init = tf.global_variables_initializer()

with tf.Session() as sess:
    init.run()
    loaded_kernel = my_function_to_load_kernel_value_from_disk(...)
    assign_kernel.run(feed_dict={new_kernel: loaded_kernel})
    ...
这不漂亮。如果要加载/保存到数据库(而不是平面文件),它可能会很有用,但一般来说,我建议使用
保存程序

我希望这有帮助