tensorflow2 训练和预测使用不同的输出层、获取权重参数
生活随笔
收集整理的這篇文章主要介紹了
tensorflow2 训练和预测使用不同的输出层、获取权重参数
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
目標:
youtubeNet通過訓(xùn)練tensorflow2時設(shè)置不同的激活函數(shù),訓(xùn)練和預(yù)測采用不同的分支,然后可以在訓(xùn)練和測試時,把模型進行分離,得到訓(xùn)練和預(yù)測時,某些層的參數(shù)不同。可以通過類似遷移學(xué)習(xí)的辦法實現(xiàn)。
第二,獲取訓(xùn)練模型的參數(shù)。
獲取模型參數(shù):
比較簡單,就是調(diào)用model.get_weights()。也可以用精確定位到某層,得到w_dense4 =model.get_layer('dense4').get_weights()
#獲取訓(xùn)練后的權(quán)重參數(shù)
weigts_parm = model.get_weights()
獲得的就是模型參數(shù)的每一層權(quán)重和偏置信息。
模型不同輸出:
想不到更好辦法,利用遷移學(xué)習(xí)的辦法,如果模型天生支持判斷是預(yù)測階段還是預(yù)測階段,就更好了。
原理就是:
- 模型構(gòu)建時,先構(gòu)建一個分支,一個用于訓(xùn)練train。
- 把要替換的層或者激活函數(shù)單獨擰出來。
- 利用模型打包compile時,把train都包含進模型。
- 利用train=train,這樣訓(xùn)練還是用到訓(xùn)練參數(shù)。
- 預(yù)測時,單獨新建一個model,去接收之前model某層的輸出。
- 添加上自己想要的層,如果需要重新訓(xùn)練,則重新compile,如果不想再訓(xùn)練,直接predict就好了。
由于預(yù)測的那個分支沒有經(jīng)過訓(xùn)練,所以一般只適用于對最后輸出層,采用了不同的輸出函數(shù),比如YouTube推薦模型,輸出層訓(xùn)練時用得weighted LR,而預(yù)測時用了e^x 激活函數(shù),這種方式就能實現(xiàn)訓(xùn)練時用一個激活函數(shù),預(yù)測時用另一個激活函數(shù)。
運行結(jié)果:
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、獲取模型某層的參數(shù),常常就是embedding向量
- 2、模型的不同輸出。采用遷移學(xué)習(xí)的辦法。
有更好的辦法可以提出。
總結(jié)
以上是生活随笔為你收集整理的tensorflow2 训练和预测使用不同的输出层、获取权重参数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: tensorflow 1.X迁移至ten
- 下一篇: win10安装部署网络测试工具 NetC