TensorFlow实现神经网络入门篇

更多深度文章,请关注云计算频道:https://yq.aliyun.com/cloud



如果你一直关注数据科学/机器学习,你就不能错过深度学习和神经网络的热潮。互联网公司正在寻找这方面的人,而且从竞赛到开源项目,都有巨额奖金。 

如果你对深度学习所提供的前景感到兴奋,但是还没有开始,在这里或许是你开始的第一步。 

在这篇文章中,我将介绍TensorFlow。阅读本文后,你将能够理解神经网络的应用,并使用TensorFlow解决现实生活中的问题,本文中的代码是用Python编写的,Python最近的火爆也和深度学习有关。

1:何时使用神经网络? 

有关神经网络和深度学习的更详细的解释, 请看这里。其“更深”版本正在图像识别,语音和自然语言处理等诸多领域取得巨大突破。

现在的主要问题是何时使用神经网络?关于这点,你必须记住一些事情:

1.1:神经网络需要大量的信息数据来训练。将神经网络想象成一个孩子。它首先观察父母如何走路。然后它才会独立行走,并且每走一步,孩子都会学习如何执行特定的任务。如果你不让它走,它可能永远不会学习如何走路。你可以提供给孩子的“数据”越多,效果就越好。

1.2:当你有适当类型的神经网络来解决问题时 每个问题都有自己的难点。数据决定了你解决问题的方式。例如,如果问题是序列生成,递归神经网络更适合,而如果它是一个图像相关的问题,你可能会采取卷积神经网络。

1.3:硬件要求对于运行深度神经网络模型是至关重要的。神经网络很早以前就被“发现”了,但是近年来,神经网络一直在发光,这是因为计算能力的强大。如果你想用这些网络解决现实生活中的问题,准备购买一些高性能硬件吧!

2:如何解决神经网络问题?

神经网络是一种特殊类型的机器学习(ML)算法。因此,与每个ML算法一样,它遵循数据预处理,模型构建和模型评估等常规ML工作流程。我列出了一个如何处理神经网络问题的待办事项清单。

1.检查神经网络是否可以提升传统算法。

2.做一个调查,哪个神经网络架构最适合即将解决的问题。

3.通过你选择的语言/库来定义神经网络架构。

4.将数据转换为正确的格式,并将其分成批。

5.根据你的需要预处理数据。

6.增加数据以增加规模并制作更好的训练模型。

7.将数据批次送入神经网络。

8.训练和监测训练集和验证数据集的变化。

9.测试你的模型,并保存以备将来使用。

本文中,我将重点关注图像数据。让我们先了解一下,然后再研究TensorFlow。

图像大多排列为3D阵列,尺寸指的是高度,宽度和颜色通道。例如,如果你现在截取了你的电脑的屏幕截图,则会首先将其转换为3D数组,然后将其压缩为PNG或JPG文件格式。

虽然这些图像对于人来说是相当容易理解的,但计算机很难理解它们。这种现象被称为语义鸿沟。我们的大脑可以查看图像,并在几秒钟内了解完整的图片。另一方面,计算机将图像视为一组数字。

在早期,人们试图把图像分解成像“模板”这样的“可理解的”格式。例如,一张脸总是有一个特定的结构,这个结构在每个人身上都有所保留,比如眼睛的位置和鼻子,或我们的脸的形状。但是这种方法并不可行,因为当要识别的对象的数量增加时,“模板”就不会成立。

2012年,深度神经网络架构赢得了ImageNet的挑战,这是一个从自然场景中识别物体的重大挑战。

那么人们通常使用哪种库/语言来解决图像识别问题?一个最近的一项调查发现,最流行的深度学习库是Python提供的API,其次是Lua中,Java和Matlab的。最流行的库是:

Caffe

DeepLearning4j

TensorFlow

Theano

Torch

让我们来看看TensorFlow所提供的功能。 什么是TensorFlow?

“TensorFlow是一个使用数据流图进行数值计算的开源软件库。图中的节点表示数学运算,而图边表示在它们之间传递的多维数据阵列(又称张量)。灵活的体系结构允许你使用单个API将计算部署到桌面、服务器或移动设备中的一个或多个CPUGPU


