详解TensorFlow的 tf.global_variables_initializer 函数:初始化所有的全局变量

  • Post category:Python

tf.global_variables_initializer()函数是tensorflow中的一个全局变量初始化函数。这个函数的主要作用是对所有未被初始化的变量进行一次全局统一的初始化操作。一般在使用tensorflow时,需要先声明变量并且将变量加入元图中,然后在进行模型训练或者验证时,需要对模型中的变量进行初始化操作。这里就可以使用 tf.global_variables_initializer() 函数,方便快捷地进行变量初始化。

使用方法:

在使用 tf.global_variables_initializer() 函数时,一般需要先定义变量,再将变量加入元图。

import tensorflow as tf

# 定义变量并且将变量加入元图
w1 = tf.Variable(0.1, name="w1")
w2 = tf.Variable(0.2, name="w2")
w3 = tf.Variable(0.3, name="w3")
tf.add_to_collection('vars', w1)
tf.add_to_collection('vars', w2)
tf.add_to_collection('vars', w3)

#初始化所有变量
init = tf.global_variables_initializer()

#启动默认的tensorflow会话,并且运行初始化操作和其他需要训练操作
with tf.Session() as sess:
    sess.run(init)

在上述代码中,首先定义了三个变量 w1、w2、w3,并将这三个变量加入到了 vars 集合中,然后使用 tf.global_variables_initializer() 对这些变量进行全局初始化。在完成变量初始化后,可以进行需要训练的操作。

实例1:

下面是一个简单的tensorflow线性模型的示例,该模型使用 tf.global_variables_initializer() 函数对模型中的变量进行初始化,然后进行模型训练。

import tensorflow as tf
import numpy as np

#生成模拟数据
x_data = np.float32(np.random.rand(2, 100))
y_data = np.dot([0.100, 0.200], x_data) + 0.300

#创建tensorflow模型
b = tf.Variable(tf.zeros([1]))
w = tf.Variable(tf.random_uniform([1, 2], -1.0, 1.0))
y = tf.matmul(w, x_data) + b

#定义训练目标和优化器
loss = tf.reduce_mean(tf.square(y - y_data))
optimizer = tf.train.GradientDescentOptimizer(0.5)
train = optimizer.minimize(loss)

#初始化所有变量
init = tf.global_variables_initializer()

#进行模型训练
with tf.Session() as sess:
    sess.run(init)
    for step in range(0, 201):
        sess.run(train)
        if step % 20 == 0:
            print(step, sess.run(w), sess.run(b))

在上述代码中,变量 w 和 b 都被加入到了元图中,并且使用 tf.global_variables_initializer() 函数对这些变量进行了全局初始化。之后,进行模型训练操作。

实例2:

下面是一个 tensorflow 中的保存和载入模型的示例,其中 tf.global_variables_initializer() 函数被用于初始化变量。

import tensorflow as tf
import numpy as np

#模型定义
def build_model():
    x = tf.placeholder(tf.float32, shape=[None, 2], name="x")
    y = tf.placeholder(tf.float32, shape=[None, 1], name="y")
    w = tf.Variable(tf.zeros([2, 1]), dtype=tf.float32, name='w')
    b = tf.Variable(tf.constant(0.1, shape=[]), dtype=tf.float32, name='b')
    o = tf.add(tf.matmul(x, w), b, name='o')
    return x, y, w, b, o

#模型训练
def train_model(x_data, y_data):
    x, y, w, b, o = build_model()
    loss = tf.reduce_sum(tf.square(o - y))
    optimizer = tf.train.GradientDescentOptimizer(0.01)
    train_op = optimizer.minimize(loss)

    init_op = tf.global_variables_initializer()

    with tf.Session() as sess:
        sess.run(init_op)
        for i in range(1000):
            sess.run(train_op, feed_dict={x: x_data, y: y_data})
            if i % 100 == 0:
                print('loss:', sess.run(loss, feed_dict={x: x_data, y: y_data}))

        # 保存模型
        saver = tf.train.Saver()
        saver.save(sess, 'my_model')

    print('training finish.')

#模型使用
def use_model(x_data):
    x, y, w, b, o = build_model()

    # 载入模型
    saver = tf.train.Saver()
    with tf.Session() as sess:
        saver.restore(sess, 'my_model')

        print('regression result:', sess.run(o, feed_dict={x: x_data}))

#训练数据
x_data = np.random.randn(1000, 2)
w_target = np.array([[1], [2]])
b_target = np.array([0.5])
y_data = np.dot(x_data, w_target) + b_target

#训练模型
train_model(x_data, y_data)

#使用模型
x_test = np.random.randn(1, 2)
use_model(x_test)

在上述代码中,使用 tf.global_variables_initializer() 函数对模型中的变量进行了全局初始化。之后,训练模型,并使用 Saver 对模型进行保存。在模型使用中,使用 Saver 载入模型,并进行模型测试。