我们用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.
这样一个简单的神经网络就搭建好了。