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中减少训练模型中的内核/过滤器数量?_Tensorflow_Machine Learning_Image Processing_Computer Vision - Fatal编程技术网

如何在Tensorflow中减少训练模型中的内核/过滤器数量?

如何在Tensorflow中减少训练模型中的内核/过滤器数量?,tensorflow,machine-learning,image-processing,computer-vision,Tensorflow,Machine Learning,Image Processing,Computer Vision,如果我有一个经过训练的模型,我想重新训练同一个模型,从现有模型中移除几个过滤器/内核。e、 g conv1 = tf.get_variable('conv1_1', shape=(11, 11, 3, 64), initializer=tf.contrib.layers.xavier_initializer()), 我想调整这个张量的大小,使它的形状为(11,11,3,20),但名称和位置相同,表示完全相同的变量。谢谢你的帮助 我已经尝试了tf.reformate,但它给了我一个错误,即a和b

如果我有一个经过训练的模型,我想重新训练同一个模型,从现有模型中移除几个过滤器/内核。e、 g

conv1 = tf.get_variable('conv1_1', shape=(11, 11, 3, 64), initializer=tf.contrib.layers.xavier_initializer()),
我想调整这个张量的大小,使它的形状为(11,11,3,20),但名称和位置相同,表示完全相同的变量。谢谢你的帮助

我已经尝试了
tf.reformate
,但它给了我一个错误,即a和b中的元素数量不匹配 我还尝试了
tf.assign(a,b,validate\u shape=false)


你想做的部分是可以实现的

使用与已定义的变量名称完全相同的变量可能是不可能的。因为TensorFlow创建了一个数据流图,每个节点都需要唯一可识别(以避免歧义)。如果想要相同的名称,可以使用不同的作用域

但要将变量的一部分分配给另一部分,可以使用以下代码

import tensorflow as tf
import numpy as np

tf.reset_default_graph()

with tf.variable_scope('old'):
  conv1 = tf.get_variable('conv1_1', shape=(11, 11, 3, 64), initializer=tf.contrib.layers.xavier_initializer())
with tf.variable_scope('new'):
  conv_res_1 = tf.get_variable('conv1_1', shape=(11, 11, 3, 20), initializer=tf.contrib.layers.xavier_initializer())

assign_op = tf.assign(conv_res_1,conv1[:,:,:,:20])

with tf.Session() as sess:
  tf.global_variables_initializer().run()
  w_1, w_res_1 = sess.run([conv1, assign_op])
  assert np.all(w_1[:,:,:,:20] == w_res_1)
  print(w_1[0,0,0,0], w_res_1[0,0,0,0])  
更新:如果您不介意丢失较大的变量,可以执行以下操作。这将采用conv_1并用较小的变量替换该变量

import tensorflow as tf

tf.reset_default_graph()
conv1 = tf.get_variable('conv1_1', shape=(11, 11, 3, 64), initializer=tf.contrib.layers.xavier_initializer())

assign_op = tf.assign(conv1, conv1[:,:,:,:20], validate_shape=False)

with tf.Session() as sess:
  tf.global_variables_initializer().run()
  sess.run(assign_op)

从根本上说,您正在更改模型的参数数量。当你从

conv1 = tf.get_variable('conv1_1', shape=(11, 11, 3, 64), initializer=tf.contrib.layers.xavier_initializer())

可学习的参数从{Kernel x64}到{Kernel x20} 这将需要您重新训练网络并了解其新权重

然而,这是一个已经发展成为研究领域的常见问题。为此提出了许多方法,如权重的低阶近似(Denton等人,2014;Lebedev等人,2014)、权重量化(Courbariaux等人,2016;Rastegari等人,2016)、知识提取(Hinton等人,2014;Romeroet等人,2015)和网络修剪(Han等人,2015;Li等人,2017),其中,网络剪枝技术以其具有竞争力的性能和兼容性而备受关注

参考资料:

  • Emily L Denton、Wojciech Zaremba、Joan Bruna、Yann LeCun和Rob Fergus。利用卷积网络中的线性结构进行有效评估。InNIPS,2014年
  • Vadim Lebedev、Yaroslav Ganin、Maksim Rakhuba、Ivan Oseledets和Victor Lempitsky.使用微调cp分解加速卷积神经网络。ICLR,2014
  • 马蒂厄·库尔巴约、伊泰·胡巴拉、丹尼尔·苏德里、兰·亚尼夫和约书亚·本吉奥。二值化神经网络:训练深度神经网络,权重和激活限制为+1or-1。arXiv预印本arXiv:1602.02830,2016
  • 杰弗里·辛顿、奥利奥·维亚尔斯和杰夫·迪恩。在神经网络中提取知识。NIPSWorkshop,2014

  • 您是否正在尝试将预训练模型的权重传递到新模型。警告说,新型号的过滤器数量较少,而不是新型号。我想继续用新的内核/过滤器集训练同一个模型一旦你改变过滤器的数量,它就不再是同一个模型了。架构已经改变。你同意吗?我认为架构是通过变量的数量及其相互联系来定义的。变量的数量及其相互联系保持不变,这里的情况是重塑变量。i、 e.“conv1”:tf.get_变量('conv1_l1',shape=(11,11,3,64),initializer=tf.contrib.layers.xavier_initializer())是具有给定大小的单个变量,因此在保持此变量不变的同时,可以调整其形状。可能是我的观念不正确。对不起。变量的数量不同,因为过滤器从维度:(11,11,3,64)->(11,11,3,20)开始。假设前两个维度是您的图像大小。这意味着您的过滤器组从64个过滤器减少到20个过滤器。因此,网络的设计发生了变化。我会告诉你架构(连接)保持不变。谢谢@thushv89。实际上,我不想定义另一个变量,但想减小现有变量的大小。此外,我需要在会话中执行此操作,我在tf.reset_default_graph()文档中看到,它在会话中不起作用。唯一的选择是将权重部分复制到另一个变量。在TensorFlow中,一旦定义了变量,就不能修改形状。我不确定你所说的重置图在会话中不起作用。关于会话和图,当您定义变量时,除非指定了不同的图,否则它们将转到默认图(您可以尝试多个图,但这会使问题复杂化)。然后session会根据您在
    session中所需的内容执行该图的部分内容。运行
    。我想知道,他们是如何决定的:)因为同时tf.reformate工作正常。谢谢@Nav。我还致力于网络修剪。理论上的解决方案,我已经建立了,但现在面临着tensorflow的具体问题。这将需要你重新训练网络并学习它的新权重当然我必须训练,但我需要用相同的图形训练完全相同的模型,但要调整变量的大小。从技术上讲,它成为一种新的体系结构,但从逻辑上讲,它保持不变。因为所有变量和图形都已就位,所以没有任何更改。我明白了,可变的内部结构刚刚发生了变化。如果清楚的话,你应该关闭Q。所以礼仪。不,不,我不是那个意思。兄弟,我有一个技术问题,如何在tensorflow中调整经过训练的CNN模型的变量?如果我错误地制造了任何混乱,我很抱歉。
    
    conv1 = tf.get_variable('conv1_1', shape=(11, 11, 3, 64), initializer=tf.contrib.layers.xavier_initializer())
    
    conv2 = tf.get_variable('conv2_l1', shape=(11, 11, 3, 20), initializer=tf.contrib.layers.xavier_initializer())