无法为从图中加载的张量变量赋值 [英] Cannot assign value to tensor variable loaded from graph

查看:26
本文介绍了无法为从图中加载的张量变量赋值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经训练了一个模型并保存了它.现在,我正在尝试查看权重扰动如何影响其准确性,因此我需要修改保存在我的权重变量中的值,从而基本上向其添加一些噪音.问题是我无法在加载它们后为它们分配值.我正在使用 tensorflow 1.2.1 版来训练和加载模型.这是我的代码:

I've trained a model and saved it. Now, I'm trying to see how weights perturbations might affect its accuracy, so I need to modify the values saved on my weights variables essentially adding some noise to it. The problem is that I can't assign a value to them after I've loaded them. I'm using tensorflow version 1.2.1., to train and load the model. Here is my code:

import tensorflow as tf
tf.reset_default_graph()
sess = tf.InteractiveSession()
saver = tf.train.import_meta_graph('/scratch/pedro/TFModels/Checks_and_Logs/20170803_215828/beta_model-1.meta')
print("Graph restored")
saver.restore(sess, tf.train.latest_checkpoint('/scratch/pedro/TFModels/Checks_and_Logs/20170803_215828/'))
print("Model restored")
tf.global_variables() #prints the list of variables in the graph

这会产生以下输出:

[<tf.Variable 'FF_NN/Model/hidden_layer_1/weights/Variable:0' shape=(3960, 256) dtype=float32_ref>,
 <tf.Variable 'FF_NN/Model/hidden_layer_1/bias/bias_hidden_layer_1:0' shape=(256,) dtype=float32_ref>,
 <tf.Variable 'FF_NN/Model/hidden_layer_2/weights/Variable:0' shape=(256, 256) dtype=float32_ref>,
 <tf.Variable 'FF_NN/Model/hidden_layer_2/bias/bias_hidden_layer_2:0' shape=(256,) dtype=float32_ref>,
 <tf.Variable 'FF_NN/Model/hidden_layer_3/weights/Variable:0' shape=(256, 256) dtype=float32_ref>,
 <tf.Variable 'FF_NN/Model/hidden_layer_3/bias/bias_hidden_layer_3:0' shape=(256,) dtype=float32_ref>,
 <tf.Variable 'FF_NN/Model/output_layer/weights/Variable:0' shape=(256, 5) dtype=float32_ref>,
 <tf.Variable 'FF_NN/Model/output_layer/bias/bias_output_layer:0' shape=(5,) dtype=float32_ref>,
 <tf.Variable 'FF_NN/Model/Training/Optimizer/Variable:0' shape=() dtype=int32_ref>,
 <tf.Variable 'FF_NN/Model/Training/Optimizer/beta1_power:0' shape=() dtype=float32_ref>,
 <tf.Variable 'FF_NN/Model/Training/Optimizer/beta2_power:0' shape=() dtype=float32_ref>,
 <tf.Variable 'FF_NN/Model/Training/Optimizer/FF_NN/Model/hidden_layer_1/weights/Variable/Adam:0' shape=(3960, 256) dtype=float32_ref>,
 <tf.Variable 'FF_NN/Model/Training/Optimizer/FF_NN/Model/hidden_layer_1/weights/Variable/Adam_1:0' shape=(3960, 256) dtype=float32_ref>,
 <tf.Variable 'FF_NN/Model/Training/Optimizer/FF_NN/Model/hidden_layer_1/bias/bias_hidden_layer_1/Adam:0' shape=(256,) dtype=float32_ref>,
 <tf.Variable 'FF_NN/Model/Training/Optimizer/FF_NN/Model/hidden_layer_1/bias/bias_hidden_layer_1/Adam_1:0' shape=(256,) dtype=float32_ref>,
 <tf.Variable 'FF_NN/Model/Training/Optimizer/FF_NN/Model/hidden_layer_2/weights/Variable/Adam:0' shape=(256, 256) dtype=float32_ref>,
 <tf.Variable 'FF_NN/Model/Training/Optimizer/FF_NN/Model/hidden_layer_2/weights/Variable/Adam_1:0' shape=(256, 256) dtype=float32_ref>,
 <tf.Variable 'FF_NN/Model/Training/Optimizer/FF_NN/Model/hidden_layer_2/bias/bias_hidden_layer_2/Adam:0' shape=(256,) dtype=float32_ref>,
 <tf.Variable 'FF_NN/Model/Training/Optimizer/FF_NN/Model/hidden_layer_2/bias/bias_hidden_layer_2/Adam_1:0' shape=(256,) dtype=float32_ref>,
 <tf.Variable 'FF_NN/Model/Training/Optimizer/FF_NN/Model/hidden_layer_3/weights/Variable/Adam:0' shape=(256, 256) dtype=float32_ref>,
 <tf.Variable 'FF_NN/Model/Training/Optimizer/FF_NN/Model/hidden_layer_3/weights/Variable/Adam_1:0' shape=(256, 256) dtype=float32_ref>,
 <tf.Variable 'FF_NN/Model/Training/Optimizer/FF_NN/Model/hidden_layer_3/bias/bias_hidden_layer_3/Adam:0' shape=(256,) dtype=float32_ref>,
 <tf.Variable 'FF_NN/Model/Training/Optimizer/FF_NN/Model/hidden_layer_3/bias/bias_hidden_layer_3/Adam_1:0' shape=(256,) dtype=float32_ref>,
 <tf.Variable 'FF_NN/Model/Training/Optimizer/FF_NN/Model/output_layer/weights/Variable/Adam:0' shape=(256, 5) dtype=float32_ref>,
 <tf.Variable 'FF_NN/Model/Training/Optimizer/FF_NN/Model/output_layer/weights/Variable/Adam_1:0' shape=(256, 5) dtype=float32_ref>,
 <tf.Variable 'FF_NN/Model/Training/Optimizer/FF_NN/Model/output_layer/bias/bias_output_layer/Adam:0' shape=(5,) dtype=float32_ref>,
 <tf.Variable 'FF_NN/Model/Training/Optimizer/FF_NN/Model/output_layer/bias/bias_output_layer/Adam_1:0' shape=(5,) dtype=float32_ref>]

