快捷搜索: 王者荣耀 脱发

Tensorflow2.x.x最基础的神经网络(ANN)

Tensorflow2.x.x最基础的神经网络(ANN)

本章节主要使用Tensorflow2.x.x来搭建ANN神经网络。

ANN原理

实现

使用ANN实现对的分类。

import tensorflow as tf
# mnist数据集
from tensorflow.keras.datasets import mnist
# Adam优化器
from tensorflow.keras.optimizers import Adam
# 交叉熵损失函数,一般用于多分类
from tensorflow.keras.losses import CategoricalCrossentropy
# 模型和网络层
from tensorflow.keras import Model, layers

# 批次大小
BATCH_SIZE = 128
# 迭代次数
EPOCHS = 10
# 加载mnist的训练、测试数据集
train, test = mnist.load_data()
# 数据集的预处理
@tf.function
def preprocess(x, y):
    # 将x一维数据转为3维灰度图
    x = tf.reshape(x, [28, 28, 1])
    # 将x的范围由[0, 255]为[0, 1]
    x = tf.image.convert_image_dtype(x, tf.float32)
    # 将y数字标签进行独热编码
    y = tf.one_hot(y, 10)
    # 返回处理后的x和y
    return x, y

# 使用Dataset来减少内存的使用
train = tf.data.Dataset.from_tensor_slices(train)
# 对数据进行预处理并且给定BATCH_SIZE
train = train.map(preprocess).batch(BATCH_SIZE)

# test数据集同理
test = tf.data.Dataset.from_tensor_slices(test)
test = test.map(preprocess).batch(BATCH_SIZE)

# 搭建模型(只是其中的一种搭建方式而已)
x = layers.Input(shape=(28, 28, 1))                 # 输入为x, 大小为 28*28*1
y = layers.Flatten()(x)                             # 将高维数据扁平化
y = layers.Dense(1024, activation=relu)(y)        # 输出1024个神经元的全网络层
y = layers.Dense(512, activation=relu)(y)         # 输出512个神经元的全网络层
y = layers.Dense(256, activation=relu)(y)         # 输出256个神经元的全网络层
y = layers.Dense(128, activation=relu)(y)         # 输出128个神经元的全网络层
y = layers.Dense(64, activation=relu)(y)          # 输出64个神经元的全网络层
y = layers.Dense(32, activation=relu)(y)          # 输出32个神经元的全网络层
y = layers.Dense(10, activation=softmax)(y)       # 输出10个神经元的全网络层,最后一层使用了softmax进行激活,原因是我们希望提前[0, 1]之间的概率

# 创建模型
ann = Model(x, y)
# 编译模型,选择优化器、评估标准、损失函数
ann.compile(optimizer=Adam(), metrics=[acc], loss=CategoricalCrossentropy())
# 进行模型训练
history = ann.fit(train, epochs=EPOCHS)
# 测试集的评估
score = ann.evaluate(test)
# 打印评估成绩
print(loss: {0}, acc: {1}.format(score[0], score[1])) # loss: 0.11106619730560828, acc: 0.9769999980926514

# 绘制训练过程中每个epoch的loss和acc的折线图
import matplotlib.pyplot as plt
# history对象中有history字典, 字典中存储着“损失”和“评估标准”
epochs = range(EPOCHS)
fig = plt.figure(figsize=(15, 5), dpi=100)

ax1 = fig.add_subplot(1, 2, 1)
ax1.plot(epochs, history.history[loss])
ax1.set_title(loss graph)
ax1.set_xlabel(epochs)
ax1.set_ylabel(loss val)

ax2 = fig.add_subplot(1, 2, 2)
ax2.plot(epochs, history.history[acc])
ax2.set_title(acc graph)
ax2.set_xlabel(epochs)
ax2.set_ylabel(acc val)

fig.show()

输出结果如下:

经验分享 程序员 微信小程序 职场和发展