机器学习(四)

tensorflow+python

上一篇文章用了一个简单的例子说明了一下机器学习的基本实现方式。我们可以看到,机器学习过程中,会用到很多矩阵运算,还会用到一些数学算法和公式,例如梯度下降算法、激励函数等。如果这些算法让我们自己去实现,将会十分困难。还好,Google意识到了这是一个有难度但是重复性的劳动。推出了一款开源的机器学习开发框架tensorflow(类似的框架还有Theano、Lasagne、Blocks、MXNet...,没用过),它跟python是一对完美的搭档(虽然它也支持C++)。python就不多讲了,它是当前很流行的一款主流语言。这篇文章稍微聊聊tensorflow。看看它提供了那些常用的功能。tensorflow的详细使用方法介绍见官网http://www.tensorfly.cn/

tensorflow的几个概念:
  • tensor
  • graph
  • seesion
tensorflow的几个特点:
  • 使用图 (graph) 来表示计算任务.
  • 在被称之为 会话 (Session) 的上下文 (context) 中执行图.
  • 使用 tensor 表示数据.
  • 通过 变量 (Variable) 维护状态.
  • 使用 feed 和 fetch 可以为任意的操作(arbitrary operation) 赋值或者从其中获取数据。
代码示例(实现向量相减):
import tensorflow as tf
# 变量(同时也是一个tensor)
x = tf.Variable([1.0, 2.0])
# 常量(同时也是一个tensor)
a = tf.constant([3.0, 3.0])

# 定义初始化变量的一个操作(OP)
init = tf.initialize_all_variables()
# 定义一个减法的操作(OP)
sub = tf.sub(x, a)

上面就是利用tensorOP定义了一个计算图Graph,这个计算图类似于C语言等中的变量和函数的声明和定义,没有真正的执行。

通过下面这段代码,在会话(Session)中,才能真正的执行上面的计算图。

# 在Session中启动计算图(Graph).
sess = tf.Session()

# 执行计算图中的操作(OP),限制性初始化变量的init,在执行减法sub
sess.run(init)
sess.run(sub)

# 任务完成, 关闭Session.
sess.close()

执行结果:
[-2. -1.]

上面这段是很简单的一个程序,旨在说明tensorflow的基本组成要素和运行方法。真正机器学习中,用到的计算图要远远比上面的程序复杂。


下面给出一段使用了神经网络的程序,有兴趣的可以看看。

# 从文件中读入训练数据集
import input_data
mnist = input_data.read_data_sets('MNIST_data', one_hot=True)

# 定义将要输入的x和期望输出的y,这里只是两个占位符,这类似与两个变量,需要在训练的时候输入真实的值。
x = tf.placeholder("float", shape=[None, 784])
y_ = tf.placeholder("float", shape=[None, 10])

# 我们定义两个函数用于变量初始化
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)

# 定义卷积OP
def conv2d(x, W):
  return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME')

# 定义池化OP
def max_pool_2x2(x):
  return tf.nn.max_pool(x, ksize=[1, 2, 2, 1],
                        strides=[1, 2, 2, 1], padding='SAME')

# 定义第一层卷积的权值和偏置
W_conv1 = weight_variable([5, 5, 1, 32])
b_conv1 = bias_variable([32])

# 对长度为784的一维的x做个变形,这里是变成28x28的矩阵,这个是原始图像的尺寸。
x_image = tf.reshape(x, [-1,28,28,1])

# 经过Relu激活函数,然后进行池化。
h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)
# 经过这个池化后,图像尺寸变为原来的一半,即14×14
h_pool1 = max_pool_2x2(h_conv1)

# 将Relu函数的输出,再经过一层卷积神经网络,用法与第一层卷积神经网络类似。
W_conv2 = weight_variable([5, 5, 32, 64])
b_conv2 = bias_variable([64])

h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2)
# 经过这个赤化后,图像尺寸再减小一半,即7×7
h_pool2 = max_pool_2x2(h_conv2)

# 现在,图片尺寸减小到7x7,我们加入一个有1024个神经元的全连接层,用于处理整个图片。我们把池化层输出的张量reshape成一维向量,乘上权重矩阵,加上偏置,然后对其使用ReLU。
W_fc1 = weight_variable([7 * 7 * 64, 1024])
b_fc1 = bias_variable([1024])

h_pool2_flat = tf.reshape(h_pool2, [-1, 7*7*64])
h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1)

# 最后加入一个softmax层
W_fc2 = weight_variable([1024, 10])
b_fc2 = bias_variable([10])

y_conv=tf.nn.softmax(tf.matmul(h_fc1, W_fc2) + b_fc2)

# 创建Session,开始训练
cross_entropy = -tf.reduce_sum(y_*tf.log(y_conv))
train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)
correct_prediction = tf.equal(tf.argmax(y_conv,1), tf.argmax(y_,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
with tf.Session() as sess:
    sess.run(tf.initialize_all_variables())
    for i in range(20000):
      batch = mnist.train.next_batch(50)
      if i%100 == 0:
        train_accuracy = accuracy.eval(feed_dict={
            x:batch[0], y_: batch[1]})
        print "step %d, training accuracy %g"%(i, train_accuracy)
      train_step.run(feed_dict={x: batch[0], y_: batch[1]})

    print "test accuracy %g"%accuracy.eval(feed_dict={
        x: mnist.test.images, y_: mnist.test.labels})

sweet tip: 上面这段程序是经典的手写数字识别,tensorflow官网上有相应的程序和介绍。代码实现见https://github.com/goinghlf/mnist-with-tensorflow

机器学习(三)
机器学习(五)

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

推荐阅读更多精彩内容