从0开始的深度学习——【tensorflow】创建一个神经网络

我们使用tf.keras来创建神经网络:
什么是tf.keras?,简单地说就是tensorflow中已经帮你封装好的一些包,它的作用是可以帮你快速搭建网络模型。
让我们以创建一个自动识别图片中数字的神经网络为例:

粗加工:

一般步骤如下:

  1. import:
  • import相关模块,将你要用的模块引用到你的网络中来。
    例如
from PIL import Image
import numpy as np
import tensorflow as tf
  1. train,test
  • 告诉您将哪个数据集提供给神经网络以及使用哪个数据集进行测试
  1. Sequential/Class
  • 构建网络结构,逐层描述网络的每一层,相当于前向传播
  1. model.compile
  • 配置训练方法——选择什么优化器、损失函数、评估指标
  1. model.fit
  • 执行训练过程
  1. model.summary
  • 打印出网络的参数和结构。

识别相关功能

Sequential:

model = tf.keras.models.Sequential([网络结构])
网络结构有哪些?

  1. 拉直层: tf.keras.layers.Flatten() ,这一层不含计算,只是将你的输入特征拉直为一维数组
  2. 全连接层:tf.keras.layers.Dense(神经元个数,activation=’激活函数’,kernel_regularizer=哪种正则化)。
    神经元数:本层节点数
    激活函数:本层节点的输出与下一层节点的输入之间的函数连接方式(relu,softmax,sigmoid,tanh…)
    正则化:为防止过度拟合而加的参数(l1,l2…)
  3. 卷积层:tf.keras.layers.Conv2D(filters = 卷积核个数 ,kernel_size= 卷积核尺寸,strides = 卷积步长, padding = “valid” or “same”)
  4. LSTM层: tf.keras.layers.LSTM()
    eg:
model = tf.keras.models.Sequential([
    tf.keras.layers.Dense(3, activation='softmax', kernel_regularizer=tf.keras.regularizers.l2())
    #                 神经元个数,   选用的激活函数,              选用的正则方法
])

下面是一个多层神经网络:

model = tf.keras.models.Sequential([
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(128, activation='relu'),
    tf.keras.layers.Dense(10, activation='softmax')
])

它看起来像这样:
从0开始的深度学习——【tensorflow】创建一个神经网络

compile():配置神经网络的学习方法

model.compile(optimizer=优化器,loss=损失函数,metrics=['准确率'])
eg:

model.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),
              metrics=['sparse_categorical_accuracy'])

optimizer 您可以选择:

  1. ‘sgd’或tf.keras.optimizers.SGD(lr=学习率,momentum=动量参数)
  2. ‘adagrad’或tf.keras.optimizers.Adagrad(lr=学习率)
  3. ‘adadelta’或tf.keras.optimizers.Adadelta(lr=学习率)
  4. ‘adam’或tf.keras.optimizers.Adam(lr=学习率,beta_1=0.9,beta_2=0.999)

loss 您可以选择:

  1. ‘mse’
  2. tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),后面的参数是在询问是否是原始输出。

metris 您可以选择:

  1. ‘accuracy’:y_test和y_train都是数值。
  2. ‘categorical_accuracy’:y_test和y_train都是概率分布。
  3. ‘sparse_categorical_accuracy’:y_test是数值,y_train是概率分布

fit:执行训练过程

model.fit(
    训练集的输入特征,训练集的标签
    batch_size= 每次喂入神经网络的样本数, 
    epochs= 迭代数据集的次数,
    validation_data = (测试集的输入特征,测试集的标签) 或者 validation_spilt = 从训练集划分多少给测试集
	#以上两个函数二选一
    validation_freq = 多少次cpoch测试一次
)

summary

可以打印出网络结构和参数统计

其他一些常用功能

  • load_weights(路径文件名):加载神经网络模型
  • 保存模型:

callback = tf.keras.callbacks.ModelCheckpoint(
   filepath = 路径文件名
   save_weights_only = True/False,#是否只保留模型参数
   save_best_only = True/False#是否只保留最优模型
)
history = model.fit(x_train, y_train, batch_size=32, epochs=5, validation_data=(x_test, y_test), validation_freq=1,
                   callbacks=[callback])
