在Python中存储TensorFlow网络权重

我对TensorFlow和Python完全不熟悉,所以请原谅我发布这样一个基本问题,但是我有点不知所措,一次学习两件事。 编辑:我自己找到了一个解决方案,并在下面发布,但是,更有效的解决方案是很好的

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

我想要执行的任务是创建一个带有预先训练的权重和偏差的神经网络(不是从Tensor获得,而是从完全不同的来源获得),使用Tensor精炼训练,然后将精确权重返回到程序。

我已经研究过如何在Tensor Flow中创建NN,以及如何通过基于一些Tensor教程和来自StackOverflow的一些无关问题,使用以前在Python中创建的列表来初始化网络的权重。

所以,我的问题是,如果在TensorFlow中有一个训练有素的网络,我如何以最快的方式提取变量的每个重量和偏差(我的网络有大约280万个重量和偏差) (请记住,这个操作将会一遍又一遍地重复)

为了澄清这个问题,下面是一些代码:

首先,整个网络创建和培训过程(除了网络布局)基于这个职位:Autoencoder Example。

这个例子的代码的相关部分如下(我剪切了输出部分,因为没有必要解释我创建网络的方式):

num_hidden_1 = 256 # 1st layer num features
num_hidden_2 = 128 # 2nd layer num features (the latent dim)
num_input = 784 # MNIST data input (img shape: 28*28)
X = tf.placeholder("float", [None, num_input])

weights = {
    'encoder_h1': tf.Variable(tf.random_normal([num_input, num_hidden_1])),
    'encoder_h2': tf.Variable(tf.random_normal([num_hidden_1, num_hidden_2])),
}
biases = {
    'encoder_b1': tf.Variable(tf.random_normal([num_hidden_1])),
    'encoder_b2': tf.Variable(tf.random_normal([num_hidden_2])),
}

# Building the encoder
def encoder(x):
    # Encoder Hidden layer with sigmoid activation #1
    layer_1 = tf.nn.sigmoid(tf.add(tf.matmul(x, weights['encoder_h1']),
                                   biases['encoder_b1']))
    # Encoder Hidden layer with sigmoid activation #2
    layer_2 = tf.nn.sigmoid(tf.add(tf.matmul(layer_1, weights['encoder_h2']),
                                   biases['encoder_b2']))
return layer_2

我为创建我的神经网络而创建的代码如下:

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是一个包含网络所有层的数组。 “funcciones []”,它是ATM一个测试全局变量来调整神​​经网络的激活函数,它应该是“布局”的一部分,但我现在只是测试。 布局是包含网络中每个图层大小的数组。 布局[0]包含输入图层上的神经元数量,第一个隐藏图层上的布局1等等。

比索和偏差格式:第一级具有与网络层1一样多的元素(输入不需要权重或偏差)。 在第二层次上,它具有与上一层中的神经元一样多的元素,并且第三层次具有与该列表上的神经元一样多的元素。 第二级和第三级的形状与tf.random_normal([num_input, num_hidden_1])生成的形状相同

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

侧面的问题:有没有比上面提到的更有效的方法来构建/执行NN? 这篇文章的好参考也被接受为答案。


如何使用tf.trainable_variables()

这将返回所有可训练参数的列表,并且由于它是一个张量流模型,所以我会将其优化。

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

variable = [weight for weights in tf.trainable_variables() if weight.name == name_my_var]


我找到了解决方案并构建了一个工作功能。 命名约定与我自己的问题相同。 我不得不手动命名这些图层,否则它会在前一图层上加上重量和偏见(我检查了图表,并且最后连接正确,但脚本无法正确提取它们)

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

请记住变量必须被初始化。 如果你在训练完网络后解压缩,那么应该没有任何问题。

链接地址: http://www.djcxy.com/p/32093.html

上一篇: Storing TensorFlow network weights in Python multi

下一篇: Tensorflow Python Type error let me understand whats wrong