在Python多维列表中存储TensorFlow网络权重

在Python多维列表中存储TensorFlow网络权重,python,tensorflow,machine-learning,neural-network,Python,Tensorflow,Machine Learning,Neural Network,我对TensorFlow和Python完全陌生,所以请原谅我提出了这样一个基本的问题,但我对同时学习这两个东西感到有点不知所措编辑:我自己找到了一个解决方案,并将其发布在下面,然而,更有效的解决方案是wellcome 问题的简短版本:如何使用TensorFlow从神经网络中提取任意点的每个权重和偏差,并将其存储到具有形状[层][神经元前一层][神经元当前层]的Python数组中。目标不是存储在硬盘上,而是存储在与上一个代码snipet下面解释的形状和类型相同的变量中。我还想知道,哪种方法最有效。

我对TensorFlow和Python完全陌生,所以请原谅我提出了这样一个基本的问题,但我对同时学习这两个东西感到有点不知所措编辑:我自己找到了一个解决方案,并将其发布在下面,然而,更有效的解决方案是wellcome

问题的简短版本:如何使用TensorFlow从神经网络中提取任意点的每个权重和偏差,并将其存储到具有形状[层][神经元前一层][神经元当前层]的Python数组中。目标不是存储在硬盘上,而是存储在与上一个代码snipet下面解释的形状和类型相同的变量中。我还想知道,哪种方法最有效。

我想执行的任务是创建一个具有预训练权重和偏差(不是从张量获得,而是从完全不同的来源获得)的神经网络,使用张量优化训练,然后将优化后的权重返回到程序

我研究了如何在Tensor Flow中创建NN,并根据一些Tensor教程和StackOverflow中一些不相关的问题,使用之前在Python中创建的列表初始化网络的权重

因此,我的问题是,给定一个TensorFlow中经过训练的网络,我如何才能以最快的方式提取变量的每个权重和偏差(我的网络大约有280万个权重和偏差)(请记住,此操作将反复进行)

为了澄清这个问题,这里有一些代码:

首先,整个网络创建和培训过程(网络布局除外)基于此帖子:

本例代码的相关部分如下所示(我删去了输出部分,因为没有必要解释我创建网络的方式):

我创建的用于生成神经网络的代码如下:

def create_network(layout, funciones, pesos, biases):
    capas = [tf.placeholder("float", [None, layout[0]])]
    for i in range(0, len(pesos)):
        #There's an element already, so capas[i] is the previous layer
        capas.append(tf.layers.dense(capas[i], layout[i+1], activation=funciones[i],
                                            kernel_initializer=tf.constant_initializer(pesos[i], dtype=tf.float32),
                                            bias_initializer=tf.constant_initializer(biases[i], dtype=tf.float32)))

    return capas
代码说明: 比索和偏差三维列表,包含TensorFlow可以接受的格式的权重(“比索”)和偏差。Capas是一个包含网络所有层的数组。“funciones[]”,它是一个测试全局变量,用于调整NN的激活函数,它应该是“布局”的一部分,但我现在正在测试。布局是一个数组,包含网络中每一层的大小。Layout[0]包含输入层上的神经元数量、第一个隐藏层上的布局等

比索和偏差格式:第一级的元素与网络层-1一样多(输入不需要权重或偏差)。在第二个层次上,它的元素数量与前一层中的神经元数量相同,而第三个层次上的元素数量与此列表中的神经元数量相同。第二级和第三级的形状与示例中由
tf.random\u normal([num\u input,num\u hidden\u 1])生成的形状相同。

我的问题是: 假设我使用与上面URL中提供的示例中使用的结构相同的结构来执行NN,那么如何将经过训练的权重和偏差存储回具有与代码中提供的结构相同的精确结构的两个三维列表中,这是最快的方法


附带问题:有没有比上面提到的更有效的方法来构建/执行我的NN?对于这一点,好的参考也可以作为答案。

使用
tf.trainable_variables()
如何

这将返回所有可训练参数的列表,因为它是一个tensorflow模型,所以我认为它是优化的

您可以通过tensorname访问此列表中的特定权重:


variable=[tf.trainable\u variables中权重的权重()如果weight.name==name\u my\u var]
使用
tf.trainable\u variables()怎么样

这将返回所有可训练参数的列表,因为它是一个tensorflow模型,所以我认为它是优化的

您可以通过tensorname访问此列表中的特定权重:


variable=[tf.trainable\u variables中权重的权重()如果weight.name==name\u my\u var]

我找到了一个解决方案并构建了一个工作函数。命名约定与我自己的问题相同。我必须手动命名层,否则它会在前一层上放置权重和偏差(我检查了图表,最后连接正确,但脚本无法正确提取它们)


请记住,这些变量必须初始化。如果您在训练网络后提取它们,应该不会有任何问题。

我找到了一个解决方案并构建了一个工作函数。命名约定与我自己的问题相同。我必须手动命名层,否则它会在前一层上放置权重和偏差(我检查了图表,最后连接正确,但脚本无法正确提取它们)


请记住,这些变量必须初始化。如果您在训练网络后提取它们,应该不会有任何问题。

您好,谢谢您的回答,但是我以前见过类似的情况,但我不需要保存模型以供以后使用(最后一个除外),我需要将其保存在原始变量中(或者更准确地说,具有相同形状和类型的变量:python浮点列表).使用您的解决方案,我需要将整个模型写入磁盘,读取文件并解析它以找到权重。请记住,这必须执行数千次,如果不是数百万次的话。我使用了更直接的方法,因为我使用TF input variable shape,我建议TF中应该有一个函数以某种方式提取它。无论如何,如果您知道代码的话对于我可以用来从这样一个文件中获取权重的解析器,它对我的小项目的其他阶段仍然非常有用。@DGoiko查看更新,可能更适合您的目的。建议在声明变量时使用
名称
def create_network(layout, funciones, pesos, biases):
    capas = [tf.placeholder("float", [None, layout[0]])]
    for i in range(0, len(pesos)):
        #There's an element already, so capas[i] is the previous layer
        capas.append(tf.layers.dense(capas[i], layout[i+1], activation=funciones[i],
                                            kernel_initializer=tf.constant_initializer(pesos[i], dtype=tf.float32),
                                            bias_initializer=tf.constant_initializer(biases[i], dtype=tf.float32)))

    return capas
def extraer_pesos(red, session):
    pesos = []
    biases = []
    for i in range(1, len(red)):
        pesos.append(session.run(tf.get_default_graph().get_tensor_by_name(
            os.path.split(red[i].name)[0] + '/kernel:0')).tolist())
        biases.append(session.run(tf.get_default_graph().get_tensor_by_name(
            os.path.split(red[i].name)[0] + '/bias:0')).tolist())
    return pesos, biases


def create_network(layout, funciones, pesos,biases):
    capas = [(tf.placeholder("float", [None, layout[0]])]
    for i in range(0, len(pesos)):
        #There's an element already, so capas[i] is the previous layer
        capas.append(tf.layers.dense(capas[i], layout[i+1], activation=funciones[i],
                                            kernel_initializer=tf.constant_initializer(pesos[i], dtype=tf.float32),
                                            bias_initializer=tf.constant_initializer(biases[i], dtype=tf.float32),
                                             name="layer"+str(i)))

    return capas