我们使用tf.keras
来创建神经网络:
什么是tf.keras
?,简单地说就是tensorflow中已经帮你封装好的一些包,它的作用是可以帮你快速搭建网络模型。
让我们以创建一个自动识别图片中数字的神经网络为例:
粗加工:
一般步骤如下:
- import:
- import相关模块,将你要用的模块引用到你的网络中来。
例如
from PIL import Image
import numpy as np
import tensorflow as tf
- train,test
- 告诉您将哪个数据集提供给神经网络以及使用哪个数据集进行测试
- Sequential/Class
- 构建网络结构,逐层描述网络的每一层,相当于前向传播
- model.compile
- 配置训练方法——选择什么优化器、损失函数、评估指标
- model.fit
- 执行训练过程
- model.summary
- 打印出网络的参数和结构。
识别相关功能
Sequential:
model = tf.keras.models.Sequential([网络结构])
网络结构有哪些?
- 拉直层: tf.keras.layers.Flatten() ,这一层不含计算,只是将你的输入特征拉直为一维数组
- 全连接层:tf.keras.layers.Dense(神经元个数,activation=’激活函数’,kernel_regularizer=哪种正则化)。
神经元数:本层节点数
激活函数:本层节点的输出与下一层节点的输入之间的函数连接方式(relu,softmax,sigmoid,tanh…)
正则化:为防止过度拟合而加的参数(l1,l2…) - 卷积层:tf.keras.layers.Conv2D(filters = 卷积核个数 ,kernel_size= 卷积核尺寸,strides = 卷积步长, padding = “valid” or “same”)
- 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')
])
它看起来像这样:
compile():配置神经网络的学习方法
model.compile(optimizer=优化器,loss=损失函数,metrics=['准确率'])
eg:
model.compile(optimizer='adam',
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),
metrics=['sparse_categorical_accuracy'])
optimizer
您可以选择:
- ‘sgd’或tf.keras.optimizers.SGD(lr=学习率,momentum=动量参数)
- ‘adagrad’或tf.keras.optimizers.Adagrad(lr=学习率)
- ‘adadelta’或tf.keras.optimizers.Adadelta(lr=学习率)
- ‘adam’或tf.keras.optimizers.Adam(lr=学习率,beta_1=0.9,beta_2=0.999)
loss
您可以选择:
- ‘mse’
- tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),后面的参数是在询问是否是原始输出。
metris
您可以选择:
- ‘accuracy’:y_test和y_train都是数值。
- ‘categorical_accuracy’:y_test和y_train都是概率分布。
- ‘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()
我们观察第一次运行后的效果:
让我们再运行几次网络:
您将获得一个非常适合的网络。
预测结果:
有了构建好的神经网络,我们只需要将数据输入神经网络,最终得到结果。
我们构建网络:
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)
即:
神经网络识别的结果为5.
这样一个简单的神经网络就搭建好了。
文章出处登录后可见!
已经登录?立即刷新