2018-01-07cs20si:tf学习笔记 -转载自廖星宇

小白学CNN以及Keras的速成(3)

https://sherlockliao.github.io/2017/04/29/keras3/

2017 深度学习框架发展大盘点--迎来 PyTorch,告别 Theano

http://sh.qihoo.com/pc/2s1corcpl1y?sign=360_e39369d1

转载自廖星宇


cs20si: tensorflow for research 学习笔记1-4

https://zhuanlan.zhihu.com/p/28924642

https://sherlockliao.github.io/2017/08/30/cs20si3/

代码:

https://github.com/SherlockLiao/tensorflow-beginner/blob/master/lab/logistic_regression_mnist.py


cs20si: tensorflow for research 学习笔记3

Sherlock

4 个月前

TensorFlow中的Linear Regression

线性回归是机器学习中非常简单的问题,我们用tensorflow实现一个小例子。

问题: 希望能够找到一个城市中纵火案和盗窃案之间的关系,纵火案的数量是X,盗窃案的数量是Y,我们建设存在如下线性关系,Y = wX + b。

TensorFlow实现

首先定义输入X和目标Y的占位符(placeholder)

X=tf.placeholder(tf.float32,shape=[],name='input')Y=tf.placeholder(tf.float32,shape=[],name='label')

里面shape=[ ]表示标量(scalar)

然后定义需要更新和学习的参数w和b

w=tf.get_variable('weight',shape=[],initializer=tf.truncated_normal_initializer())b=tf.get_variable('bias',shape=[],initializer=tf.zeros_initializer())

接着定义好模型的输出以及误差函数,这里使用均方误差(Y - Y_predicted)^2

Y_predicted=w*X+bloss=tf.square(Y-Y_predicted,name='loss')

然后定义好优化函数,这里使用最简单的梯度下降,这里的学习率不仅可以是常量,还可以是一个tensor

optimizer=tf.train.GradientDescentOptimizer(learning_rate=1e-3).minimize(loss)

tensorflow是如何判断哪些参数该更新,哪些参数不更新呢?tf.Variabel(trainable=False)就表示不对该参数进行更新,默认下tf.Variable(trainable=True)。

然后在session中做运算

init=tf.global_variables_initializer()withtf.Session()assess:writer=tf.summary.FileWriter('./linear_log',graph=sess.graph)sess.run(init)foriinrange(100):total_loss=0forx,yindata:_,l=sess.run([optimizer,h_loss],feed_dict={X:x,Y:y})total_loss+=lprint("Epoch {0}: {1}".format(i,total_loss/n_samples))

可视化

我们可以打开tensorboard查看我们的结构图如下

最后我们将数据点和预测的直线画出来

如何改善模型

1. 我们可以增加维度,原始模型是Y = Xw + b,我们可以提升一维,使其变成Y = X^2 w1 + X w2 + b

2. 可以换一种loss的计算方式,比如huber loss,当误差比较小的时候使用均方误差,误差比较大的时候使用绝对值误差

在实现huber loss的时候,因为tf是以图的形式来定义,所以不能使用逻辑语句,比如if等,我们可以使用TensorFlow中的条件判断语句,比如tf.where、tf.case等等,huber loss的实现方法如下

defhuber_loss(labels,predictions,delta=1.0):residual=tf.abs(predictions-labels)condition=tf.less(residual,delta)small_res=0.5*residual**2large_res=delta*residual-0.5*delta**2returntf.where(condition,small_res,large_res)

关于Optimizer

TensorFlow会自动求导,然后更新参数,使用一行代码tf.train.GradientDescentOptimizer(learning_rate=1e-3).minimize(loss),下面我们将其细分开来,讲一讲每一步。

自动梯度

首先优化函数的定义就是前面一部分opt = tf.train.GradientDescentOptimizer(learning_rate),定义好优化函数之后,可以通过grads_and_vars = opt.compute_gradients(loss, )来计算loss对于一个变量列表里面每一个变量的梯度,得到的grads_and_vars是一个list of tuples,list中的每个tuple都是由(gradient, variable)构成的,我们可以通过get_grads_and_vars = [(gv[0], gv[1]) for gv in grads_and_vars]将其分别取出来,然后通过opt.apply_gradients(get_grads_and_vars)来更新里面的参数,下面我们举一个小例子。

