扩展之Tensorflow2.0 | 18 TF2构建自定义模型
扩展之Tensorflow2.0 | 17 TFrec文件的创建与读取
扩展之Tensorflow2.0 | 16 TF2读取图片的方法
扩展之Tensorflow2.0 | 15 TF2实现一个简单的服装分类任务
小白学PyTorch | 14 tensorboardX可视化教程
小白学PyTorch | 13 EfficientNet详解及PyTorch实现
小白学PyTorch | 12 SENet详解及PyTorch实现
小白学PyTorch | 11 MobileNet详解及PyTorch实现
小白学PyTorch | 10 pytorch常见运算详解
小白学PyTorch | 9 tensor数据结构与存储结构
小白学PyTorch | 8 实战之MNIST小试牛刀
小白学PyTorch | 7 最新版本torchvision.transforms常用API翻译与讲解
小白学PyTorch | 6 模型的构建访问遍历存储(附代码)
小白学PyTorch | 5 torchvision预训练模型与数据集全览
小白学PyTorch | 4 构建模型三要素与权重初始化
小白学PyTorch | 3 浅谈Dataset和Dataloader
小白学PyTorch | 2 浅谈训练集验证集和测试集
小白学PyTorch | 1 搭建一个超简单的网络
小白学PyTorch | 动态图与静态图的浅显理解
这个系列《小白学PyTorch》的所有代码和数据集放在了公众号【机器学习炼丹术】后台,回复【pytorch】获取(还在更新的呢):
机器学习炼丹术的粉丝的人工智能交流群已经建立,目前有目标检测、医学图像、时间序列等多个目标为技术学习的分群和水群唠嗑的总群,欢迎大家加炼丹兄为好友,加入炼丹协会。微信:cyx645016617.
参考目录:
1 模型的构建
2 结构参数的存储与载入
3 参数的存储与载入
4 结构的存储与载入
本文主要讲述TF2.0的模型文件的存储和载入的多种方法。主要分成两类型:模型结构和参数一起载入,模型的结构载入。
import tensorflow.keras as keras
class CBR(keras.layers.Layer):
def __init__(self,output_dim):
super(CBR,self).__init__()
self.conv = keras.layers.Conv2D(filters=output_dim, kernel_size=4, padding='same', strides=1)
self.bn = keras.layers.BatchNormalization(axis=3)
self.ReLU = keras.layers.ReLU()
def call(self, inputs):
inputs = self.conv(inputs)
inputs = self.ReLU(self.bn(inputs))
return inputs
class MyNet(keras.Model):
def __init__ (self):
super(MyNet,self).__init__()
self.cbr1 = CBR(16)
self.maxpool1 = keras.layers.MaxPool2D(pool_size=(2,2))
self.cbr2 = CBR(32)
self.maxpool2 = keras.layers.MaxPool2D(pool_size=(2,2))
def call(self, inputs):
inputs = self.maxpool1(self.cbr1(inputs))
inputs = self.maxpool2(self.cbr2(inputs))
return inputs
model = MyNet()
部分朋友可以发现,上面的代码就是上一次课程所构建的一个自定义的网络。
我们现在需要展示这个模型的框架:
model.build((16,224,224,3))
print(model.summary())
这里需要对网络执行一个构建.build()
函数,之后才能生成model.summary()
这样的模型的描述。 这是因为模型的参数量是需要知道输入数据的通道数的,假如我们输入的是单通道的图片,那么就是:
model.build((16,224,224,1))
print(model.summary())
model.save('save_model.h5')
new_model = keras.models.load_model('save_model.h5')
大概的意思就是:因为你的模型不是官方的模型,是自定义的,所以并不能同时保存结构和参数。只有官方的模型可以时候上面的保存的方法,同时保存参数和权重;自定义的模型建议只保存参数
model.save_weights('model_weight')
new_model = MyNet()
new_model.load_weights('model_weight')
这样子就可以保存自定义的模型了。在对应的目录下会出现这几个文件:
我们来看一下原来的模型和载入的模型对于同一个样本给出的结果是否相同:
# 看一下原来的模型和载入的模型预测相同的样本的输出
test = tf.ones((1,8,8,3))
prediction = model.predict(test)
new_prediction = new_model.predict(test)
print(prediction,new_prediction)
>>> [[[[0.02559286]]]] [[[[0.02559286]]]]
结果相同,载入的没有问题~
结构的存储有两种方法:
model.get_config()
model.to_json()
需要注意的是,上面的两个方法和save的问题一样,是不能用在自定义的模型中的,如果你在其中使用了自定义的Layer类,那么只能!只能用save_weights的方式进行保存
下面依然给出这两种方法的代码,对于简单的、已经封装好的一些网络层构成的网络,是可以使用这些的。我个人还是常用save_weights啦
# 第一种方法
config = model.get_config()
reinitialized_model = keras.Model.from_config(config)
# 第二种方法
json_config = model.to_json()
# 把json写的文件中
with open('model_config.json', 'w') as json_file:
json_file.write(json_config)
# 读取本地json文件
with open('model_config.json') as json_file:
json_config = json_file.read()
reinitialized_model = keras.models.model_from_json(json_config)
今天的内容就是这么多,虽然提供了四种方法,但是对于自定义程度较高的模型,还是要使用save_weights哦~
- END - <>小白学论文 | EfficientNet强在哪里
小白学论文 | 神经网络初始化Xavier
小白学论文 | 端侧神经网络GhostNet(2019)
小白学目标检测 | RCNN, SPPNet, Fast, Faster
小白学图像 | BatchNormalization详解与比较
小白学图像 | Group Normalization详解+PyTorch代码
小白学图像 | 八篇经典CNN论文串讲
图像增强 | CLAHE 限制对比度自适应直方图均衡化
小白学卷积 | 深入浅出卷积网络的平移不变性
小白学卷积 | (反)卷积输出尺寸计算
损失函数 | 焦点损失函数 FocalLoss 与 GHM
<>
小白学ML | 随机森林 全解 (全网最全)
小白学SVM | SVM优化推导 + 拉格朗日 + hingeLoss
小白学LGB | LightGBM = GOSS + histogram + EFB
小白学LGB | LightGBM的调参与并行
小白学XGB | XGBoost推导与牛顿法
评价指标 | 详解F1-score与多分类F1
小白学ML | Adaboost及手推算法案例
小白学ML | GBDT梯度提升树
小白学优化 | 最小二乘法与岭回归&Lasso回归
小白学排序 | 十大经典排序算法(动图)
杂谈 | 正态分布为什么如此常见
Adam优化器为什么被人吐槽?
机器学习不得不知道的提升技巧:SWA与pseudo-label
<>
秋招总结 | 一个非Top学校的跨专业的算法应届研究生的几十场面试
【小白面经】快手 AI算法岗 附答案解析
【小白面经】 拼多多 AI算法岗 附带解析
【小白面经】八种应对样本不均衡的策略
【小白面经】之防止过拟合的所有方法
【小白面经】梯度消失爆炸及其解决方法
【小白面经】 判别模型&生成模型
<>
【小白健身】腹肌搓衣板化
【小白健身】8个动作练爆胸大肌
【小白健身 】背阔大作战(下)
【小白健身】背阔大作战(上)
【小白健身】徒手健身40个动作(gif)
【小白健身】弹力带轻度健身gif动图