从前面的学习笔记中,笔者和大家一起使用了 numpy 一步一步从感知机开始到两层网络以及最后实现了深度神经网络的算法搭建。而后我们又讨论了改善深度神经网络的基本方法,包括神经网络的正则化、参数优化和调参等问题。这一切工作我们都是基于numpy 完成的,没有调用任何深度学习框架。在学习深度学习的时候,一开始不让大家直接上手框架可谓良苦用心,旨在让大家能够跟笔者一样,一步一步通过 numpy 搭建神经网络的过程就是要让你能够更加深入的理解神经网络的架构、基本原理和工作机制,而不是黑箱以视之。
但学习到这个阶段,你已充分理解了神经网络的工作机制,马上就要接触更深层次的卷积神经网络(cnn)和递归神经网络(rnn),依靠纯手工去搭建这些复杂的神经网络恐怕并不现实。这时候就该深度学习框架出场了。针对深度学习,目前有很多优秀的学习框架,比如说笔者马上要讲的 tensorflow,微软的 cntk,伯克利视觉中心开发的 caffe,以及别具一格的 pytorch 和友好易用的 keras,本系列深度学习笔记打算从 tensorflow 开始,对三大主流易用的深度学习框架 tensorflow、pytorch 和 keras 进行学习和讲解。选择这三个框架的原因在于其简单易用、方便编程和运行速度相对较快。
作为谷歌的深度学习框架, tensorflow 在深度学习领域可谓风头无二。其中 tensor 可以理解为类似于 numpy 的 n 维数组,名为张量; flow 则意味着 n 维数组的流计算,而 tensor 的数据流计算形式则为一个计算图的形式进行计算。这里重点提一下,如果大学本科期间的线性代数忘记了的话,我劝你赶紧回去翻一翻,线性代数和矩阵论是深度学习的基础,希望你能熟练掌握。
先看个简单的例子。
import tensorflow as tf# define y_hat constant. set to 36.y_hat = tf.constant(36, name='y_hat') # define y. set to 39 y = tf.constant(39, name='y') # create a variable for the lossloss = tf.variable((y - y_hat)**2, name='loss') # when init is run later (session.run(init)), the loss variable will be initialized and ready to be computedinit = tf.global_variables_initializer() # create a session and print the outputwith tf.session() as session: # initializes the variables session.run(init) # prints the loss print(session.run(loss))9 在上述代码中,我们首先定义了两个常量,然后定义了一个 loss tensor(变量),之后对变量进行初始化,创建计算会话,最后执行会话计算并打印结果。所以我们可以看到运行 tensorflow 的基本机制:
创建一些尚未被执行的张量——定义这些张量之间的运算操作——初始化这些张量——创建会话——执行会话
需要注意的一点是,创建会话后一定要执行这个会话,且看下面示例:
a = tf.constant(2)b = tf.constant(10)c = tf.multiply(a,b)print(c)tensor(mul:0, shape=(), dtype=int32) 在上面的示例中,我们创建了两个 tensor 和 tensor 之间的乘积运算,但直接打印的结果却不是我们想要看到的 20. 原因则在于这里我们没有创建会话并执行,只是打印了两个张量运算之后的张量。创建会话并执行操作如下:
sess = tf.session()print(sess.run(c))20 除了直接定义变量之外,我们还可以通过创建占位符变量来稍后为之赋值,然后在运行会话中传入一个 feed_dict ,示例如下:
x = tf.placeholder(tf.int64, name = 'x')print(sess.run(2 * x, feed_dict = {x: 3}))sess.close()6 相信你已经大致明白了基于张量运算的 tensorflow 的底层运行机制了。总结而言就是:创建张量、初始化张量、创建会话并执行。
下面展示几个 tensorflow 的神经网络计算的基础函数示例。
线性函数def linear_function():
implements a linear function: initializes w to be a random tensor of shape (4,3) initializes x to be a random tensor of shape (3,1) initializes b to be a random tensor of shape (4,1) returns: result -- runs the session for y = wx + b np.random.seed(1) x = tf.constant(np.random.randn(3,1), name='x') w = tf.constant(np.random.randn(4,3), name='w') b = tf.constant(np.random.randn(4,1), name='b') y = tf.add(tf.matmul(w, x), b) # create the session using tf.session() and run it with sess.run(...) on the variable you want to calculate init = tf.global_variables_initializer() sess = tf.session() sess.run(init) result = sess.run(y) # close the session sess.close()
return result计算sigmoid函数def sigmoid(z):
computes the sigmoid of z arguments: z -- input value, scalar or vector returns: results -- the sigmoid of z x = tf.placeholder(tf.float32, name='x') sigmoid = tf.sigmoid(x)
with tf.session() as sess: result = sess.run(sigmoid, feed_dict={x: z})
return result计算损失函数
def cost(logits, labels):
computes the cost using the sigmoid cross entropy arguments: logits -- vector containing z, output of the last linear unit (before the final sigmoid activation) labels -- vector of labels y (1 or 0) note: what we've been calling z and y in this class are respectively called logits and labels in the tensorflow documentation. so logits will feed into z, and labels into y. returns: cost -- runs the session of the cost (formula (2)) # create the placeholders for logits (z) and labels (y) (approx. 2 lines) z = tf.placeholder(tf.float32, name='z') y = tf.placeholder(tf.float32, name='y') # use the loss function (approx. 1 line) cost = tf.nn.sigmoid_cross_entropy_with_logits(logits=z, labels=y) # create a session (approx. 1 line). see method 1 above. sess = tf.session() # run the session (approx. 1 line). sess.run(cost, feed_dict={z: logits, y: labels}) # close the session (approx. 1 line). see method 1 above. sess.close()
return costone hot 编码
def one_hot_matrix(labels, c):
creates a matrix where the i-th row corresponds to the ith class number and the jth column corresponds to the jth training example. so if example j had a label i. then entry (i,j) will be 1. arguments: labels -- vector containing the labels c -- number of classes, the depth of the one hot dimension returns: one_hot -- one hot matrix # create a tf.constant equal to c (depth), name it 'c'. (approx. 1 line) c = tf.constant(c) # use tf.one_hot, be careful with the axis (approx. 1 line) one_hot_matrix = tf.one_hot(labels, c, axis=0) # create the session (approx. 1 line) sess = tf.session() one_hot = sess.run(one_hot_matrix) # close the session (approx. 1 line). see method 1 above. sess.close()
return one_hot参数初始化def ones(shape): creates an array of ones of dimension shape arguments: shape -- shape of the array you want to create returns: ones -- array containing only ones # create ones tensor using tf.ones(...). (approx. 1 line) ones = tf.ones(shape) # create the session (approx. 1 line) sess = tf.session() # run the session to compute 'ones' (approx. 1 line) ones = sess.run(ones) # close the session (approx. 1 line). see method 1 above. sess.close()
return ones 一顿操作之后,我们已经将神经网络的一些基础运算利用 tensorflow 定义好了。在下一期笔记中,我们将学习如何使用 tensorflow 搭建神经网络。
本文由《自兴动脑人工智能》项目部 凯文 投稿。
华为的第四件大事:布局七年隐形三年,成败几何
现代炼金术!科学家利用二氧化碳成功制造钻石
未来的掌上医生:AI能媲美人类医生皮肤癌诊断准确性!
用PV操作可实现并发进程的互斥
松翰科技推出电容式触控功能的语音控制器 SNC81000S
【连载】深度学习笔记7:Tensorflow入门
以太币和比特币是如何运作的
【涨姿势】如何用iPerf测试Linux设备的Wi-Fi吞吐量??
无刷直流电机的结构和工作原理
ADI标准空间产品筛选:A组测试
棱镜门后续:美科技巨头在华上演《风声》
工信部发布了重点新材料首批次应用示范指导目录
魅族Flyme6最新鲜消息:魅族Flyme6更新至Flyme6.2,全新时代魅族手机不卡顿
恒定电流条件和导电规律
苹果公司扩大半导体性能
基于红热像仪实现水泥回转窑检测方案
模拟电路网络课件 第二十节:场效应管放大电路
通用自动驾驶子公司Cruise将新增1000员工和Waymo竞争加剧
小米雷军:明年5G手机将拉动换机潮,小米未来工厂12月正式建成
STM32单片机中抢占优先级和响应优先级的表达方式解析