tensorflow入门 (一)

转载:作者:地球的外星人君
链接:https://www.zhihu.com/question/49909565/answer/207609620
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

分享一篇文章面向普通开发者的机器学习入门,作者@狸小华

前言

最近在摸索这方面相关的知识,本着整理巩固,分享促进的精神。所以有了这篇博文。

需要注意的是,本文受众:对机器学习感兴趣,且愿意花点时间学习的应用(业务)程序员

我本意是尽量简单,易于理解,快速上手,短时间能跑出来东西,这样子才能正向激励我们的学习欲望。

基于上述条件,需要你已经有一定的开发经验,微不足道的数学能力,以及善用搜索引擎的觉悟。开发环境搭建

开发环境搭建

首先,我希望你是Linux系用户,如果你是巨硬党,装一个VirtualBox吧,然后再装个ubuntu,由于我们只是入个门,对性能要求不高的。

机器学习相关的框架也很多,我这里选择了Keras,后端采用的Tensorflow 。那么理所当然的,会用到python来开发,没有python经验也莫慌,影响并不大。

1.ubuntu自带python 我就不介绍怎么安装了吧?

先安装pip(-dev
我用的python2.7,后文统一)打开你的终端,输入这个:(我建议更换下apt-get为国内镜像,安装完pip后也更换为国内镜像吧)

sudo apt-get install python-pip python

2.安装tensorflow和keras,matplotlib

还是打开终端,输入输入

mac端:

source activate ml_env27

>>conda install -c menpo menpoproject>>pip install --upgrade tensorflow (use tensorflow-gpu if you want GPU support)>>pip install -Iv keras==1.2.2 (make sure you install version 1.2.2)>>conda install scikit-image h5py bidict psutil imageio安装好依赖环境

python 测试

Python

import tensorflow as tf
hello = tf.constant(‘Hello, TensorFlow!‘)
sess = tf.Session()
print(sess.run(hello))

exit()

3.以后就用anconda配置好的环境配合pycharm来进行试验。

一些理论知识:

卷积神经网络CNN浅析

我建议你先把CNN当作一个黑盒子,不要关心为什么,只关心结果。

这里借用了一个分辨X和o的例子来这里看原文,就是每次给你一张图,你需要判断它是否含有"X"或者"O"。并且假设必须两者选其一,不是"X"就是"O"。

下面看一下CNN是怎么分辨输入的图像是x还是o,如果需要你来编程分辨图像是x还是o,你会怎么做?

可能你第一时间就想到了逐个像素点对比。但是,如果图片稍微有点变化呢?像是下面这个x,它不是标准的x,我们可以分辨它是x,

但是对于计算机而言,它就只是一个二维矩阵,逐个像素点对比肯定是不行的。

CNN就是用于解决这类问题的,它不在意具体每个点的像素,而是通过一种叫卷积的手段,去提取图片的特征。

什么是特征?
特征就是我们用于区分两种输入是不是同一类的分辨点,像是这个XXOO的例子,如果要你描述X和O的区别,你会怎么思考?X是两条线交叉,O是封闭的中空的。。。

我们来看个小小的例子,如果下面两张图,需要分类出喜欢和不喜欢两类,那么你会提取什么作为区分的特征?(手动滑稽)

卷积层

所以对于CNN而言,第一步就是提取特征,卷积就是提取猜测特征的神奇手段。而我们不需要指定特征,任凭它自己去猜测,就像上图,

我们只需要告诉它,我们喜欢左边的,不喜欢右边的,然后它就去猜测,区分喜不喜欢的特征是黑丝,还是奶子呢?

假设,我们上面这个例子,CNN对于X的猜测特征如上,现在要通过这些特征来分类。

计算机对于图像的认知是在矩阵上的,每一张图片有rgb二维矩阵(不考虑透明度)所以,一张图片,

应该是3x高度x宽度的矩阵。而我们这个例子就只有黑白,所以可以简单标记1为白,-1为黑。是个9x9的二维矩阵。

我们把上面的三个特征作为卷积核(我们这里是假设已经训练好了CNN,训练提出的特征就是上面三个,我们可以通过这三个特征去分类 X ),去和输入的图像做卷积(特征的匹配)。

