Tensorflow中的多层感知器学习
在这篇文章中,我们将了解多层感知器的概念和它在Python中使用TensorFlow库的实现。
多层感知
多层感知也被称为MLP。它是完全连接的密集层,可以将任何输入维度转化为所需维度。多层感知是一个具有多层的神经网络。为了创建一个神经网络,我们将神经元结合在一起,使一些神经元的输出成为其他神经元的输入。
多层感知器有一个输入层,每个输入都有一个神经元(或节点),它有一个输出层,每个输出都有一个节点,它可以有任意数量的隐藏层,每个隐藏层可以有任意数量的节点。多层感知器(MLP)的原理图描述如下。
在上面的多层感知器图中,我们可以看到有三个输入,因此有三个输入节点,隐藏层有三个节点。输出层给出两个输出,因此有两个输出节点。输入层的节点接受输入并将其进一步处理,在上图中,输入层的节点将其输出转发给隐藏层的三个节点,以同样的方式,隐藏层处理信息并将其传递给输出层。
多层感知中的每个节点都使用一个sigmoid激活函数。sigmoid激活函数将实值作为输入,并使用sigmoid公式将其转换为0和1之间的数字。
现在我们已经完成了多层感知的理论部分,让我们继续使用TensorFlow库在python中实现一些代码。
一步一步实现
第1步:导入必要的库。
# importing modules
import tensorflow as tf
import numpy as np
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Flatten
from tensorflow.keras.layers import Dense
from tensorflow.keras.layers import Activation
import matplotlib.pyplot as plt
第2步:下载数据集。
TensorFlow允许我们读取MNIST数据集,我们可以在程序中直接加载它作为训练和测试数据集。
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()
输出:
从https://storage.googleapis.com/tensorflow/tf-keras-datasets/mnist.npz 下载数据
11493376/11490434 [==============================] – 2s 0us/step
第3步:现在我们将把像素转换为浮点值。
# Cast the records into float values
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
# normalize image pixel values by dividing
# by 255
gray_scale = 255
x_train /= gray_scale
x_test /= gray_scale
我们要把像素值转换成浮点值来进行预测。将数字改为灰度值将是有益的,因为数值变得很小,计算变得更容易和更快。由于像素值的范围是0到256,除了0以外,其他的范围是255。因此,将所有的值除以255,就可以转换为0到1的范围。
第4步:了解数据集的结构
print("Feature matrix:", x_train.shape)
print("Target matrix:", x_test.shape)
print("Feature matrix:", y_train.shape)
print("Target matrix:", y_test.shape)
输出:
Feature matrix: (60000, 28, 28)
Target matrix: (10000, 28, 28)
Feature matrix: (60000,)
Target matrix: (10000,)
因此,我们得到训练数据集中有60,000条记录,测试数据集中有10,000条记录,数据集中的每张图像都是28×28的大小。
第5步:将数据可视化。
fig, ax = plt.subplots(10, 10)
k = 0
for i in range(10):
for j in range(10):
ax[i][j].imshow(x_train[k].reshape(28, 28),
aspect='auto')
k += 1
plt.show()
输出
第6步:形成输入层、隐藏层和输出层。
model = Sequential([
# reshape 28 row * 28 column data to 28*28 rows
Flatten(input_shape=(28, 28)),
# dense layer 1
Dense(256, activation='sigmoid'),
# dense layer 2
Dense(128, activation='sigmoid'),
# output layer
Dense(10, activation='sigmoid'),
])
一些需要注意的重要事项:。
- 顺序模型允许我们像在多层感知器中那样逐层创建模型,并且仅限于单输入、单输出的层叠。
- 平坦化对提供的输入进行平坦化,而不影响批处理的大小。例如,如果输入的形状是(batch_size,),没有特征轴,那么扁平化会增加一个额外的通道尺寸,输出的形状是(batch_size, 1)。
- 激活是为了使用sigmoid激活函数。
- 前两个密集层用来做一个全连接模型,是隐藏层。
- 最后一个密集层是输出层,包含10个神经元,决定图像属于哪个类别。
第7步:编译模型。
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
这里使用了编译函数,涉及到损失、优化器和度量的使用。这里使用的损失函数是sparse_categorical_crossentropy,优化器是adam。
第8步:拟合模型。
model.fit(x_train, y_train, epochs=10,
batch_size=2000,
validation_split=0.2)
输出:
需要注意的一些要点。
- 纪元告诉我们,模型将被训练成前向和后向的次数。
- 批量大小代表样本的数量,如果没有指定,batch_size将默认为32。
- 模型将把这部分训练数据分离出来,在每个历时结束时评估损失和任何模型指标。(模型不会在此数据上进行训练)
第9步:查找模型的准确性。
results = model.evaluate(x_test, y_test, verbose = 0)
print('test loss, test acc:', results)
输出:
test loss, test acc: [0.27210235595703125, 0.9223999977111816]
通过对测试样本使用model.evaluate(),我们得到了我们的模型92%的准确性。