基于keras和tensorflow2.x的模型生成

        最近学习深度学习中构建神经网络模型时,想利用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这一可视化工具,我们直接双击打开即可,如图

 点击其中一个卷积节点显示如下

在这之中点击加号“+”,还可以清晰的看到全部的输入数据以及输出以及各种权重和偏置

 

至此,全文结束

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sonne_hfuter

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值