看完上面的,估计你也能看出特征是如何去匹配输入的,这就是一个卷积的过程,具体的卷积计算过程如下(只展示部分):

把计算出的结果填入新的矩阵

其他部分也是相同的计算

最后,我们整张图用卷积核计算完成后:

三个特征都计算完成后:

不断地重复着上述过程,将卷积核(特征)和图中每一块进行卷积操作。最后我们会得到一个新的二维数组。

其中的值,越接近为1表示对应位置的匹配度高,越是接近-1,表示对应位置与特征的反面更匹配,而值接近0的表示对应位置没有什么关联。

以上就是我们的卷积层,通过特征卷积,输出一个新的矩阵给下一层。

池化层

在图像经过以上的卷积层后,得到了一个新的矩阵,而矩阵的大小,则取决于卷积核的大小,和边缘的填充方式,总之,在这个XXOO的例子中,我们得到了7x7的矩阵。池化就是缩减图像尺寸和像素关联性的操作,只保留我们感兴趣(对于分类有意义)的信息。

常用的就是2x2的最大池。

看完上面的图,你应该知道池化是什么操作了。

通常情况下,我们使用的都是2x2的最大池,就是在2x2的范围内,取最大值。因为最大池化(max-pooling)保留了每一个小块内的最大值,所以它相当于保留了这一块最佳的匹配结果(因为值越接近1表示匹配越好)。这也就意味着它不会具体关注窗口内到底是哪一个地方匹配了,而只关注是不是有某个地方匹配上了。

这也就能够看出,CNN能够发现图像中是否具有某种特征,而不用在意到底在哪里具有这种特征。这也就能够帮助解决之前提到的计算机逐一像素匹配的死板做法。

同样的操作以后,我们就输出了3个4x4的矩阵。

全连接层

全连接层一般是为了展平数据,输出最终分类结果前的归一化。 我们把上面得到的4x4矩阵再卷积+池化,得到2x2的矩阵

全连接就是这样子,展开数据,形成1xn的‘条‘型矩阵。

然后再把全连接层连接到输出层。之前我们就说过,这里的数值,越接近1表示关联度越大,然后我们根据这些关联度,分辨到底是O还是X.

看上图(圈圈里面的几个关键信息点),这里有个新的图像丢进我们的CNN了,根据卷积>池化>卷积>池化>全连接的步骤,我们得到了新的全连接数据,然后去跟我们的标准比对,得出相似度,可以看到,相似度是X的为0.92 所以,我们认为这个输入是X。

一个基本的卷积神经网络就是这样子的。回顾一下,它的结构:

Relu是常用的激活函数,所做的工作就是max(0,x),就是输入大于零,原样输出,小于零输出零,这里就不展开了。

CNN实现手写数字识别

感觉,这个mnist的手写数字,跟其他语言的helloworld一样了。我们这里来简单实现下。首先,我建议你先下载好数据集,keras的下载太慢了(下载地址)。

下载好以后,按下面的位置放,你可能要先运行下程序,让他自己创建文件夹,不然,你就手动创建吧。

新建个python文件,test.py然后输入下面的内容

#coding: utf-8 from keras.datasets import mnist
import matplotlib.pyplot as plt
# 加载数据
(X_train, y_train), (X_test, y_test) = mnist.load_data()
# 展示下第一张图
plt.imshow(X_train[0], cmap=plt.get_cmap(‘PuBuGn_r‘))
plt.show()

运行后出来张图片,然后关掉就行,这里只是看看我们加载数据有没有问题。

x_train,x_test是我们的图像矩阵数据,是28x28大小,然后有12500条吧好像。然后y_train,y_test都是标签数据,标明这张图代表是数字几。

#coding: utf-8 #Simple CNN import numpy
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Dropout
from keras.layers import Flatten
from keras.layers.convolutional import Conv2D
from keras.layers.convolutional import MaxPooling2D
from keras.utils import np_utils

seed = 7
numpy.random.seed(seed)

