Tensor flow是现在最流行的深度学习框架之一,要想使用它,就得按照其要求使用Tensor flow自己的生态环境,那就从最基础的开始学起
#Variable用法
import tensorflow as tf
w = tf.Variable([[0.5,1.0]])
x = tf.Variable([[2.0],[1.0]])
y = tf.matmul(w,x)
y
<tf.Tensor 'MatMul:0' shape=(1, 1) dtype=float32>
Variable是将矩阵或是变量转换成为Tensor格式的数据,如上图打印出来的结果。
matmul是做矩阵乘积
#Tensor对象打印输出
#首先要将变量初始化
init_op = tf.global_variables_initializer()
#然后调用Session模块,最后打印的时候还要加eval()函数
with tf.Session() as sess:
sess.run(init_op)
print(y.eval())
[[2.]]
其他一些操作
#基本操作,建议tensorflow类据类型多为float32,否则可能会遇到许多错误
#类似于numpy
tf.zeros((3,4), tf.float32)
tf.ones((3,4))
tenser = [[1,2,3],[4,5,6]]
tf.zeros_like(tenser) #将tenser变成形状为(2,3)元素全为0的数组
tf.ones_like(tenser)#将tenser变成形状为(2,3)元素全为1的数组
#定义常量,一维
tensor = tf.constant([1,2,3,4,5,6]) ==> [1 2 3 4 5 6]
#二维
tensor = tf.constant(-1.0,shape(2,3)) ==> [[-1. -1.],[-1. -1.],[-1. -1.]]
#生成序列
tf.linspace(10,12,3) => [ 10.0 11.0 12.0]
#生成序列
start = 3
limit = 18
delta = 3
tf.range(start, limit, delta) # [3, 6, 9, 12, 15]
#随机的生成(2,3)的均值为1,方差为4 的分布
norm = tf.random_normal([2,3],mean=1,stddev=4)
#随机打乱
c = tf.constant([[1,2],[2,3],[3,4]])
shuff = tf.random_shuffle(c)
#打印输出也可以是这种方式,官方建议使用with的方式,因为他是一个上下文管理器,最后要close下
ses = tf.Session()
print(ses.run(norm))
print(ses.run(shuff))
[[-2.6340098 1.624991 -0.9962323]
[-2.7846653 3.2407472 1.3688865]]
[[3 4]
[1 2]
[2 3]]
#小例子
state = tf.Variable(0) #定义初始值
new_value = tf.add(state, tf.constant(1)) #定义常量并进行相加操作
update = tf.assign(state, new_value) #将后面的值赋值给前面的值
with tf.Session() as sess:
sess.run(tf.global_variables_initializer()) #每次初始化完之后,要再次进行初始化不能再用上次的初始化global,不然会报错哦
print(sess.run(state))
for _ in range(3):
sess.run(update)
print(sess.run(state))
0
1
2
3
这个例子是一个循环,原本两行搞定的弄得这么麻烦,哈哈哈~,这就是Tensor环境,但也有它的好处,在后面写算法是就会知道它的方便了。
#将numpy转换为tensor格式
import numpy as np
a = np.zeros((3,3))
ta = tf.convert_to_tensor(a)
with tf.Session() as sess:
print(sess.run(ta))
[[0. 0. 0.]
[0. 0. 0.]
[0. 0. 0.]]
#placeholder 相当于一个占位符,先开辟一个空间等待被赋值,并指定数据类型
input1 = tf.placeholder(tf.float32)
input2 = tf.placeholder(tf.float32)
output = tf.multiply(input1,input2) #乘法操作
with tf.Session() as sess:
print(sess.run([output], feed_dict={input1:[2.], input2:[3.]})) #run 并通过feed_dict赋值,字典格式
[array([6.], dtype=float32)]
下面是一个线性回归的例子
import numpy as np
import matplotlib.pyplot as plt
#随机生成1000个点,围绕再y=0.1x+0.3的直线范围内
vectors_set = []
for i in range(1000):
x1 = np.random.normal(0.0,0.55)
y1 = x1*0.1 + 0.3 + np.random.normal(0.0, 0.03)
vectors_set.append([x1, y1])
#一些样本
x_data = [v[0] for v in vectors_set]
y_data = [v[1] for v in vectors_set]
plt.scatter(x_data, y_data, c='b')
plt.show()
#生成1维的W矩阵,取值是[-1,1]之间的随机数
W = tf.Variable(tf.random_uniform([1], -1.0, 1.0), name='W')
#生成1维的b矩阵,初始值为0
b = tf.Variable(tf.zeros([1]), name='b')
#计算出预估值
y = W*x_data + b
#以预估值y和实际值y_data之间的均方误差作为损失值
loss = tf.reduce_mean(tf.square(y - y_data), name='loss') #tf.square是做平方运算,reduce_mean取均值
#采用梯度下降法来优化参数
optimzer = tf.train.GradientDescentOptimizer(0.5) #内置的梯度下降求解,传入学习率
#训练过程就是最小化这个误差
train = optimzer.minimize(loss, name='train') #求解并更新初始值的功能
sess = tf.Session()
init = tf.global_variables_initializer()
sess.run(init)
#初始化的w和b是多少
print('W=',sess.run(W),'b=',sess.run(b),'loss=',sess.run(loss))
for step in range(20):
sess.run(train)
#输出训练好的W和b
print('W=',sess.run(W),'b=',sess.run(b),'loss=',sess.run(loss))
W= [0.046175] b= [0.] loss= 0.09313088
W= [0.06895316] b= [0.3022865] loss= 0.0012029369
W= [0.07778016] b= [0.30172718] loss= 0.0010688803
W= [0.08409107] b= [0.3015104] loss= 0.0010005258
W= [0.08859857] b= [0.30135545] loss= 0.0009656554
W= [0.09181802] b= [0.30124477] loss= 0.0009478664
W= [0.09411748] b= [0.3011657] loss= 0.00093879167
W= [0.09575986] b= [0.30110922] loss= 0.00093416224
W= [0.09693291] b= [0.3010689] loss= 0.0009318005
W= [0.09777075] b= [0.30104008] loss= 0.00093059574
W= [0.09836917] b= [0.30101952] loss= 0.0009299812
W= [0.09879659] b= [0.30100483] loss= 0.0009296677
W= [0.09910187] b= [0.30099434] loss= 0.0009295077
W= [0.09931992] b= [0.30098683] loss= 0.00092942605
W= [0.09947566] b= [0.3009815] loss= 0.0009293844
W= [0.09958689] b= [0.30097765] loss= 0.00092936325
W= [0.09966633] b= [0.30097494] loss= 0.0009293524
W= [0.09972308] b= [0.30097297] loss= 0.00092934683
W= [0.09976361] b= [0.3009716] loss= 0.000929344
W= [0.09979255] b= [0.30097058] loss= 0.0009293426
W= [0.09981323] b= [0.30096987] loss= 0.00092934177
plt.scatter(x_data, y_data, c='r')
plt.plot(x_data, sess.run(W)*x_data+sess.run(b))
plt.show()