如果你之前曾经使用过numpy,那么了解TensorFlow将会是小菜一碟!numpy和TensorFlow之间的一个主要区别是TensorFlow遵循一个“懒惰”的编程范例。它首先建立所有要完成的操作图形,然后当一个“会话”被调用时,它再“运行”图形。构建一个计算图可以被认为是TensorFlow的主要成分。要了解更多关于计算图的数学构成,请阅读这篇文章

TensorFlow不仅仅是一个强大的神经网络库。它可以让你在其上构建其他机器学习算法,如决策树或k最近邻。

使用TensorFlow的优点是:

1.它有一个直观的结构,因为顾名思义,它有一个“张量流”。 你可以很容易地看到图的每一个部分。

2.轻松地在CPU / GPU上进行分布式计算

3.平台灵活性。你可以在任何地方运行模型,无论是在移动设备,服务器还是PC上。

3.典型的“张量流”

每个库都有自己的“实施细节”,即按照其编码模式编写的一种方法。例如,在执行scikit-learn时,首先创建所需算法的对象,然后在训练集上构建一个模型,并对测试集进行预测。例如:

# define hyperparamters of ML algorithm
clf = svm.SVC(gamma=0.001, C=100.)
# train
clf.fit(X, y)
# test
clf.predict(X_test)

正如我刚才所说,TensorFlow遵循一个“懒惰”的方法。

在TensorFlow中运行程序的通常工作流程如下所示:

1.建立一个计算图。这可以是TensorFlow支持的任何数学操作。

2.初始化变量。

3.创建会话。

4.在会话中运行图形。 

5.关闭会话

接下来,让我们写一个小程序来添加两个数字!

# import tensorflow
import tensorflow as tf
# build computational graph
a = tf.placeholder(tf.int16)
b = tf.placeholder(tf.int16)
addition = tf.add(a, b)
# initialize variables
init = tf.initialize_all_variables()
# create session and run the graph
with tf.Session() as sess:
    sess.run(init)
    print "Addition: %i" % sess.run(addition, feed_dict={a: 2, b: 3})
# close session
sess.close()

4.在TensorFlow中实现神经网络

注意:我们可以使用不同的神经网络体系结构来解决这个问题,但是为了简单起见,我们需要实现前馈多层感知器。

神经网络的常见的实现如下:

1.定义要编译的神经网络体系结构。

2.将数据传输到你的模型。

3.将数据首先分成批次,然后进行预处理。

4.然后将其加入神经网络进行训练。

5.显示特定的时间步数的准确度。

6.训练结束后保存模型以供将来使用。

7.在新数据上测试模型并检查其执行情况。

我们的问题是识别来自给定的28x28图像的数字。我们有一部分图像用于训练,剩下的则用于测试我们的模型。所以首先下载数据集,数据集包含数据集中所有图像的压缩文件:train.csvtest.csv。数据集中不提供任何附加功能,只是以“.png”格式的原始图像。

我们将使用TensorFlow来建立一个神经网络模型。所以你应该先在你的系统中安装TensorFlow。 根据你的系统规格,请参阅官方安装指南进行安装。

我们将按照上述模板进行操作。用Python 2.7内核创建一个Jupyter笔记本,并按照下面的步骤。

导入所有必需的模块:

%pylab inline
import os
import numpy as np
import pandas as pd
from scipy.misc import imread
from sklearn.metrics import accuracy_score
import tensorflow as tf

设置初始值,以便我们可以控制模型的随机性:

# To stop potential randomness
seed = 128
rng = np.random.RandomState(seed)

第一步是设置保管目录路径:

root_dir = os.path.abspath('../..')
data_dir = os.path.join(root_dir, 'data')
sub_dir = os.path.join(root_dir, 'sub')
# check for existence
os.path.exists(root_dir)
os.path.exists(data_dir)
os.path.exists(sub_dir)

让我们看看数据集。这些格式为CSV格式,并且具有相应标签的文件名:

train = pd.read_csv(os.path.join(data_dir, 'Train', 'train.csv'))
test = pd.read_csv(os.path.join(data_dir, 'Test.csv'))
sample_submission = pd.read_csv(os.path.join(data_dir, 'Sample_Submission.csv'))
train.head()