#在fit函数中再加入回调函数即可
  • 提取训练的参数: model.trainable_variables 返回模型中可训练的参数
  • 提取训练数据:history=model.fit(…)
  1. 训练集loss:[loss] loss = history.history[‘loss’]
  2. 测试集loss:[val_loss] val_loss = history.history[‘val_loss’]
  3. 训练集准确率: acc = history.history[‘sparse_categorical_accuracy’]
  4. 测试集准确率: val_acc = history.history[‘val_sparse_categorical_accuracy’]
  • 预测结果:predict(输入特征,batch_size=整数):向前传播得出预测的结果

构建模型:

import tensorflow as tf
import numpy as np
from PIL import Image
import os

#导入相关的数据
mnist = tf.keras.datasets.mnist
(x_train,y_train),(x_test,y_test) = mnist.load_data()
x_train = x_train /255.0
x_test = x_test / 255.0

#搭建网络框架
model = tf.keras.models.Sequential([
    tf.keras.layers.Flatten(),#拉直层
    tf.keras.layers.Dense(784,activation = 'relu'),
    tf.keras.layers.Dense(10,activation = 'softmax')
    #10个网络节点对应数字0-9
])

#配置学习方法

model.compile(
    optimizer='adam',#采用adam优化
    loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),#选择损失函数
    metrics=['sparse_categorical_accuracy']
    #因为前面是softmax输出的独热编码所以这里采用这种检验模式
)

#设置保存路径
checkpoint_save_path='./checkpoint/mnist.ckpt'

#如果之前存在这个网络,则加载以前的参数,再进行优化
if os.path.exists(checkpoint_save_path + '.index'):
    print('已有模型数据,正在加载模型')
    model.load_weights(checkpoint_save_path)

#设置存储路径
callback = tf.keras.callbacks.ModelCheckpoint(
    filepath=checkpoint_save_path,
    save_weights_only=True,
    save_best_only=True
)

#执行训练
history = model.fit(
    x_train,y_train,
    batch_size=32,epochs=10,
    validation_data=(x_test, y_test),
    validation_freq=1,
    callbacks=[callback]
)
#输出模型
model.summary()

我们观察第一次运行后的效果:
从0开始的深度学习——【tensorflow】创建一个神经网络
让我们再运行几次网络:
从0开始的深度学习——【tensorflow】创建一个神经网络
您将获得一个非常适合的网络。

预测结果:

有了构建好的神经网络,我们只需要将数据输入神经网络,最终得到结果。
我们构建网络:

import tensorflow as tf
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt

model_save_path = './checkpoint/mnist.ckpt'

#搭建网络框架
model = tf.keras.models.Sequential([
    tf.keras.layers.Flatten(),#拉直层
    tf.keras.layers.Dense(784,activation = 'relu'),
    tf.keras.layers.Dense(10,activation = 'softmax')
    #10个网络节点对应数字0-9
])

model.load_weights(model_save_path)

test_num = int(input("你想进行的实验次数是:"))

for i in range(test_num):
    image_path = input("输入照片文件名")
    img = Image.open(image_path)

    #调整尺寸,灰度
    img = img.resize((28, 28), Image.ANTIALIAS)
    img_arr = np.array(img.convert('L'))

    img_arr = 255.0 - img_arr#颜色反转

    img_arr = img_arr / 255.0
    x_predict = img_arr[tf.newaxis, ...]
    result = model.predict(x_predict)
    pred = tf.argmax(result, axis=1)

    print('\n')
    tf.print(pred)

    plt.pause(1)
    plt.close()

当我向神经网络输入这样一张图片:(5555.png)
从0开始的深度学习——【tensorflow】创建一个神经网络
即:从0开始的深度学习——【tensorflow】创建一个神经网络

神经网络识别的结果为5.
这样一个简单的神经网络就搭建好了。

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
青葱年少的头像青葱年少普通用户
上一篇 2022年3月23日
下一篇 2022年3月23日

相关推荐