tensorflow使用已经保存的模型, 必须要在开始之前预先初始化变量. 不知道有没有更加简单的方法哦, 但是我时间比较紧, 就只有用这种最笨的方法了.
好了, 步入正题, 如何初始化保存的模型里的变量呢? 补充: 是初始化所有的变量! ! ! 所有的! ! !
我今天弄了一上午, 一开始是什么都不懂, 不懂要先初始化, 并且也不知道一定要初始化所有的变量, 后面才能够得到我想要的, 所以折腾了很久.
我的模型是用别人的代码训练的, 他是直接用 saver.save() 保存了所有的东西, 包括使用Adam优化后得到的值, 以及权值和偏移值.
因此既然我不知道模型里面有什么, 我就要先打印出来名字, 看看里面到底有些什么.
import tensorflow as tf
model_address = '/home/dbliu/Deep_Matrix_Factorization_Models/test/Valified_Code_Classify/Classified/model/model.ckpt'
reader = tf.train.NewCheckpointReader(model_address )
all_variables = reader.get_variable_to_shape_map()
print("hello")
for v in all_variables:
print(v)
打印的结果是:
beta1_power
User_Layer/user_b2/Adam_1
User_Layer/user_b2/Adam
User_Layer/user_W2/Adam_1
User_Layer/user_W1/Adam
User_Layer/user_W2
Item_Layer/item_W1
Item_Layer/item_W1/Adam
Item_Layer/item_b2/Adam_1
Item_Layer/item_W2
beta2_power
Item_Layer/item_W1/Adam_1
User_Layer/user_W1/Adam_1
Item_Layer/item_b2/Adam
User_Layer/user_b2
User_Layer/user_W1
Item_Layer/item_W2/Adam_1
User_Layer/user_W2/Adam
Item_Layer/item_W2/Adam
Item_Layer/item_b2
好长好长的一大串…我就开始了挨个初始化…(真是漫长的工作, 其中我有一次还输入错了变量的名字, 然后模型就加载不出来呀, 可我又不认真看报错, 真是折腾了好久. )
初始化的语句是:
User_Layer_user_b2_Adam_1 = tf.get_variable("User_Layer/user_b2/Adam_1", shape=[64])
这是一个例子, 我给每个变量都弄了一次, 太长了, 在这里就不贴了.
好了, 问题来了, shape是需要自己事先就写出来的, 但是我用的是人家的模型, 我也不知道人家的变量是个啥形状. 我现在就只知道两种方法, 要不就仔细看看源代码, 优化的变量和被优化的变量维度相同. 或者就直接先运行, 它会报InvalidArgumentError这个错误,
InvalidArgumentError (see above for traceback): Assign requires shapes of both tensors to match. lhs shape= [512] rhs shape= [3952,512]
lhs shape = [] 是我原来的错误的维度, rhs shape = [ ] 这个就是正确的维度啦!
然后就修改维度就行了.
再后面就可以正确运行了, 在新建的session里面可以顺利打印出来权值或者偏移量.
附上全部代码:
#!/usr/bin/env python
# _*_coding:utf-8 _*_
#@Time :2019/3/27 20:23
#@Author :Liu Dingbo
#@FileName: use_dmf_model.py
#@Function:
import tensorflow as tf
import numpy as np
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' # 默认使用显卡
dir = "/home/dbliu/Deep_Matrix_Factorization_Models"
reader = tf.train.NewCheckpointReader(dir+"/checkPoint/model")
all_variables = reader.get_variable_to_shape_map()
print("hello")
for v in all_variables:
print(v)
User_Layer_user_b2_Adam_1 = tf.get_variable("User_Layer/user_b2/Adam_1", shape=[64])
User_Layer_user_b2_Adam =tf.get_variable("User_Layer/user_b2/Adam", shape=[64])
User_Layer_user_W2_Adam_1 =tf.get_variable("User_Layer/user_W2/Adam_1", shape=[512,64])
User_Layer_user_W1_Adam =tf.get_variable("User_Layer/user_W1/Adam", shape=[3952,512])
User_Layer_user_W1_Adam_1 =tf.get_variable("User_Layer/user_W1/Adam_1", shape=[3952,512])
User_Layer_user_W2_Adam =tf.get_variable("User_Layer/user_W2/Adam", shape=[512,64])
User_Layer_user_W2 =tf.get_variable("User_Layer/user_W2", shape=[512, 64])
User_Layer_user_W1 =tf.get_variable("User_Layer/user_W1", shape=[3952, 512])
User_Layer_user_b2 =tf.get_variable("User_Layer/user_b2", shape=[64])
Item_Layer_item_W1 =tf.get_variable("Item_Layer/item_W1", shape=[6040,1024])
Item_Layer_item_W2 =tf.get_variable("Item_Layer/item_W2", shape=[1024,64])
Item_Layer_item_b2 =tf.get_variable("Item_Layer/item_b2", shape=[64])
beta2_power =tf.get_variable("beta2_power", shape=[])
beta1_power = tf.get_variable("beta1_power", shape=[])
Item_Layer_item_W1_Adam =tf.get_variable("Item_Layer/item_W1/Adam", shape=[6040, 1024])
Item_Layer_item_b2_Adam_1 =tf.get_variable("Item_Layer/item_b2/Adam_1", shape=[64])
Item_Layer_item_W1_Adam_1 =tf.get_variable("Item_Layer/item_W1/Adam_1", shape=[6040, 1024])
Item_Layer_item_b2_Adam =tf.get_variable("Item_Layer/item_b2/Adam", shape=[64])
Item_Layer_item_W2_Adam_1 =tf.get_variable("Item_Layer/item_W2/Adam_1", shape=[1024,64])
Item_Layer_item_W2_Adam =tf.get_variable("Item_Layer/item_W2/Adam", shape=[1024,64])
saver = tf.train.Saver()
with tf.Session() as sess:
# new_saver = tf.train.import_meta_graph(dir+"/checkPoint/model.meta")
saver.restore(sess, dir+"/checkPoint/model")
print("Model restored.")
print(sess.run(Item_Layer_item_b2))
# print(sess.run('user_W1:0'))
# print(sess.run('user_b2:0'))