文|Seraph
Jeff Dean简介
Creator of TensorFlow
Creator of DistBelief
Designer of MapReduce
Designer of BigTable
2012 Google DistBelief(内部使用) 到 2015 Google TensorFlow
文章:Large Scale Distributed Deep Networks.
brew update
brew install python #使用brew安装python
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py #curl命令作用是下载文件
python git-pip.py #使用git-pip.py文件安装pip
sudo pip install -U virtualenv #安装virtualenv虚拟环境
virtualenv虚拟环境的好处:当我们需要多个版本tensorflow开发时,使用virtualenv可以隔离不同版本。
virtualenv --system-site-packages -p python3.7 ./venv #在当前venv目录下创建虚拟virualenv环境
source ./venv/bin/activate #激活虚拟环境
pip install tensorflow #安装tensorflow
pip list installed #检查安装包
python #进入Python
import tensorflow as tf #导入tensorflow包
deactivate #离开当前Python虚拟环境
import tensorflow as tf
hello = tf.constant("hello TensorFlow") #定义常量操作,注意"不要输入成中文的,
sess = tf.Session() #创建一个会话
print(sess.run(hello)) #执行常量操作hello,并将结果打印到标准输出
执行sess = tf.Session()
时可能会提示,CPU不支持AVX2指令集,但是没有关系,其中AVX2指令集是intel新发布的指令集,在AVX上扩展而来,有些老机器不支持。
pip install jupyter
python -m ipykernel install --user --name=venv #将jupyter解析器绑定值venv虚拟环境,注意venv不要写错,因为写错了,也能执行成功,但是后面jupyter可能找不到venv
jupyter kernelspec list #查看可用的kernel
jupyter notebook
docker pull tensorflow/tensorflow:nightly-jupyter #拉一个tensorflow镜像
docker run -it --rm -p 8888:8888 -v $PWD:/tf/notebooks tensorflow/tensorflow:nightly-jupyter
上面最后一条语句:映射关系是从实际:docker容器
中,所以$PWD:/tf/notebooks
表示将本地目录映射到容器中/tf/notebooks
目录中。
现在我们就可以用浏览器登录jupyter了,不过我们输入localhost:8888
时,会发现如下界面:
由于我们访问的不再是我们本机的jupyter,而是docker容器中的,这里提示我们需要密码。而我们肯定是不知道的,但可以从我们刚才docker镜像启动界面最下方拷贝那段token。
用localhost:8888/?token=598d15e6cea85382cda998d0c3af0109c96a05856293b57
的直接访问,也可用这段token重置新密码。
相同数据类型
的多维数组
。有两个属性:import tensorflow as tf
# 0阶张量
mammal = tf.Variable("Elephant", tf.string)
ignition = tf.Variable(451, tf.int16)
floating = tf.Variable(3.14159265359, tf.float64)
its_complicated = tf.Variable(12.3 - 4.85j, tf.complex64)
# 1阶张量
mystr = tf.Variable(["Hello", "World"], tf.string)
cool_numbers = tf.Variable([3.14159, 2.71828], tf.float32)
first_primes = tf.Variable([2, 3, 5, 7, 11], tf.int32)
its_very_complicated = tf.Variable([12.3 - 4.85j, 7.5 - 6.23j], tf.complex64)
# 2阶张量
mymat = tf.Variable([[7],[11]], tf.int16)
myxor = tf.Variable([[False, True],[True, False]], tf.bool)
linear_squares = tf.Variable([[4], [9], [16], [25]], tf.int32)
squarish_squares = tf.Variable([ [4, 9], [16, 25] ], tf.int32)
rank_of_squares = tf.rank(squarish_squares)
mymatC = tf.Variable([[7],[11]], tf.int32)
# 4阶张量
my_image = tf.zeros([10, 299, 299, 3]) # batch x height x width x color
Variable
的主要作用是维护特定节点的状态,如深度学习或机器学习的模型参数。tf.Variable
方法是操作,返回值是变量(特殊变量)。tf.Variable
方法创建的变量,与张量一样,可以作为操作的输入和输出。但其不同之处在于:import tensorflow as tf
#创建变量
w = tf.Variable(<initial-value>, name=<optional-name>)
#将变量作为操作的输入
y = tf.matmul(w, ...another vaiable or tensor ...)
z = tf.sigmoid(w + y)
# 使用asssign或assign_xxx方法重新给变量赋值
w.assgin(w + 1.0)
w.assgin_add(1.0)
import tensorflow as tf
# 创建变量
# tf.random_normal 方法返回形状为(1,4)的张量。它的4个元素符合均值为100、标准差为0.35的正态分布。
W = tf.Variable(initial_value=tf.random_normal(shape=(1, 4), mean=100, stddev=0.35), name="W")
b = tf.Variable(tf.zeros([4]), name="b")
# 初始化变量
# 创建会话(之后小节介绍)
sess = tf.Session()
# 使用 global_variables_initializer 方法初始化全局变量 W 和 b
sess.run(tf.global_variables_initializer())
# 执行操作,获取变量值
sess.run([W, b])
# 执行更新变量 b 的操作
sess.run(tf.assign_add(b, [1, 1, 1, 1]))
# 查看变量 b 是否更新成功
sess.run(b)
v1 = tf.Variable(..., name='v1')
v2 = tf.Variable(..., name='v2')
# 指定需要保存和恢复的变量
saver = tf.train.Saver({'v1': v1, 'v2': v2}) #Key-Value的形式存储
saver = tf.train.Saver([v1, v2])# 默认以变量操作名为Key存储
saver = tf.train.Saver({v.op.name: v for v in [v1, v2]}) #等同于上一句
# 保存变量的方法
tf.train.saver.save(sess, 'my-model', global_step=0) # ==> filename: 'my-model-0'
以上代码最后一句的global_step
参数在训练时很有用,一般我们要训练很多遍,这里步数可以让我们回溯每一步的保存值。
Code 示例三:
# 创建Saver
saver = tf.train.Saver({'W': W, 'b': b})
# 存储变量到文件 './summary/test.ckpt-0'
saver.save(sess, './summary/test.ckpt', global_step=0)
# 再次执行更新变量 b 的操作
sess.run(tf.assign_add(b, [1, 1, 1, 1]))
# 获取变量 b 的最新值
sess.run(b)
# 从文件中恢复变量 b 的值
saver.restore(sess, './summary/test.ckpt-0')
# 查看变量 b 是否恢复成功
sess.run(b)
# 从文件中恢复数据流图结构
# tf.train.import_meta_graph
第一步运行以后,我们可以在./summary
文件夹下发现几个文件,其中.index
后缀文件为索引文件,为了数据量很大时,快速查找;.meta
存储着数据流图的结构;.data
存在的数据。
mport tensorflow as tf
a = tf.constant(2)
b = tf.constant(3)
with tf.Session() as sess:
print("a: %i:" % sess.run(a))
print("b: %i:" % sess.run(b))
print("Addition with constants : %i " % sess.run(a + b))
print("Multiplication with constants : %i " % sess.run ( a * b))
x = tf.placeholder( tf.int16 , shape= () , name = "x")
y = tf.placeholder( tf.int16 , shape= () , name = "y")
add = tf.add(x, y)
mul = tf.multiply(x, y)
with tf.Session() as sess:
print("Addition with constants : %i" % sess.run (add , feed_dict = { x : 10 , y : 3}) )
参数 | 功能说明 |
---|---|
target | 会话连接的执行引擎 |
graph | 会话加载的数据流图 |
config | 会话启动时的配置项 |
import tensorflow as tf
# 创建数据流图:y = W * x + b,其中W和b为存储节点,x为数据节点。
x = tf.placeholder(tf.float32)
W = tf.Variable(1.0)
b = tf.Variable(1.0)
y = W * x + b
with tf.Session() as sess:
tf.global_variables_initializer().run() # Operation.run
fetch = y.eval(feed_dict={x: 3.0}) # Tensor.eval
print(fetch) # fetch = 1.0 * 3.0 + 1.0
以上两种方式,其实底层都是调用了Session.run方法。
3. 会话执行原理
人脸识别算法的三个流程:
1 人脸检测(Face detection)
2 人脸对齐(Face Alignment)
3 人脸特征表征(Features Representation)
发展的三个阶段:
1 早期算法:基于集合特征、子空间、
2
3
早期算法
线性降维:PCA降维、LDA降维
非线性降维:流行学习
第二阶段:
人工特征+分类器:逻辑回归、贝叶斯、支持向量机、神经网络等。
HOG\SIFT\Gabor\LBP
联合贝叶斯
LWF测试集
第三阶段:
基于深度学习的算法:DeepFace、FaceNet(Triplet Loss)
工具:
OpenCV(pip3 install opencv-python)
OpenCL
face_recognition
Triplet Loss
FaceNet-NN1
FaceNet-NN2
OpenFace
TFX
Kubeflow
ML GDE