所以,我一直在尝试修改第一个 (FF_NN/Model/hidden_​​layer_1/weights/Variable:0) 但这给了我一个错误:

So, I've been trying to modify the first one ( FF_NN/Model/hidden_layer_1/weights/Variable:0) but that gives me an error:

x = data_train[:batch_size]
y = data_train_labels[:batch_size]
graph = tf.get_default_graph()
data_train_tensor = graph.get_tensor_by_name("Train_Dataset:0")
data_train_labels_onehot = graph.get_tensor_by_name("Train_Labels:0")
acc_te = graph.get_tensor_by_name("Test_Data_Accuracy/Mean:0")
acc_tr = graph.get_tensor_by_name("Train_Data_Accuracy/Mean:0")


w1 = graph.get_tensor_by_name("FF_NN/Model/hidden_layer_1/weights/Variable:0")
print('w1:\n', w1.eval())
training_acc, test_acc = sess.run([acc_tr, acc_te], feed_dict={data_train_tensor: x, data_train_labels_onehot: y})
print(test_acc)

w1 = w1 + 50
print('w1:\n', w1.eval())
sess.run(w1.assign(w1))
training_acc, test_acc, _ = sess.run([acc_tr, acc_te, w1], feed_dict={data_train_tensor: x, data_train_labels_onehot: y})
print(test_acc) 

这让我在分配操作中出错:

This gives me an error in the assign operation:

w1:
 [[-0.0531723   0.73768502  0.14098917 ...,  1.67111528  0.2495033
   0.20415793]
 [ 1.20964873 -0.99254322 -3.01407313 ...,  0.40427083  0.33289135
   0.2326804 ]
 [ 0.70157909 -1.61257529 -0.59762233 ...,  0.20860809 -0.02733657
   1.57942903]
 ..., 
 [ 1.23854971 -2.28062844 -1.01647282 ...,  1.18426156  0.65342903
  -0.45519635]
 [ 1.02164841 -0.11143603  1.71673298 ..., -0.85511237  1.15535712
   0.50917912]
 [-2.52524352 -0.04488864  0.66239733 ..., -0.45516238 -0.76003599
  -1.2073245 ]]
0.242335
w1:
 [[ 49.94682693  50.73768616  50.1409874  ...,  51.67111588  50.24950409
   50.20415878]
 [ 51.20964813  49.00745773  46.98592758 ...,  50.40427017  50.33288956
   50.23268127]
 [ 50.70158005  48.38742447  49.40237808 ...,  50.20860672  49.97266388
   51.57942963]
 ..., 
 [ 51.23854828  47.7193718   48.98352814 ...,  51.18426132  50.65342712
   49.54480362]
 [ 51.02164841  49.88856506  51.71673203 ...,  49.14488602  51.15535736
   50.50917816]
 [ 47.47475815  49.95511246  50.66239548 ...,  49.54483795  49.23996353
   48.79267502]]
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-34-da5d05216392> in <module>()
     16 w1 = w1 +50
     17 print('w1:\n', w1.eval())
---> 18 sess.run(w1.assign(w1))
     19 #print('w1:\n', w1.eval())
     20 training_acc, test_acc, _ = sess.run([acc_tr, acc_te, w1], feed_dict={data_train_tensor: x, data_train_labels_onehot: y})

AttributeError: 'Tensor' object has no attribute 'assign'

根据 tf.global_variables() 的输出,所有类似的问题都指出 w1 应该是 tf.Variable 类型,这里似乎就是这种情况.

All the similar questions point out to the fact that w1 should be a tf.Variable type and that seems to be the case here, according to the output of tf.global_variables().

推荐答案

以下代码将起作用.使用 get_variable

following code would work. best way to use get_variable

w1 = tf.get_variable("FF_NN/Model/hidden_layer_1/weights/Variable:0")
sess.run(tf.assign(w1, w1+50))

目前这一步不起作用,这是 tensorflow 中的一个错误 https://github.com/tensorflow/tensorflow/issues/1325

FOR now this step won't work, this is a bug in tensorflow https://github.com/tensorflow/tensorflow/issues/1325

一个可行的解决方案:

w1 = [v for v in tf.global_variables() if v.name=="FF_NN/Model/hidden_layer_1/weights/Variable:0"][0]
sess.run(tf.assign(w1, w1+50))

这篇关于无法为从图中加载的张量变量赋值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