最近学习深度学习中构建神经网络模型时,想利用netron来可视化模型,有助于更加清晰的理解所构建的模型的基本架构,但翻阅了网上绝大多数教程都不怎么满意,最后结合各教程终于成功生成tflite文件并完成可视化,以下是基于keras训练模型生成pb文件(java调用、python调用)_Butertfly的博客-CSDN博客中的代码模型,生成tflite文件的基本思路和全部代码,部分地方有所改动,只是一个例程
首先是库,我们选用keras和tensorflow,其中我的keras为2.13.1版本,tensorflow为2.13.0版本。以下是基本库加载
import keras
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D
import tensorflow as tf
接下来是数据预处理
#数据预处理
batch_size = 128 #每个训练批次的样本数量
num_classes = 10 #类别数量,其实也就是对应数字0-9
epochs = 30 #训练的轮次
img_rows, img_cols = 28, 28 #图像的行列
#加载MNIST数据集,并将训练集和测试集保存在元组中
(x_train, y_train), (x_test, y_test) = mnist.load_data()
#注意,上述元组图像在x,标签在y中
#进行reshape操作,变为4D张量,即(sample,H,W,C)
x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1)
x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1)
input_shape = (img_rows, img_cols, 1)
#转换类型为浮点型,便于下方的归一化处理
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
#归一化,由于图像数据范围是0-255,因此除以255
x_train /= 255
x_test /= 255
#打印训练集的形状和样本数量
print('x_train shape:', x_train.shape)
print(x_train.shape[0], 'train samples')
print(x_test.shape[0], 'test samples')
#进行one-hot编码,转换为二进制矩阵形式
y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)
下面是运行的print结果,可以看到训练集的形状以及训练集和测试集的样本数量
在以上代码中,我对每一段代码都添加的注释,方便初学者理解代码,也方便自己看,值得一提的是to_categorical函数为keras库内置的独热码处理,将标签y_train每个元素都变为长度为num_classes的向量,其中只有一个元素为1,表示改样本所属类别,其余都为0,也就是对其中元素进行基本的判定,哪些是1哪些是9,因为类别为0-9.
接下来是模型搭建模块
#模型搭建
model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3),
activation='relu',
input_shape=input_shape))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(num_classes, activation='softmax'))
#观看模型整个架构
model.summary()
以上我们利用了sequential函数来构建一个序列模型,此序列模型是 一个简单的神经网络架构,有一些层按顺序堆叠,每一层与前一层和后一层连接,即只有一个方向流动,我们这里采取简单的架构,方便我们后学利用netron查看模型基本架构。
下面是运行出来的模型基本架构
接下来是对我们所建构的模型以及预处理的数据进行训练
即训练模型
#训练模型
model.compile(loss=keras.losses.categorical_crossentropy,
optimizer=keras.optimizers.Adadelta(),
metrics=['accuracy'])
model.fit(x_train, y_train,
batch_size=batch_size,
epochs=epochs,
verbose=1,
validation_data=(x_test, y_test))
上方运用了compile函数,指定了loss损失函数,optimizer优化器,以及metrics测量指标
利用fit函数进行训练,轮次为epochs,30次,样本数量为batch_size,128个,验证数据使用原先定好的测试数据,运行后训练结果大致如下
总共有30个轮次就不一一截图观看,看个大概即可
最后,也就是重点的来了,利用tensorflow2.x版本来直接保存为tflite模型,不需要先保存为h5或者pb文件再转换,我们可以直接在这里利用以下三行代码来转换并生成tflite文件
converter = tf.lite.TFLiteConverter.from_keras_model(model)
tflite_model = converter.convert()
open("./converted_model.tflite", "wb").write(tflite_model)
运行完成后生成的文件在当前文件夹下
由于我已经下载好了netron这一可视化工具,我们直接双击打开即可,如图
点击其中一个卷积节点显示如下
在这之中点击加号“+”,还可以清晰的看到全部的输入数据以及输出以及各种权重和偏置
至此,全文结束