tensorflow2 训练和预测使用不同的输出层、获取权重参数
目标:
youtubeNet通过训练tensorflow2时设置不同的激活函数,训练和预测采用不同的分支,然后可以在训练和测试时,把模型进行分离,得到训练和预测时,某些层的参数不同。可以通过类似迁移学习的办法实现。
第二,获取训练模型的参数。
获取模型参数:
比较简单,就是调用model.get_weights()。也可以用精确定位到某层,得到
w_dense4 =model.get_layer('dense4').get_weights()
#获取训练后的权重参数
weigts_parm = model.get_weights()
获得的就是模型参数的每一层权重和偏置信息。
模型不同输出:
想不到更好办法,利用迁移学习的办法,如果模型天生支持判断是预测阶段还是预测阶段,就更好了。
原理就是:
- 模型构建时,先构建一个分支,一个用于训练train。
- 把要替换的层或者激活函数单独拧出来。
- 利用模型打包compile时,把train都包含进模型。
- 利用train=train,这样训练还是用到训练参数。
- 预测时,单独新建一个model,去接收之前model某层的输出。
- 添加上自己想要的层,如果需要重新训练,则重新compile,如果不想再训练,直接predict就好了。
由于预测的那个分支没有经过训练,所以一般只适用于对最后输出层,采用了不同的输出函数,比如YouTube推荐模型,输出层训练时用得weighted LR,而预测时用了e^x 激活函数,这种方式就能实现训练时用一个激活函数,预测时用另一个激活函数。
import tensorflow as tf
import os
import pandas as pd# 读取数据集
(train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.fashion_mnist.load_data()# 数据集归一化,注意softmax输出的分类labels不用归一化
train_images = train_images / 255
test_images = test_images / 255# 创建模型结构
net_input=tf.keras.Input(shape=(28,28))
fl=tf.keras.layers.Flatten(name='flatten')(net_input)#调用input
l1=tf.keras.layers.Dense(128,activation="relu",name='dense1')(fl)
d1=tf.keras.layers.Dense(64,activation="relu",name='dense2')(l1)
l2=tf.keras.layers.Dense(32,activation="relu",name='dense3')(d1)
l3=tf.keras.layers.Dense(10,activation=None,name='dense4')(l2)
output=tf.keras.activations.softmax(l3)
# 创建模型类
model = tf.keras.Model(inputs=net_input, outputs=output)# 查看模型的结构
model.summary()# 模型编译
model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.001),loss="sparse_categorical_crossentropy",metrics=['acc','mse'])# 模型训练
model.fit(train_images, train_labels, batch_size=50, epochs=2, validation_split=0.1)#获取训练后的权重参数
weigts_parm = model.get_weights()
print(len(weigts_parm)) #12
model.evaluate(test_images,test_labels)
weigt_dense3 = weigts_parm[-2]weigt_dense3_embedding = pd.DataFrame(weigt_dense3.transpose())
print(weigt_dense3_embedding)predicts =model.predict(test_images)#another_model
# inputs=model.input
out1 = model.get_layer('dense3').output
out = tf.keras.layers.Dense(128,activation='relu',name='mydense1')(out1)
out = tf.keras.layers.Dense(64,activation='relu',name='mydense2')(out)
mylogits = tf.keras.layers.Dense(10,activation='softmax',name='my_logit')(out)predict_model = tf.keras.Model(inputs=model.input,outputs=mylogits)
predict_model.compile(loss=tf.keras.losses.sparse_categorical_crossentropy,optimizer='adam',metrics=['acc','mse'])
print(predict_model.summary())
predict_model.fit(train_images, train_labels, batch_size=50, epochs=2, validation_split=0.1)
predicts_2 = predict_model.predict(test_images)for i in predicts_2:print(i.argmax())
# print(predicts_2)
print(test_labels)
运行结果:
Model: "model"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_1 (InputLayer) [(None, 28, 28)] 0
_________________________________________________________________
flatten (Flatten) (None, 784) 0
_________________________________________________________________
dense1 (Dense) (None, 128) 100480
_________________________________________________________________
dense2 (Dense) (None, 64) 8256
_________________________________________________________________
dense3 (Dense) (None, 32) 2080
_________________________________________________________________
dense4 (Dense) (None, 10) 330
_________________________________________________________________
tf.compat.v1.nn.softmax (TFO (None, 10) 0
=================================================================
Total params: 111,146
Trainable params: 111,146
Non-trainable params: 0
_________________________________________________________________
2021-12-20 16:51:29.354023: I tensorflow/compiler/mlir/mlir_graph_optimization_pass.cc:176] None of the MLIR Optimization Passes are enabled (registered 2)
Epoch 1/2
2021-12-20 16:51:30.006144: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library cublas64_11.dll
2021-12-20 16:51:30.563964: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library cublasLt64_11.dll
1080/1080 [==============================] - 7s 5ms/step - loss: 0.5380 - acc: 0.8104 - mse: 27.6815 - val_loss: 0.3976 - val_acc: 0.8528 - val_mse: 27.5902
Epoch 2/2
1080/1080 [==============================] - 5s 5ms/step - loss: 0.3796 - acc: 0.8623 - mse: 27.6900 - val_loss: 0.3787 - val_acc: 0.8628 - val_mse: 27.5929
8
313/313 [==============================] - 2s 5ms/step - loss: 0.3998 - acc: 0.8566 - mse: 27.68160 1 2 ... 29 30 31
0 -0.287471 0.036533 -0.127725 ... 0.234849 0.014998 0.068000
1 -0.109836 -0.223555 -0.400632 ... -0.338368 -0.307823 -0.406235
2 -0.094260 -0.186713 -0.101085 ... -0.025677 0.120322 0.028206
3 -0.386172 0.152541 -0.527324 ... -0.248855 -0.129524 -0.235581
4 -0.201059 -0.341049 -0.474235 ... -0.021036 0.152996 0.161320
5 -0.174123 0.459365 -0.005071 ... 0.244765 0.244738 0.067327
6 0.330713 0.066037 -0.465473 ... -0.378929 -0.101122 0.235503
7 0.242240 0.199673 0.010125 ... -0.217853 0.255141 -0.057792
8 -0.140202 -0.248611 -0.405854 ... -0.030497 0.384872 0.019411
9 -0.133955 0.261924 0.068150 ... 0.404557 0.171754 0.072854[10 rows x 32 columns]
Model: "model_1"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_1 (InputLayer) [(None, 28, 28)] 0
_________________________________________________________________
flatten (Flatten) (None, 784) 0
_________________________________________________________________
dense1 (Dense) (None, 128) 100480
_________________________________________________________________
dense2 (Dense) (None, 64) 8256
_________________________________________________________________
dense3 (Dense) (None, 32) 2080
_________________________________________________________________
mydense1 (Dense) (None, 128) 4224
_________________________________________________________________
mydense2 (Dense) (None, 64) 8256
_________________________________________________________________
my_logit (Dense) (None, 10) 650
=================================================================
Total params: 123,946
Trainable params: 123,946
Non-trainable params: 0
_________________________________________________________________
None
Epoch 1/2
1080/1080 [==============================] - 7s 6ms/step - loss: 0.4096 - acc: 0.8584 - mse: 27.6896 - val_loss: 0.4016 - val_acc: 0.8642 - val_mse: 27.5922
Epoch 2/2
1080/1080 [==============================] - 6s 5ms/step - loss: 0.3320 - acc: 0.8794 - mse: 27.6930 - val_loss: 0.3711 - val_acc: 0.8647 - val_mse: 27.5948
对比打印两个模型的输出:
for i in predicts:print(i.argmax())for i in predicts_2:print(i.argmax())
建议:
- 1、获取模型某层的参数,常常就是embedding向量
- 2、模型的不同输出。采用迁移学习的办法。
有更好的办法可以提出。
tensorflow2 训练和预测使用不同的输出层、获取权重参数相关推荐
- tensorflow2caffe(3) : 如何将tensorflow框架下训练得到的权重转化为caffe框架下的权重参数
版权声明:本文为博主原创文章,转载时请附加博文链接. https://blog.csdn.net/jiongnima/article/details/78382972 在前两期专栏tensorflow ...
- tensorflow2caffe(1) : 如何将tensorflow框架下训练得到的权重转化为caffe框架下的权重参数
在前两期专栏tensorflow2caffe(1)和tensorflow2caffe(2)中,笔者向大家介绍了caffemodel文件类型下的参数架构和如何取出tensorflow框架下训练参数.在本 ...
- 【深度学习的数学】“2×4×1层带sigmoid激活函数的神经网络感知机对三角形平面的分类训练预测”,输出层加偏置b(实时绘制损失函数曲线)(对输入数据归一化)(奇迹出现了!)
文章目录 前言 代码 修改之前错误的代码 知道为何Z的结果不能拟合到预期的5了 解决办法1:取消输出层神经单元的a和b(直接将z作为输出)(这个办法不行,影响神经单元的完整性,没法计算出输出层神经单元 ...
- 【深度学习的数学】接“2×3×1层带sigmoid激活函数的神经网络感知机对三角形平面的分类训练预测”,输出层加偏置b
文章目录 代码 接:[深度学习的数学]2×3×1层带sigmoid激活函数的神经网络感知机对三角形平面的分类训练预测(绘制出模型结果三维图展示效果)(梯度下降法+最小二乘法+激活函数sigmoid+误 ...
- ResNet网络的训练和预测
ResNet网络的训练和预测 简介 Introduction 图像分类与CNN 图像分类 是指将图像信息中所反映的不同特征,把不同类别的目标区分开来的图像处理方法,是计算机视觉中其他任务,比如目标检测 ...
- 三两下实现NLP训练和预测,这四个框架你要知道
作者 | 狄东林 刘元兴 朱庆福 胡景雯 编辑 | 刘元兴,崔一鸣 来源 | 哈工大SCIR(ID:HIT_SCIR) 引言 随着人工智能的发展,越来越多深度学习框架如雨后春笋般涌现,例如PyTorc ...
- ML之LoRDTRF:基于LoRDT(CART)RF算法对mushrooms蘑菇数据集(22+1,6513+1611)训练来预测蘑菇是否毒性(二分类预测)
ML之LoR&DT&RF:基于LoR&DT(CART)&RF算法对mushrooms蘑菇数据集(22+1,6513+1611)训练来预测蘑菇是否毒性(二分类预测) 目录 ...
- DL之DNN:自定义2层神经网络TwoLayerNet模型(封装为层级结构)利用MNIST数据集进行训练、预测
DL之DNN:自定义2层神经网络TwoLayerNet模型(封装为层级结构)利用MNIST数据集进行训练.预测 导读 计算图在神经网络算法中的作用.计算图的节点是由局部计算构成的. ...
- DL之DNN:自定义2层神经网络TwoLayerNet模型(计算梯度两种方法)利用MNIST数据集进行训练、预测
DL之DNN:自定义2层神经网络TwoLayerNet模型(计算梯度两种方法)利用MNIST数据集进行训练.预测 导读 利用python的numpy计算库,进行自定义搭建2层神经网络TwoLayerN ...
最新文章
- Windows10+Virtual box+ubuntu17.10
- 终端复用命令行神器:tmux
- Visual Studio2019 应用程序无法正常启动0xc000007b
- 【2017-12-08】c#基础-程序开发思路初认识
- 启动weblogic的错误:Could not obtain an exclusive lock to the embedded LDAP data files directory...
- linux 提取ko文件,Linux获取so/ko文件版本号教程
- HD1561The more, The Better(树形DP+有依赖背包)
- 京瓷 打印 打印机 账户_UV打印机买回来成废铁?不是选择不对,而是你想太多了……...
- Python怎么使用beautifulsoup来从HTML片段中删除标签
- webpack4+node合并资源请求, 实现combo功能(二十三)
- kotlin 泛型约束
- 学会这个方法,轻松为PDF文件加密,快来码住
- 通达信软件里php文件在哪,通达信股票交易软件使用秘籍
- Unity使用tolua框架教程: LuaFramewrk
- JSONP 跨域原理
- Cb Vc 经典大讨论(很长的一篇文章!)?
- 云计算360度 微软专家纵论产业变革
- 还想贪小便宜?建议你先了解一下物联卡收费标准!
- 生成式对抗网络(GAN)实战——书法字体生成练习赛
- [HEOI2013]ALO
热门文章
- AlexNet 和 VGG-Net的区别
- 计算机毕业设计制作模仿网站的期末作业通过神器——各种扒站方法(网站,软件)
- java session事件,Java开发网 - 再论Session事件的捕获
- NSLog中格式符列表
- ueditor html中使用方法,vue集成百度UEditor富文本编辑器使用教程
- HDU - 6126 Give out candies
- 安卓-04-实例01-XML布局UI界面
- mysql快速导入5000万条数据过程记录(LOAD DATA INFILE方式)
- sulime text 常用快捷键总结
- Direct2D (3) : 使用浮点参数绘制基本图形