tensorflow-1

outline

`安装环境

`tensorflow原理简述

`定义网络结构、启动网络计算

`使用Variable定义模型参数,如何训练模型

`如何测试

只是自己的简要概括,最好对神经网络、机器学习略有了解。tensorflow的中文文档新手入门真的做的还不错,建议大家结合理论,码一码代码,上手很快的。

`安装环境

ubuntu 16.04,pycharm IDE、python 2.7

pycharm有教育账户的,学生可以免费使用。IDE集成了terminal、python console,还能调试,真的好用。另外集成了virtual environment,可以切换使用python2.7、python3.x,有兴趣的可以了解一下

#note

使用virtual environment的方法

file-new project-选择解释器的边上有个设置可以创建虚拟环境,选择相应的解释器就能创建,另外在这个project中的terminal会默认使用这个虚拟环境,形如:

(tensorflow) ceo1207@ceo1207:

安装tensorflow

pip install https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.5.0-cp27-none-linux_x86_64.whl

另外装jupyter(就是常说的python notebook)体验也很好,可以像python console中一样交互式的编程,还能保存代码

apt-get install python-dev

python -m pip install jupyter

使用时,输入 jupyter notebook 即可在浏览器中使用python

`tensorflow原理简述

(看不懂不要紧,看完下面的再来看一遍就会了)网络结构使用Graph表示,Graph由operation(节点)组成,op接受输入产生输出,输入输出使用张量(tensor)表示,所以这个框架叫tensorflow,张量数据的流动的意思。

定义graph不会产生计算,真正的计算使用Session(会话)驱动,可以使用会话传入数据,获取输入以及训练和测试网络。

#note:计算优化

为了用python实现高效的数值计算,我们通常会使用函数库,比如NumPy,会把类似矩阵乘法这样的复杂运算使用其他外部语言实现。不幸的是,从外部计算切换回Python的每一个操作,仍然是一个很大的开销。如果你用GPU来进行外部计算,这样的开销会更大。用分布式的计算方式,也会花费更多的资源用来传输数据。

TensorFlow也把复杂的计算放在python之外完成,但是为了避免前面说的那些开销,它做了进一步完善。Tensorflow不单独地运行单一的复杂计算,而是让我们可以先用图描述一系列可交互的计算操作,然后全部一起在Python之外运行。

`定义网络结构、启动网络计算

graph定义网络结构,添加节点(计算单元)。但是graph只是定义结构和数据,真正的计算需要会话启动。

节点构造器,接收输入tensor,返回op的输出。最简单的是常量节点,可以作为整个网络的输入。也可以是一些计算操作,比如矩阵相加、相乘。直接上代码,看看就明白了。

import numpy as np

import tensorflow as tf

# define input, create operation, result(tensor) return

input1 = tf.constant(3)

input2 = tf.constant(2)

input3 = tf.constant(5)

# define operations

add = tf.add(input3,input2)

mul = tf.mul(input1,add)

with tf.Session() as sess:

    # use the default graph

    result = sess.run([mul,add])

    print result

输入也可以使用占位符,用于在会话时,灵活的添加自定义的输入。

import numpy as np

import tensorflow as tf

input1 = tf.placeholder(tf.types.float32)

input2 = tf.placeholder(tf.types.float32)

mul = tf.mul(input1, input2)

data1 = [1,2,3]

data2 = [2,4,6]

with tf.Session() as sess:

    print sess.run([mul], feed_dict={input1:data1,input2:data2})

关于数据的fetch和feed,上面两段代码都用到了其实。

Fetch,使用run获取

with tf.Session():

  result = sess.run([mul, intermed])

  print result

需要获取的多个 tensor 值,在 op 的一次运行中一起获得(而不是逐个去获取 tensor)

feed,在会话中插入数据,使用placeholder

import numpy as np

import tensorflow as tf

input1 = tf.placeholder(tf.types.float32)

input2 = tf.placeholder(tf.types.float32)

