转载自https://blog.youkuaiyun.com/qq_36686996/article/details/79350355
Tensorflow库的基本用法(十一)
TensorFlow的基本类型是tensor
1.变量:
在Tensorflow里面创建一个变量都需要一个Variable()函数创建,首先来看一个简单的矩阵乘法的例子。
import tensorflow as tf w = tf.Variable([[0.5,1.0]]) x = tf.Variable([[2.0],[1.0]]) y = tf.matmul(w,x) print(y)
可以得到输出:
Tensor(“MatMul:0”, shape=(1, 1), dtype=float32)
输出并不是一个值,而是一个Tensor类型,输出w,x也都是一样的。
w:<tf.Variable ‘Variable:0’ shape=(1, 2) dtype=float32_ref>
x:<tf.Variable ‘Variable_1:0’ shape=(2, 1) dtype=float32_ref>
可以看到他们的值都不是一个确切的数字,只是一个类型。所以tensorflow的赋值只是一个简单的搭建骨架而已,并没有把值写进去。
要想真正的初始化复制,先要执行一个global_variables_initializer(),初始化所以数据,然后把他放在一个Session中运行,就可以打出y的值了。
import tensorflow as tf import os os.environ['TF_CPP_MIN_LOG_LEVEL']='2' w = tf.Variable([[0.5,1.0]]) x = tf.Variable([[2.0],[1.0]]) y = tf.matmul(w,x) print(x) init_op = tf.global_variables_initializer(); with tf.Session() as sess: sess.run(init_op) print(y.eval())
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'
在CPU的情况下,TensorFlow会出现一个警告,使用这段代码可以消除警告。
在TensorFlow里面是不能直接打印y的值的,需要y.eval()才可以,直接打印是打印他本身的结构。
总结:
1,首先要给变量创建一个骨架,也就是矩阵的行数列数这些。
2,创建一个Sessions计算区域,用于计算。
3,创建一个全局初始化的容器,并且要在Sessions中运行。
4,使用变量名.eval()打印出值。
2.TensorFlow的基本操作
TensorFlow的矩阵操作其实和numpy是差不多的。
tf.zeros([x , y])就是创建一个x行y列并且值为零的一个矩阵
tf.zeros_like(tensor)创建一个和tensor一样行一样列但是值为零的矩阵
tf.ones([x , y])创建一个x行y列的一个矩阵,但是值为1
tf.ones_like(tensor)用法差不多
创建一个数组或者是向量,不可以直接创建,如果不是tensor类型是不可以使用tensorflow进行计算的。
如果要创建一个向量,直接使用[1,2,3,4,5]是不行的。创建知识一个普通的数组,还要使用tf.constant转换。
也可以tf.constans(-1.0 , shape = [2,3]),这样就创建了一个两行三列值都是-1的矩阵了。
tf.linspace()就是创建一个等差数列。tf.linspace(10 , 12 , 3)就会在10到12平均选取3个数出来,10,11,12
tf.range()也是一样的,只是不包含最后一个。
以上的结果要输出都要在Session里面进行一个eval()的输出才行。
ndarray转换tensorflow类型:
a = numpy.zeros([0,0,0][0,0,0])
ta = tf.convert_to_tensor(a)
这样就转成了tensorflow所支持的一个格式。
tf.placeholder这个函数只是会占一个位置,而不会初始化,到使用的时候才会复制计算。
a = tf.placeholder(tf.float32) b = tf.placeholder(tf.float32) c = tf.multiply(a , b) sess = tf.Session() print(sess.run([c] , feed_dict={a : 2 , b : 3}))只有在最后才进行赋值
3.小例子
实现一个每次加一的程序:
state = tf.Variable(0) new_value = tf.add(state , tf.Variable(1)) updata = tf.assign(state , new_value) with tf.Session() as sess: sess.run(tf.global_variables_initializer()) for i in range(3): sess.run(updata) print(sess.run(state)) pass
tf.add(a , b)就是相加,把b加到a,但是a的值还是原来的,结果是返回值。assign就是用新的值替代旧的值。在TensorFlow里面,=要替换成assign。a = state要替换成tf.assign(a , state)
4.实现简单的线性回归
首先要准备1000个数据点。
point_num = 1000 vector_set = [] for i in range(point_num): x = np.random.normal(0.0 , 0.55) y = 0.1 * x + 0.3 + np.random.normal(0.0 , 0.05) vector_set.append([x , y]) x = [v[0] for v in vector_set] y = [v[1] for v in vector_set]在y = 0.1x + 0.3这条线附近创建1000个点。
np.random.normal(0.0 , 0.55)
使用高斯分布,0.0的中心点0.55的方差的随机值。
点的分布都是可以使用线性回归曲线分开的。
然后就是要进行训练了:
w = tf.Variable(tf.random_uniform([1] , -1.0 , 1.0),name='w') b = tf.Variable(tf.zeros([1]),name='b') yi = w * x + b loss = tf.reduce_mean(tf.square(yi - y),name = 'loss') optomer = tf.train.GradientDescentOptimizer(0.5) train = optomer.minimize(loss , name = 'train') sess = tf.Session() init = tf.global_variables_initializer() sess.run(init) for i in range(50): sess.run(train) print('loss = ',sess.run(loss),sess.run(w)) plt.plot(x , sess.run(w) * x + sess.run(b)) plt.scatter(x , y, c = 'r') plt.show()首先先要创建一个权值和偏置值,
tf.random_uniform([1] , -1.0 , 1.0)
这个函数就是在-1到1之前创建一个随机矩阵,这个矩阵的shape就是【1】,其实就是一个数字。
之后得到预测值,
yi = w * x + b
使用均方差得到损失值:
loss = tf.reduce_mean(tf.square(yi - y),name = 'loss')
设置梯度下降的学习机:
optomer = tf.train.GradientDescentOptimizer(0.5)
学习率是0.5
train = optomer.minimize(loss , name = 'train')
训练函数
sess = tf.Session() init = tf.global_variables_initializer() sess.run(init) for i in range(50): sess.run(train) print('loss = ',sess.run(loss),sess.run(w))
这个就是开始训练50次了。
可以看到已经结果还是可以得。
</div>