教程 | Tensorflow keras 极简神经网络构建与使用
Tensorflow keras极简神经网络构建教程
Keras介绍
Keras (κέρας) 在希腊语中意为号角,它来自古希腊和拉丁文学中的一个文学形象。发布于2015年,是一套高级API框架,其默认的backend是tensorflow,但是可以支持CNTK、Theano、MXNet作为backend运行。其特点是语法简单,容易上手,提供了大量的实验数据接口与预训练网络接口,最初是谷歌的一位工程师开发的,非常适合快速开发。Tensorflow虽然是非常流行的深度学习框架,但是tensorflow开发需要了解计算图与自动微分相关技术,对于完全没有任何深度学习基础的人不是一个很好的选择,而keras完全是为零基础的人准备,它简化了tensorflow中计算图、会话等基本概念,通过Sequential与功能API两个组件实现网络搭建,通过简单的添加一些层就可以快速搭建神经网络模型。
Mnist数据集准备
我们以mnist数据集为例,构建一个神经网络实现手写数字的训练与测试,首先我们需要认识一下mnist数据集,mnist数据集有6万张手写图像,1万张测试图像。Keras通过datase来下载与使用mnist数据集,下载与读取的代码如下:
mnist = keras.datasets.mnist (train_images, train_labels), (test_images, test_labels) =mnist.load_data()
通过下面的代码可以显示手写数字图像:
print(train_labels[0]) for i in range(25): plt.subplot(5,5,i+1) plt.xticks([]) plt.yticks([ ]) plt.grid(False) plt.imshow(train_images[i], cmap=plt.cm.gray) plt.xlabel(str(train_labels[i])) plt.show()
对数据re-scale到0~1.0之间,对标签进行了one-hot编码,代码如下:
# re-scale to 0~1.0之间 train_images = train_images / 255.0 test_images = test_images / 255.0 train_labels = one_hot(train_labels) test_labels = one_hot(test_labels)
其中one-hot编码函数如下:
def one_hot(labels): onehot_labels = np.zeros(shape=[len(labels), 10]) for i in range(len(labels)): index = labels[i] onehot_labels[i][index] = 1 return onehot_labels
建立模型
构建神经网络
输入层为28x28=784个输入节点
隐藏层120个节点
输出层10个节点
首先需要定义模型:
model = keras.Sequential()
然后按顺序添加模型各层
model.add(keras.layers.Flatten(input_shape=(28, 28))) model.add(keras.layers.Dense(units=120, activation=tf.nn.relu)) model.add(keras.layers.Dense(units=10, activation=tf.nn.softmax))
编译模型
模型还需要再进行几项设置才可以开始训练。这些设置会添加到模型的编译步骤:
损失函数
衡量模型在训练期间的准确率。我们希望尽可能缩小该函数,以“引导”模型朝着正确的方向优化。
优化器
根据模型看到的数据及其损失函数更新模型的方式。
指标
用于监控训练和测试步骤。以下示例使用准确率,即图像被正确分类的比例
model.compile(optimizer=tf.train.AdamOptimizer(), loss="categorical_crossentropy", metrics=['accuracy'])
训练模型
训练神经网络模型需要执行以下步骤:
将训练数据馈送到模型中,在本示例中为 train_images 和 train_labels 数组。
模型学习将图像与标签相关联。我们要求模型对测试集进行预测,在本示例中为 test_images 数组。我们会验证预测结果是否与 test_labels 数组中的标签一致。
要开始训练,请调用 model.fit 方法,使模型与训练数据“拟合”:
model.fit(x=train_images, y=train_labels, epochs=5)
评估模型
模型在测试集数据上运行:
test_loss, test_acc = model.evaluate(x=test_images, y=test_labels) print("Test Accuracy %.2f"% test_acc)
使用模型进行预测
# 开始预测 cnt = 0 predictions = model.predict(test_images) for i in range(len(test_images)): target = np.argmax(predictions[i]) label = np.argmax(test_labels[i]) if target == label: cnt += 1 print("correct prediction of total : %.2f"%(cnt/len(test_images)))
卷积神经网络
mnist数据转换为四维
train_images = np.expand_dims(train_images, axis=3) test_images = np.expand_dims(test_images, axis=3)
创建模型并构建CNN各层
model = keras.Sequential() model.add(keras.layers.Conv2D(filters=32, kernel_size=5, strides=(1, 1), padding='same', activation=tf.nn.relu, input_shape=(28, 28, 1))) model.add(keras.layers.MaxPool2D(pool_size=(2, 2), strides=(2, 2), padding='valid')) model.add(keras.layers.Conv2D(filters=64, kernel_size=3, strides=(1, 1), padding='same', activation=tf.nn.relu)) model.add(keras.layers.MaxPool2D(pool_size=(2, 2), strides=(2, 2), padding='valid')) model.add(keras.layers.Dropout(0.25)) model.add(keras.layers.Flatten()) model.add(keras.layers.Dense(units=128, activation=tf.nn.relu)) model.add(keras.layers.Dropout(0.5)) model.add(keras.layers.Dense(units=10, activation=tf.nn.softmax))
编译与训练模型
# 训练模型 model.compile(optimizer=tf.train.AdamOptimizer(), loss="categorical_crossentropy", metrics=['accuracy']) model.fit(x=train_images, y=train_labels, epochs=10)
原文发布时间为:2018-12-9
本文作者: gloomyfish
本文来自云栖社区合作伙伴“ OpenCV学堂”,了解相关信息可以关注“CVSCHOOL”微信公众号
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Python | 用PrettyPrinter,让Python输出更漂亮,你值得拥有
PrettyPrinter是Python 3.6 及以上版本中的一个功能强大、支持语法高亮、描述性的美化打印包。它使用了改进的Wadler-Leijen布局算法,和Haskell打印美化库中的prettyprinter以及anti-wl-pprint、 JavaScript的Prettier、Ruby的prettypreinter.rb 以及 IPython的Ipython.lib.pretty类似。Python的PrettyPrinter集以上众家之所长,并在此基础上继续改进,因此也成为目前Python最强大的美化输出工具。 以下是使用PrettyPrinter输出结果的截图:为什么Python还需要额外的美化打印包呢? 无论是IDE还是开发者手动运行命令,将数据打印到屏幕上是程序运行过程中程序员和数值交互的最基础的界面。改进该界面
- 下一篇
python 迭代
迭代 循环(loop),指的是在满足条件的情况下,重复执行同一段代码。比如,while语句。迭代(iterate),指的是按照某种顺序逐个访问列表中的每一项。比如,for语句。递归(recursion),指的是一个函数不断调用自身的行为。比如,以编程方式输出著名的斐波纳契数列。遍历(traversal),指的是按照一定的规则访问树形结构中的每个节点,而且每个节点都只访问一次。对于这四个听起来高深莫测的词汇,在教程中,已经涉及到了一个——循环(loop),本经主要介绍一下迭代(iterate),看官在网上google,就会发现,对于迭代和循环、递归之间的比较的文章不少,分别从不同角度将它们进行了对比。这里暂不比较,先搞明白python中的迭代。 逐个访问 在python中,访问对象中每个元素,可以这么做:(例如一个list) >>> lst ['h', 'i', 'e', 'k', 'a', 'y'] >>> for i in lst: ... print i, ... h i e k a y 除了这种方法,还可以这样: >>> ls...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS关闭SELinux安全模块
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- Hadoop3单机部署,实现最简伪集群
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS6,CentOS7官方镜像安装Oracle11G
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8编译安装MySQL8.0.19
- CentOS6,7,8上安装Nginx,支持https2.0的开启