让我们看看我们的数据是什么样的!

img_name = rng.choice(train.filename)
filepath = os.path.join(data_dir, 'Train', 'Images', 'train', img_name)
img = imread(filepath, flatten=True)
pylab.imshow(img, cmap='gray')
pylab.axis('off')
pylab.show()

上面的图像表示为numpy数组,如下所示:

为了更简单的数据处理,让我们将所有的图像存储为numpy数组:

temp = []
for img_name in train.filename:
    image_path = os.path.join(data_dir, 'Train', 'Images', 'train', img_name)
    img = imread(image_path, flatten=True)
    img = img.astype('float32')
    temp.append(img)
train_x = np.stack(temp)
temp = []
for img_name in test.filename:
    image_path = os.path.join(data_dir, 'Train', 'Images', 'test', img_name)
    img = imread(image_path, flatten=True)
    img = img.astype('float32')
    temp.append(img)
test_x = np.stack(temp)

由于这是一个典型的ML问题,为了测试我们模型的正确功能,我们创建了一个验证集。

split_size = int(train_x.shape[0]*0.7)
train_x, val_x = train_x[:split_size], train_x[split_size:]
train_y, val_y = train.label.values[:split_size], train.label.values[split_size:]

现在,我们定义一些辅助函数,我们稍后使用它:

def dense_to_one_hot(labels_dense, num_classes=10):
    """Convert class labels from scalars to one-hot vectors"""
    num_labels = labels_dense.shape[0]
    index_offset = np.arange(num_labels) * num_classes
    labels_one_hot = np.zeros((num_labels, num_classes))
    labels_one_hot.flat[index_offset + labels_dense.ravel()] = 1
    return labels_one_hot
def preproc(unclean_batch_x):
    """Convert values to range 0-1"""
    temp_batch = unclean_batch_x / unclean_batch_x.max()
    return temp_batch
def batch_creator(batch_size, dataset_length, dataset_name):
    """Create batch with random samples and return appropriate format"""
    batch_mask = rng.choice(dataset_length, batch_size)
    batch_x = eval(dataset_name + '_x')[[batch_mask]].reshape(-1, input_num_units)
    batch_x = preproc(batch_x)
    if dataset_name == 'train':
        batch_y = eval(dataset_name).ix[batch_mask, 'label'].values
        batch_y = dense_to_one_hot(batch_y)
    return batch_x, batch_y

我们来定义我们的神经网络架构。我们定义了一个三层神经网络:输入,隐藏和输出。输入和输出中神经元的数量是固定的,因为输入的是28x28图像,输出的是10x1向量。我们隐藏层中有500个神经元。这个数字可以根据你的需要而有所不同。阅读文章以获得完整的代码,并深入了解它的工作原理

本文由阿里云组织翻译。

文章原标题《An Introduction to
Implementing Neural Networks Using TensorFlow》

作者:Faizan
Shaikh
  数据科学家  印度人  译者:虎说八道

文章为简译,更为详细的内容,请查看原文

时间: 2025-01-19 10:02:54

TensorFlow实现神经网络入门篇的相关文章

(转)一文学会用 Tensorflow 搭建神经网络

  一文学会用 Tensorflow 搭建神经网络   本文转自:http://www.jianshu.com/p/e112012a4b2d 字数2259 阅读3168 评论8 喜欢11 cs224d-Day 6: 快速入门 Tensorflow 本文是学习这个视频课程系列的笔记,课程链接是 youtube 上的,讲的很好,浅显易懂,入门首选, 而且在github有代码,想看视频的也可以去他的优酷里的频道找. Tensorflow 官网 神经网络是一种数学模型,是存在于计算机的神经系统,由大量的

人工神经网络入门(3) —— 多层人工神经网络应用示例

1 介绍 求异或(XOR)操作是计算机中常用到的一种计算: 0 XOR 0 = 0 0 XOR 1 = 1 1 XOR 0 = 1 1 XOR 1 = 0 我们可以使用第一篇文章中的代码来计算这个结果http://files.cnblogs.com/gpcuster/ANN1.rar( 需要修改其中的训练集),可以发现学习后的结果不能让我们满意,原因是单层神经网络学习能力有限 ,需要使用更加复杂的网络来学习. 在这一篇文章中,我们将使用一个新的多层神经网络来学习. 2 范例程序的使用和说明 该程

