tensorflow变量
在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))