目标:

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 训练和预测使用不同的输出层、获取权重参数相关推荐

  1. tensorflow2caffe(3) : 如何将tensorflow框架下训练得到的权重转化为caffe框架下的权重参数

    版权声明:本文为博主原创文章,转载时请附加博文链接. https://blog.csdn.net/jiongnima/article/details/78382972 在前两期专栏tensorflow ...

  2. tensorflow2caffe(1) : 如何将tensorflow框架下训练得到的权重转化为caffe框架下的权重参数

    在前两期专栏tensorflow2caffe(1)和tensorflow2caffe(2)中,笔者向大家介绍了caffemodel文件类型下的参数架构和如何取出tensorflow框架下训练参数.在本 ...

  3. 【深度学习的数学】“2×4×1层带sigmoid激活函数的神经网络感知机对三角形平面的分类训练预测”,输出层加偏置b(实时绘制损失函数曲线)(对输入数据归一化)(奇迹出现了!)

    文章目录 前言 代码 修改之前错误的代码 知道为何Z的结果不能拟合到预期的5了 解决办法1:取消输出层神经单元的a和b(直接将z作为输出)(这个办法不行,影响神经单元的完整性,没法计算出输出层神经单元 ...

  4. 【深度学习的数学】接“2×3×1层带sigmoid激活函数的神经网络感知机对三角形平面的分类训练预测”,输出层加偏置b

    文章目录 代码 接:[深度学习的数学]2×3×1层带sigmoid激活函数的神经网络感知机对三角形平面的分类训练预测(绘制出模型结果三维图展示效果)(梯度下降法+最小二乘法+激活函数sigmoid+误 ...

  5. ResNet网络的训练和预测

    ResNet网络的训练和预测 简介 Introduction 图像分类与CNN 图像分类 是指将图像信息中所反映的不同特征,把不同类别的目标区分开来的图像处理方法,是计算机视觉中其他任务,比如目标检测 ...

  6. 三两下实现NLP训练和预测,这四个框架你要知道

    作者 | 狄东林 刘元兴 朱庆福 胡景雯 编辑 | 刘元兴,崔一鸣 来源 | 哈工大SCIR(ID:HIT_SCIR) 引言 随着人工智能的发展,越来越多深度学习框架如雨后春笋般涌现,例如PyTorc ...

  7. ML之LoRDTRF:基于LoRDT(CART)RF算法对mushrooms蘑菇数据集(22+1,6513+1611)训练来预测蘑菇是否毒性(二分类预测)

    ML之LoR&DT&RF:基于LoR&DT(CART)&RF算法对mushrooms蘑菇数据集(22+1,6513+1611)训练来预测蘑菇是否毒性(二分类预测) 目录 ...

  8. DL之DNN:自定义2层神经网络TwoLayerNet模型(封装为层级结构)利用MNIST数据集进行训练、预测

    DL之DNN:自定义2层神经网络TwoLayerNet模型(封装为层级结构)利用MNIST数据集进行训练.预测 导读           计算图在神经网络算法中的作用.计算图的节点是由局部计算构成的. ...

  9. DL之DNN:自定义2层神经网络TwoLayerNet模型(计算梯度两种方法)利用MNIST数据集进行训练、预测

    DL之DNN:自定义2层神经网络TwoLayerNet模型(计算梯度两种方法)利用MNIST数据集进行训练.预测 导读 利用python的numpy计算库,进行自定义搭建2层神经网络TwoLayerN ...

最新文章

  1. Windows10+Virtual box+ubuntu17.10
  2. 终端复用命令行神器:tmux
  3. Visual Studio2019 应用程序无法正常启动0xc000007b
  4. 【2017-12-08】c#基础-程序开发思路初认识
  5. 启动weblogic的错误:Could not obtain an exclusive lock to the embedded LDAP data files directory...
  6. linux 提取ko文件,Linux获取so/ko文件版本号教程
  7. HD1561The more, The Better(树形DP+有依赖背包)
  8. 京瓷 打印 打印机 账户_UV打印机买回来成废铁?不是选择不对,而是你想太多了……...
  9. Python怎么使用beautifulsoup来从HTML片段中删除标签
  10. webpack4+node合并资源请求, 实现combo功能(二十三)
  11. kotlin 泛型约束
  12. 学会这个方法,轻松为PDF文件加密,快来码住
  13. 通达信软件里php文件在哪,通达信股票交易软件使用秘籍
  14. Unity使用tolua框架教程: LuaFramewrk
  15. JSONP 跨域原理
  16. Cb Vc 经典大讨论(很长的一篇文章!)?
  17. 云计算360度 微软专家纵论产业变革
  18. 还想贪小便宜?建议你先了解一下物联卡收费标准!
  19. 生成式对抗网络(GAN)实战——书法字体生成练习赛
  20. [HEOI2013]ALO

热门文章

  1. AlexNet 和 VGG-Net的区别
  2. 计算机毕业设计制作模仿网站的期末作业通过神器——各种扒站方法(网站,软件)
  3. java session事件,Java开发网 - 再论Session事件的捕获
  4. NSLog中格式符列表
  5. ueditor html中使用方法,vue集成百度UEditor富文本编辑器使用教程
  6. HDU - 6126 Give out candies
  7. 安卓-04-实例01-XML布局UI界面
  8. mysql快速导入5000万条数据过程记录(LOAD DATA INFILE方式)
  9. sulime text 常用快捷键总结
  10. Direct2D (3) : 使用浮点参数绘制基本图形