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)
来源: https://yq.aliyun.com/articles/679969