#加载数据
(X_train, y_train), (X_test, y_test) = mnist.load_data()
# reshape to be [samples][channels][width][height] X_train = X_train.reshape(X_train.shape[0],28, 28,1).astype(‘float32‘)
X_test = X_test.reshape(X_test.shape[0],28, 28,1).astype(‘float32‘)

# normalize inputs from 0-255 to 0-1 X_train = X_train / 255 X_test = X_test / 255 # one hot encode outputs y_train = np_utils.to_categorical(y_train)
y_test = np_utils.to_categorical(y_test)
num_classes = y_test.shape[1]

# 简单的CNN模型
def baseline_model():
    # create model model = Sequential()
    #卷积层
    model.add(Conv2D(32, (3, 3), padding=‘valid‘, input_shape=(28, 28,1), activation=‘relu‘)) #池化层
    model.add(MaxPooling2D(pool_size=(2, 2)))
    #卷积
    model.add(Conv2D(15, (3, 3), padding=‘valid‘ ,activation=‘relu‘)) #池化
    model.add(MaxPooling2D(pool_size=(2, 2)))
    #全连接,然后输出
    model.add(Flatten())
    model.add(Dense(128, activation=‘relu‘))
    model.add(Dense(num_classes, activation=‘softmax‘)) # Compile model
    model.compile(loss=‘categorical_crossentropy‘, optimizer=‘adam‘, metrics=[‘accuracy‘])
    return model

# build the model model = baseline_model()

# Fit the model
model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=10, batch_size=128, verbose=2)

代码也挺简单,因为keras也是封装的挺好的了。基本你看懂了前面的就没问题。

Epoch 1/10 3s - loss: 0.2791 - acc: 0.9203 - val_loss: 0.1420 - val_acc: 0.9579
Epoch 2/10 3s - loss: 0.1122 - acc: 0.9679 - val_loss: 0.0992 - val_acc: 0.9699
Epoch 3/10 3s - loss: 0.0724 - acc: 0.9790 - val_loss: 0.0784 - val_acc: 0.9745
Epoch 4/10 3s - loss: 0.0509 - acc: 0.9853 - val_loss: 0.0774 - val_acc: 0.9773
Epoch 5/10 3s - loss: 0.0366 - acc: 0.9898 - val_loss: 0.0626 - val_acc: 0.9794
Epoch 6/10 3s - loss: 0.0265 - acc: 0.9930 - val_loss: 0.0639 - val_acc: 0.9797
Epoch 7/10 3s - loss: 0.0185 - acc: 0.9956 - val_loss: 0.0611 - val_acc: 0.9811
Epoch 8/10 3s - loss: 0.0150 - acc: 0.9967 - val_loss: 0.0616 - val_acc: 0.9816
Epoch 9/10 4s - loss: 0.0107 - acc: 0.9980 - val_loss: 0.0604 - val_acc: 0.9821
Epoch 10/10 4s - loss: 0.0073 - acc: 0.9988 - val_loss: 0.0611 - val_acc: 0.9819

然后你就能看到这些输出,acc就是准确率了,看后面的val_acc就行。

时间: 2024-10-31 18:44:16

tensorflow入门 (一)的相关文章

TensorFlow 入门之手写识别(MNIST) softmax算法

