tensorflow中,变量(tf.Variable)的作用就是用来保存和更新神经网络中的参数,在声明变量的同时需要指定其初始值。

tensorflow中支持的随机数生成器:

函数名称 随机数分布 主要参数
tf.random_normal 正态分布 平均值、标准差、取值类型
tf.truncated_normal 正态分布,但如果随机出来的值偏离平均值超过2个标准差,那么这个数将会被重新随机 平均值、标准差、取值类型
tf.random_uniform 平均分布 最小、最大取值,取值类型
tf.random_gamma Gamma分布 形状参数alpha、尺度参数beta、取值类型

tensorflow也支持使用常数来初始化一个变量,常用的常量生成函数如下表

函数名称 功能 实例
tf.zeros 产生全0的数组 tf.zeros([2,3],int32)->[[0,0,0],[0,0,0]]
tf.ones   产生全1的数组 tf.ones([2,3],int32)->[[1,1,1],[1,1,1]]
tf.fill   产生一个全部为给定数字的数组 tf.fill([2,3],9)->[[9,9,9],[9,9,9]]
tf.constant   产生一个给定值的常量 tf.constant([1,2,3])->[1,2,3]

如下代码声明变量的几种方式:

import tensorflow as tf
# 生成一个2*3的矩阵,矩阵中的元素均值为0,标准差为2。
weights=tf.Variable(tf.random_normal([2,3],stddev=2))
# 生成一个初始值全为0,长度为3的变量
biases=tf.Variable(tf.zeros([3]))
# 使用其他变量的初始值来初始化新的变量
w2=tf.Variable(weights.initialized_value())
w3=tf.Variable(weights.initialized_value()*2.0)

实现一个简单的网络,代码如下

# 定义一个简单的网络
import tensorflow as tf
from numpy.random import RandomState

# 定义训练数据batch的大小
batch_size=8

# 定义神经网络参数
w1=tf.Variable(tf.random_normal([2,3],stddev=1,seed=1))
w2=tf.Variable(tf.random_normal([3,1],stddev=1,seed=1))

x=tf.placeholder(tf.float32,shape=(None,2),name='x-input')
y_=tf.placeholder(tf.float32,shape=(None,1),name='y-input')

# 定义前向传播
a=tf.matmul(x,w1)
y=tf.matmul(a,w2)

# 定义损失函数和反向传播算法
cross_entropy=-tf.reduce_mean(y_*tf.log(tf.clip_by_value(y,1e-10,1.0)))
train_step=tf.train.AdamOptimizer(0.001).minimize(cross_entropy)

# 通过随机数生成一个模拟数据集
rdm=RandomState(1)
dataset_size=128
X=rdm.rand(dataset_size,2)
Y=[[int(x1+x2<1)] for (x1,x2) in X]

with tf.Session() as sess:
    init_op=tf.global_variables_initializer()
    sess.run(init_op)
    
    print('训练前网络参数的值为:')
    print(sess.run(w1))
    print(sess.run(w2))
    
    # 设定训练的轮数
    STEPS=5000
    for i in range(STEPS):
        # 每次选取batch_size个样本进行训练
        start=(i*batch_size)%dataset_size
        end=min(start+batch_size,dataset_size)
        
        # 通过选取的样本训练神经网络并更新参数
        sess.run(train_step,feed_dict={x:X[start:end],y_:Y[start:end]})
        if i % 1000==0:
            # 每隔一段时间计算在所有数据上的交叉熵并输出
            total_cross_entropy=sess.run(cross_entropy,feed_dict={x:X,y_:Y})
            print("After {} training step(s),cross entropy on all data is {}".
                  format(i,total_cross_entropy))
    
    print('训练后网络参数的值为:')
    print(sess.run(w1))
    print(sess.run(w2))