importtensorflowastfx=tf.Variable(5,dtype=tf.float32)y=tf.Variable(3,dtype=tf.float32)z=x**2+x*y+3sess=tf.Session()# initialize variablesess.run(tf.global_variables_initializer())# define optimizeroptimizer=tf.train.GradientDescentOptimizer(0.1)# compute gradient z w.r.t x and ygrads_and_vars=optimizer.compute_gradients(z,[x,y])# fetch the variableget_grads_and_vars=[(gv[0],gv[1])forgvingrads_and_vars]# dz/dx = 2*x + y= 13# dz/dy = x = 5print('grads and variables')print('x: grad {}, value {}'.format(sess.run(get_grads_and_vars[0][0]),sess.run(get_grads_and_vars[0][1])))print('y: grad {}, value {}'.format(sess.run(get_grads_and_vars[1][0]),sess.run(get_grads_and_vars[1][1])))print('Before optimization')print('x: {}, y: {}'.format(sess.run(x),sess.run(y)))# optimize parametersopt=optimizer.apply_gradients(get_grads_and_vars)# x = x - 0.1 * dz/dx = 5 - 0.1 * 13 = 3.7# y = y - 0.1 * dz/dy = 3 - 0.1 * 5 = 2.5print('After optimization using learning rate 0.1')sess.run(opt)print('x: {:.3f}, y: {:.3f}'.format(sess.run(x),sess.run(y)))sess.close()

上面程序的注释已经解释了所有的内容,就不细讲了,最后可以得到下面的结果。

在实际中,我们当然不用手动更新参数,optimizer类可以帮我们自动更新,另外还有一个函数也能够计算梯度。

tf.gradients(ys,xs,grad_ys=None,name='gradients',colocate_gradients_with_ops=False,gate_gradients=False,aggregation_method=None)

这个函数会返回list,list的长度就是xs的长度,list中每个元素都是 

实际运用: 这个方法对于只训练部分网络非常有用,我们能够使用上面的函数只对网络中一部分参数求梯度,然后对他们进行梯度的更新。

优化函数类型

随机梯度下降(GradientDescentOptimizer)仅仅只是tensorflow中一个小的更新方法,下面是tensorflow目前支持的更新方法的总结

tf.train.GradientDescentOptimizertf.train.AdadeltaOptimizertf.train.AdagradOptimizertf.train.AdagradDAOptimizertf.train.MomentumOptimizertf.train.AdamOptimizertf.train.FtrlOptimizertf.train.ProximalGradientDescentOptimizertf.train.ProximalAdagradOptimizertf.train.RMSPropOptimizer

这个博客对上面的方法都做了介绍,感兴趣的同学可以去看看,另外cs231n和coursera的神经网络课程也对各种优化算法做了介绍。

TensorFlow 中的Logistic Regression

我们使用简单的logistic regression来解决分类问题,使用MNIST手写字体,我们的模型公式如下

TensorFlow实现

TF Learn中内置了一个脚本可以读取MNIST数据集

fromtensorflow.examples.tutorials.mnistimportinput_datamnist=input_data.read_data_sets('./data/mnist',one_hot=True)

接着定义占位符(placeholder)和权重参数

x=tf.placeholder(tf.float32,shape=[None,784],name='image')y=tf.placeholder(tf.int32,shape=[None,10],name='label')w=tf.get_variable('weight',shape=[784,10],initializer=tf.truncated_normal_initializer())b=tf.get_variable('bias',shape=[10],initializer=tf.zeros_initializer())

输入数据的shape=[None, 784]表示第一维接受任何长度的输入,第二维等于784是因为28x28=784。权重w使用均值为0,方差为1的正态分布,偏置b初始化为0。

然后定义预测结果、loss和优化函数

logits=tf.matmul(x,w)+bentropy=tf.nn.softmax_cross_entropy_with_logits(labels=y,logits=logits)loss=tf.reduce_mean(entropy,axis=0)optimizer=tf.train.GradientDescentOptimizer(learning_rate).minimize(loss)

使用tf.matmul做矩阵乘法,然后使用分类问题的loss函数交叉熵,最后将一个batch中的loss求均值,对其使用随机梯度下降法。

因为数据集中有测试集,所以可以在测试集上验证其准确率

preds=tf.nn.softmax(logits)correct_preds=tf.equal(tf.argmax(preds,1),tf.argmax(y,1))accuracy=tf.reduce_sum(tf.cast(correct_preds,tf.float32),axis=0)

首先对输出结果进行softmax得到概率分布,然后使用tf.argmax得到预测的label,使用tf.equal得到预测的label和实际的label相同的个数,这是一个长为batch的0-1向量,然后使用tf.reduce_sum得到正确的总数。

最后在session中运算,这个过程就不再赘述。

### 结果与可视化

最后可以得到训练集的loss的验证集准确率如下

可以发现经过10 epochs,验证集能够实现74%的准确率。同时,我们还能够得到tensorboard可视化如下。

这看着是有点混乱的,所以下一次课会讲一下如何结构化我们的模型。

本文的全部代码都在github

欢迎访问我的博客

欢迎查看我的知乎专栏深度炼丹

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 210,978评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 89,954评论 2 384
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,623评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,324评论 1 282
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,390评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,741评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,892评论 3 405
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,655评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,104评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,451评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,569评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,254评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,834评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,725评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,950评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,260评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,446评论 2 348

推荐阅读更多精彩内容