TensorFlow 入门之手写识别(MNIST) softmax算法 MNIST 卢富毓 softmax回归 softmax回归算法 TensorFlow实现softmax softmax回归算法 我们知道MNIST的每一张图片都表示一个数字,从0到9.我们希望得到给定图片代表每个数字的概率.比如说,我们的模型可能推测一张包含9的图片代表数字9的概率是80%但是判断它是8的概率是5%(因为8和9都有上半部分的小圆),然后给予它代表其他数字的概率更小的值. 这是一个使用softmax回归(sof

转:TensorFlow入门(六) 双端 LSTM 实现序列标注(分词)

http://blog.csdn.net/Jerr__y/article/details/70471066 欢迎转载,但请务必注明原文出处及作者信息. @author: huangyongye @creat_date: 2017-04-19 前言 本例子主要介绍如何使用 TensorFlow 来一步一步构建双端 LSTM 网络(听名字就感觉好腻害的样子),并完成序列标注的问题.先声明一下,本文中采用的方法主要参考了[中文分词系列] 4. 基于双向LSTM的seq2seq字标注这篇文章.该文章用

tensorflow入门教程

1. LSTM 大学之道,在明明德的博客: (译)理解 LSTM 网络 (Understanding LSTM Networks by colah) TensorFlow入门(五)多层 LSTM 通俗易懂版 TensorFlow入门(三)多层 CNNs 实现 mnist分类 另一个博客,写的代码很好: TensorFlow 实现多层 LSTM 的 MNIST 分类 + 可视化 博客:写的很好 用tensorflow搭建RNN(LSTM)进行MNIST 手写数字辨识 博客: Tensorflow

OpenCV+TensorFlow入门人工智能图像处理视频教程 共9章

第1章 课程导学包括课程概述.课程安排.学习前提等方面的介绍,让同学们对计算机视觉有所理解 第2章 计算机视觉入门通过OpenCV以及TensorFlow两个方面介绍计算机入门的相关知识.OpenCV侧重点在于为大家补充图像处理的相关基础,如像素.文件封装格式.灰度等级.颜色通道等的概念.TensorFlow重点在于通过对常量.变量.矩阵等的介绍,学习并掌握TensorFlow的基本使用.... 第3章 计算机视觉加强之几何变换本章节主要为大家介绍图像的几何变换.几何变换顾名思义就是对图片外形轮

统计学习方法:罗杰斯特回归及Tensorflow入门

作者:桂. 时间:2017-04-21  21:11:23 链接:http://www.cnblogs.com/xingshansi/p/6743780.html 前言 看到最近大家都在用Tensorflow,一查才发现火的不行.想着入门看一看,Tensorflow使用手册第一篇是基于MNIST的手写数字识别的,用到softmax regression,而这个恰好与我正在看的<统计信号处理>相关.本文借此梳理一下: 1)罗杰斯特回归 2)Softmax Regression 3)基于Tenso

OpenCV+TensorFlow 入门人工智能图像处理

第1章 课程导学包括课程概述.课程安排.学习前提等方面的介绍,让同学们对计算机视觉有所理解1-1 计算机视觉导学 第2章 计算机视觉入门通过OpenCV以及TensorFlow两个方面介绍计算机入门的相关知识.OpenCV侧重点在于为大家补充图像处理的相关基础,如像素.文件封装格式.灰度等级.颜色通道等的概念.TensorFlow重点在于通过对常量.变量.矩阵等的介绍,学习并掌握TensorFlow的基本使用....2-1 本章介绍2-2 Mac下一站式开发环境anaconda搭建2-3 Win

tensorflow入门(1):构造线性回归模型

今天让我们一起来学习如何用TF实现线性回归模型.所谓线性回归模型就是y = W * x + b的形式的表达式拟合的模型. 我们先假设一条直线为 y = 0.1x + 0.3,即W = 0.1,b = 0.3,然后利用随机数在这条直线附近产生1000个随机点,然后利用tensorflow构造的线性模型去学习,最后对比模型所得的W和b与真实值的差距即可. (某天在浏览Github的时候,发现了一个好东西,Github上有一个比较好的有关tensorflow的Demo合集,有注释有源代码非常适合新手入

Tensorflow入门篇

 参考Tensorflow中文网(http://www.tensorfly.cn/tfdoc/get_started/introduction.html) ,写一个入门. 1.打开pyCharm,新建一个py文件, import tensorflow as tf import numpy as np 2.然后静等pyCharm安装好 tensorflow和numpy 3.然后控制台查看一下,是否装好. import tensorflow as tf tf.__version__ 4.代码copy

【tensorflow:Google】三、tensorflow入门

[一]计算图模型 节点是计算,边是数据流, a = tf.constant( [1., 2.] )定义的是节点,节点有属性 a.graph 取得默认计算图 g1 = tf.get_default_graph() 初始化计算图 g1 = tf.Graph() 设置default图 g1.as_default() 定义变量: tf.get_variable('v') 读取变量也是上述函数 对图指定设备 g.device('/gpu:0') 可以定义集合来管理计算图中的资源, 加入集合 tf.add_