mul = tf.mul(input1, input2)

data1 = [1,2,3]

data2 = [2,4,6]

with tf.Session() as sess:

    print sess.run([mul], feed_dict={input1:data1,input2:data2})

`使用Variable定义模型参数、如何训练模型

到这一步,请你确保具备以下能力,给你具体的公式和输入,可以使用tensorflow,控制数据的输入,利用会话驱动运算获得最后的输出,甚至是任意中间步骤的结果。

但是常用的神经网络、机器学习的模型都是有模型参数的,模型参数是需要训练的。参数如何输入?当然我们可以把它们当做是另外的输入(使用占位符),但TensorFlow有一个更好的方法来表示它们:Variable。

Variable你可以理解为一个可变的tensor,事后,框架会根据你设置的训练方法自动更新他的值。

#note:

模型的多种输入:常量、占位符、Variable

有了可变的tensor(Variable),如何训练他们?

看懂下面的部分,先了解一下什么是softmax regression

如下,regression解决的是分类问题,对于多分类问题,使用softmax层得到归一化的多分类的概率分布。

概率分布:(这个词,其实不容易解释)多分类问题下,一个随机事件,在各个分类上的概率分布,就是所谓的概率分布。概率分布的特点,各个分类的概率之和为1.

好吧,不了解你就硬着头皮往下看吧,没什么关系。

首先定义优化的目标,即确定loss function。

多分类问题采用交叉熵作为loss,形如:

cross_entropy = -tf.reduce_sum(y_*tf.log(y))

再确定优化的方法,可以使用常用的梯度下降方法

train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)

设置步长为0.01,优化目标是cross_entropy

好了,可以看mnist的实战代码了,可以在tensorflow github上看,这里贴一下

"""A very simple MNIST classifier.

See extensive documentation at

https://www.tensorflow.org/get_started/mnist/beginners

"""

from __future__ import absolute_import

from __future__ import division

from __future__ import print_function

import argparse

import sys

from tensorflow.examples.tutorials.mnist import input_data

import tensorflow as tf

FLAGS = None

def main(_):

  # Import data

  mnist = input_data.read_data_sets(FLAGS.data_dir)

  # Create the model

  x = tf.placeholder(tf.float32, [None, 784])

  W = tf.Variable(tf.zeros([784, 10]))

  b = tf.Variable(tf.zeros([10]))

  y = tf.matmul(x, W) + b

  # Define loss and optimizer

  y_ = tf.placeholder(tf.int64, [None])

  # The raw formulation of cross-entropy,

  #

  #  tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(tf.nn.softmax(y)),

  #                                reduction_indices=[1]))

  #

  # can be numerically unstable.

  #

  # So here we use tf.losses.sparse_softmax_cross_entropy on the raw

  # outputs of 'y', and then average across the batch.

  cross_entropy = tf.losses.sparse_softmax_cross_entropy(labels=y_, logits=y)

  train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)

  sess = tf.InteractiveSession()

  tf.global_variables_initializer().run()

  # Train

  for _ in range(1000):

    batch_xs, batch_ys = mnist.train.next_batch(100)

    sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})

  # Test trained model

  correct_prediction = tf.equal(tf.argmax(y, 1), y_)

  accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

  print(sess.run(

      accuracy, feed_dict={

          x: mnist.test.images,

          y_: mnist.test.labels

      }))

if __name__ == '__main__':

  parser = argparse.ArgumentParser()

  parser.add_argument(

      '--data_dir',

      type=str,

      default='/tmp/tensorflow/mnist/input_data',

      help='Directory for storing input data')

  FLAGS, unparsed = parser.parse_known_args()

  tf.app.run(main=main, argv=[sys.argv[0]] + unparsed)

`如何测试

最后说一下如何测试,其实上面的代码以及中文文档里已经说的蛮好了。

好吧,下一篇,深入mnist(读作m-nist),明儿见

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

推荐阅读更多精彩内容