(转) 深度学习全网最全学习资料汇总之入门篇

  本文转自: http://www.dlworld.cn/ZiLiaoXiaZai/3428.html 深度学习全网最全学习资料汇总之入门篇  作为人工智能领域一个重要的研究分支,深度学习技术几乎出现在当下所有热门的AI应用领域,包括语音识别,语义理解,图像识别,大数据分析等等,甚至有人把当前的人工智能等同于深度学习.面对如此重要的江湖地位,我们相信一定有为数众多的 AI 开发者对深度学习技术充满了好奇心,想要快速着手使用这项强大的技术来解决现实生活中的实际问题.因此,雷锋网将围绕深度学习技术

ASP漏洞全接触-入门篇

随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多.但是由于这个行业的入门门槛不高,程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患.用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入. SQL注入是从正常的WWW端口访问,而且表面看起来跟一般的Web页面访问没什么区别,所以目前市面的防火墙都不会对SQL注入发出警报,如果

扩展你的PHP之入门篇

1. 扩展你的php2. 扩展的3种方式3. extension dll方式的扩展4. 小结 首先注意, 以下所有的一切皆在win下进行, 使用的工具的vc++6.0.扩展你的PHPPHP以方便快速的风格迅速在web系统开发中占有了重要地位. PHP本身提供了丰富的大量的函数及功能. 长话短说. 我们看看我们如何进行扩展. 扩展的3种方式External ModulesBuilt-in ModulesThe Zend Engine3种方式的优缺点可参见PHP手册.http://www.php.n

Flash动画基础教程①入门篇

flash动画|基础教程 這個教程是本人的一些經驗之談,為了初學者的入門教程,未經本人許可請勿轉載!謝謝 Flash动画基础教程--入门篇①首先我们来说说什么是Flash? Flash是Macromedia公司出品的软件,对于Flash是什么很多的描述,大致是"交互性矢量多媒体制作软件"的意思!首先,它是一种多媒体制作软件,Flash的产品往往都是一些"有声有色"给人视觉冲击的动画.其次,Flash是以矢量图为基础的,矢量图最大的特点就是它能无限的缩放,不会因为图像

.NET Remoting程序开发入门篇

程序 一.Remoting基础 什么是Remoting,简而言之,我们可以将其看作是一种分布式处理方式.从微软的产品角度来看,可以说Remoting就是DCOM的一种升级,它改善了很多功能,并极好的融合到.Net平台下.Microsoft? .NET Remoting 提供了一种允许对象通过应用程序域与另一对象进行交互的框架.这也正是我们使用Remoting的原因.为什么呢?在Windows操作系统中,是将应用程序分离为单独的进程.这个进程形成了应用程序代码和数据周围的一道边界.如果不采用进程间

【IPFS + 区块链 系列】 入门篇 - IPFS+IPNS+个人博客搭建

孔壹学院:国内区块链职业教育引领品牌. 作者:黎跃春,孔壹学院创始人,区块链.高可用架构师 微信:liyc1215 区块链博客:http://liyuechun.org 在阅读这篇文章之前,你需要先学习[IPFS + 区块链 系列] 入门篇 - IPFS环境配置这篇文章. 目录 1. 如何在IPFS新增一个文件 1.1 新建file.txt文件 1.2 查看ipfs相关命令 1.3 将file.txt添加到ipfs节点 2. 通过ipfs创建目录存储文件 3. 如何在IPFS新增一个目录 3.1

【IPFS + 区块链 系列】 入门篇 - IPFS + Ethereum (上篇)-js-ipfs-api

孔壹学院:国内区块链职业教育引领品牌. 作者:黎跃春,孔壹学院创始人,区块链.高可用架构师 微信:liyc1215 区块链博客:http://liyuechun.org Ebay项目 基于以太坊Ethereum & IPFS的去中心化Ebay区块链项目详情链接 目录 1. 内容简介 2. IPFS-HTTP效果图 3. 实现步骤 3.1 安装create-react-app 3.2 React项目创建 3.3 运行React项目 3.4 浏览项目 3.5 安装ipfs-api 3.6 完成UI逻