尽管深度学习背后的数学概念已经出现几十年了,但是用于创建和训练这些深度模型的程序类库在最近几年才出现。不幸的是,大多数类库都会在灵活性和实际生产价值上做出权衡。易用性的类库对于科研是无比珍贵的,因为这样科技工作者们才更方便地研究出新的模型框架,但是,如果考虑到实际生产的话,它们往往训练又太慢而没有实际的应用价值。另一方面,快、高效的类库,部署到分布式硬件上是可行的,但是它们只针对具体的那些神经网络,对新发明的网络又不适用。
这就留给决策者们一个困惑: 要想不重复实现相同的代码,我们还依然要用不太灵活的类库做科研吗?还是,科研和生产各用自己的一套不相同的库?
假如,我们选择前者,我们也许不能测试各种不同种类的神经网络,如果选择了后者,我们必须维护不同的两套代码,我们能有足够的精力做这个吗?
TensorFlow 就是为了解决,新出现的神经网络架构如何真正能在生产环境下使用,这一使命而诞生的。
在tensorFlow中使用tensor这种数据结构来表示所有的数据,所有的计算涉及到的数据都是tensor这种结构类型的。Tensorflow把tensorflow看做是一个n维的数组或者列表,tensor又叫做张量,tensor的维数又叫做阶,但是tensor的阶和矩阵的阶不是一个概念。
你可以认为一个二阶tensor就是我们平常说的矩阵,一阶tensor就是一个向量,二阶tensor可以用t[i,j]来描述,三阶tensor可以用t[i,j,k]来描述。
阶 | 数学实例 | Python 例子 |
---|---|---|
0 | 纯量 (只有大小) | s = 666 |
1 | 向量(大小和方向) | v = [1.9, 2.5, 3.1] |
2 | 矩阵(数据表) | m = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] |
3 | 3阶张量 (数据立体) | 3阶张量 (数据立体) t = [[[1,2,3], [4,5,6], [6,7,8]], [[8.9.10], [10,11,12], [12,12,13]], [[14,15,16], [16,17,18], [18,19,20]]] |
n | n阶 | (自己想想看) |
如一个二阶tensort[2,1]的位置就是里面第二个元素中第一个位置4:
如一个三阶tensort[3,2,1]的位置就是里面第三个元素中第二个元素的第一个位置:
在tensorflow中,一个图是用来描述计算的过程的,图必须在会话session里面启动,程序的流程分为两步,第一步构建阶段,这个阶段就是专门构建一些计算的操作和数据的构建等,用op来描述,在数据和操作定义完之后就可以启动session来执行计算任务了
构建过程:
看下面的一些简单的代码(线性回归):
注:可以使用tf.constant()来定义常量
可以使用tf.Variable()来定义变量
#构建权重参数w
w=tf.Variable(tf.random_uniform([1],-1.,1.,name='myw'))
#构建偏置项
b=tf.Variable(tf.zeros(1),name='myb')
#组合函数
y=w*x_data+b
#构建session
sess = tf.Session()
#初始话上面构建的数据的操作,w和b
init = tf.global_variables_initializer()
#初始话
sess.run(init)
在session中运行直接调用Session.run()函数就可以直接跑tensorflow程序了:
for step in range(20):
sess.run(train)
print("w=", sess.run(w),"b=",sess.run(b),sess.run(loss))
Tensorboard是一个可视化界面,这个界面展示了tensorflow程序中数据的流向和相关的计算操作。
writer = tf.summary.FileWriter("./mytmp",sess.graph)
这样在mytmp文件夹下,增加了一个event文件,
再在终端,输入 tensorboard.exe --logdir = 刚在生成的log文件夹的绝对路径,回车,这样服务端就启动了,
接下来,启动客户端,即浏览器,输入localhost:6006,端口是6006,选中graphs,得到如下的可视化图:
完整代码如下:
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
num_points=100
vectors_set=[]
for i in range(num_points):
x1=np.random.normal(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='r')
plt.show()
#构建线性回归的graph
#构建权重参数w
w=tf.Variable(tf.random_uniform([1],-1.,1.,name='myw'))
#构建偏置项
b=tf.Variable(tf.zeros(1),name='myb')
#组合函数
y=w*x_data+b
loss=tf.reduce_mean(tf.square(y-y_data,name='mysquare'),name='myloss')
optimizer=tf.train.GradientDescentOptimizer(0.5)
train=optimizer.minimize(loss,name='mytrain')
#global_variables_initializer初始化Variable等变量
#构建session
sess = tf.Session()
#初始话上面构建的数据的操作,w和b
init = tf.global_variables_initializer()
#初始话
sess.run(init)
print("w=", sess.run(w),"b=",sess.run(b),sess.run(loss))
#迭代20次train
for step in range(20):
sess.run(train)
print("w=", sess.run(w),"b=",sess.run(b),sess.run(loss))
#写入磁盘,提供tensorboard在浏览器中展示用
writer = tf.summary.FileWriter("./mytmp",sess.graph)
plt.scatter(x_data,y_data,c='r')
plt.plot(x_data,sess.run(w)*x_data+sess.run(b))
plt.show()
生成的随机数可视化图片和拟合函数的可视化图片:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。