前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >TensorFlow编程入门(二)

TensorFlow编程入门(二)

作者头像
用户1148523
发布2018-01-09 10:44:42
5270
发布2018-01-09 10:44:42
举报
文章被收录于专栏:FishFish

Classification

这里使用深度学习经典数据MNIST手写字符集。Classification主要就是给输入的字符集分出[0-9]十个类。它的输入图片是28*28也就是784个输入,输出呢则是10个,根据前面的内容,需要一个输入为784输出为10的神经网络。 其中有一个计算精度的代码:

代码语言:javascript
复制
def compute_accuracy(v_xs,v_ys):
    global prediction # 全局变量
    y_pre = sess.run(prediction,feed_dict={xs:v_xs})
    correct_prediction = tf.equal(tf.argmax(y_pre,1),tf.argmax(v_ys,1)) # 对比预测和真实数据的差别
    accuracy = tf.reduce_mean(tf.cast(correct_prediction,tf.float32)) # 计算准确率
    result = sess.run(accuracy,feed_dict={xs:v_xs,ys:v_ys})
    return result

另外,这里的神经网络就用了一层,784个输入10个输出,在一千步以内的精确率为0.87。但是,我尝试了一下再加入一层神经元,在GradientDescentOptimizer下效果变得很差,据说是因为训练不够的原因。

Dropout

使用dropout可以防止过拟合的出现,它会随机去掉某些神经元(具体什么原理有待学习)。 主要就是增加一个keep_prob的参数,然后在add_layer()增加 Wx_plus_b = tf.nn.dropout(Wx_plus_b, keep_prob) 这句话就可以了。这样会有效降低loss。

CNN

这里有个讲cnn的教程,简单明了:google的cnn教程 cnn的主要组成基本上就是,卷基层,池化层,然后最后来个全连接层。而且tf基本上可以算是傻瓜式操作,具体有多傻瓜,可以看看这里:神经网络的游乐场。玩这个你可以直观了解到神经网络到底是在搞蛇。引狼图:

playground
playground

。 重点的工作有两个:

1.定义各种变量

代码语言:javascript
复制
def weight_variable(shape):
    initial = tf.truncated_normal(shape,stddev=0.1) # 这和正太分布类似
    return tf.Variable(initial)
def bias_variable(shape):
    initial = tf.constant(0.1,shape=shape)
    return tf.Variable(initial)
def conv2d(x, W):
    # stride[1,x_move,y_move,1]
    # must have strides[0] = strides[3]
    # same就是得到的结果是和以前相同大小,边界
    return tf.nn.conv2d(x,W,strides=[1,1,1,1],padding='SAME') # 二维的卷基层,x是图片的所有信息,w是权重,strides是步长[1,x方向跨度,y方向跨度,1]
def max_pool_2x2(x):
    # 池化层
    return tf.nn.max_pool(x,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')
  1. 定义各种层
代码语言:javascript
复制
## conv1 layer ##
W_conv1 = weight_variable([5,5,1,32]) # patch 5*5,in size 1,也就是图片的厚度,out size 32输出32个厚度
b_conv1 = bias_variable([32])
h_conv1 = tf.nn.relu(conv2d(x_image,W_conv1)+b_conv1) # output size 28*28*32
h_pool1 = max_pool_2x2(h_conv1) # output size 14*14*32

## conv2 layer ##
W_conv2 = weight_variable([5,5,32,64]) # patch 5*5,in size 32,out size 64
b_conv2 = bias_variable([64])
h_conv2 = tf.nn.relu(conv2d(h_pool1,W_conv2)+b_conv2) # output size 14*14*64
h_pool2 = max_pool_2x2(h_conv2) # output size 7*7*64
## func1 layer ##
W_fc1 = weight_variable([7*7*64,1024])
b_fc1 = bias_variable([1024])
# 7,7,64 --> 7*7*64 这里接收的是一个三维的数据,要弄成一维的
h_pool2_flat = tf.reshape(h_pool2,[-1,7*7*64]) # -1就是不管它有多少个sample
h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat,W_fc1)+b_fc1)
h_fc1_drop = tf.nn.dropout(h_fc1,keep_prob)
## func2 layer ##
W_fc2 = weight_variable([1024,10]) # input size,output size
b_fc2 = bias_variable([10])
prediction = tf.nn.softmax(tf.matmul(h_fc1_drop,W_fc2)+b_fc2)

然后跑一跑就可以了~

saver

由于tf神奇的性质,它是没办法保存网络的,它只能保存权重之类的东西,因此我们需要使用的时候,需要重新构建网络,然后把东西填进去。

  • 生成网络
代码语言:javascript
复制
W = tf.Variable([[1,2,3],[3,4,5]],dtype=tf.float32,name='weights')
b = tf.Variable([[1,2,3]],dtype=tf.float32,name='biases')
init = tf.initialize_all_variables()
saver = tf.train.Saver()

with tf.Session() as sess:
    sess.run(init)
    save_path = saver.save(sess,".../save_net.ckpt")
    print "save to path:"+save_path
  • 使用网络
代码语言:javascript
复制
# restor variable cannot save net 
# redifine the same shape and same type for your varibles
W = tf.Variable(np.arange(6).reshape((2,3)),dtype=tf.float32,name="weights")
b = tf.Variable(np.arange(3).reshape((1,3)),dtype=tf.float32,name="biases")

#not need init step
saver = tf.train.Saver()
with tf.Session() as sess:    saver.restore(sess,".../save_net.ckpt")
    print sess.run(W)
    print sess.run(b)

RNN

本文的RNN并没有代码,只有原理讲解。RNN是叫做循环神经网络,和CNN的不同在于,它每个层的状态和上个层状态有关,不过貌似展开之后也差不多是普通的神经网络,只是每层的权重什么的都是一样的就是了。 每个神经元包含两个输入两个输出,当然有时候是一个输出,结构

RNN结构
RNN结构

,但是时间长了以前的东西就被忘掉了,所以出来了个LSTM:

LSTM
LSTM

这个东西有三个门,输入门,输出门和遗忘门,门的作用简单来讲就是规定让百分之多少的数据通过这个门。图里那个圆形的叉叉就是门。而那个小写的西格玛,就是一个sigmoid函数,它接受本次输入值x的值和上一次的输出值,算出一个0-1之间的数。让上次的状态值C经过这个门,就能保留一些,然后同理算出个输入门,让输入值通过这个门,然后再弄出个输出门,让输出经过这个门。这就是LSTM了。 这个链接是翻译的LSTM的开山之作:Understanding Recurrent Neural Networks

写在最后

虽然是最后但是还是个知识点,那就是如何把工程push到github上。首先,在github里新建一个仓库,这里命名为TensorFlow。然后在本地新建一个文件加,把本节课程的代码放进去,之后:

代码语言:javascript
复制
git init # 初始化仓库
git add learn_tensorflow/ # 添加文件
git commit -m "tf" # 提交修改
git remote add origin git@github.com:FishSeeker/TensorFlow.git # 和远程仓库连接
git push -u origin master # 将修改push到远程仓库

最后,欢迎大家follow我呀哈哈哈~快来看我的github啊

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017年05月15日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Classification
  • Dropout
  • CNN
  • saver
  • RNN
  • 写在最后
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档