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

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

大致流程:

其大致步骤如下:

  1. import:

  2. import相关模块,将你要用的模块引用到你的网络中来。
    比如

from PIL import Image
import numpy as np
import tensorflow as tf
  1. train,test

  2. 告知你要喂入神经网络的数据集和用于测试的数据集

  3. Sequential/Class

  4. 搭建网络结构,逐层描述每一层网络,等同于前向传播

  5. model.compile

  6. 配置训练方法——选择什么优化器,损失函数,评测指标

  7. model.fit

  8. 执行训练过程

  9. model.summary

  10. 打印出网络的参数和结构。

认识相关函数

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(…)

  • 训练集loss:[loss] loss = history.history['loss']

  • 测试集loss:[val_loss] val_loss = history.history['val_loss']
  • 训练集准确率: acc = history.history['sparse_categorical_accuracy']
  • 测试集准确率: 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.

这样一个简单的神经网络就搭建好了。

Original: https://blog.csdn.net/go_bananas/article/details/123648748
Author: go_bananas
Title: 从0开始的深度学习——【tensorflow】创建一个神经网络

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/691519/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球