2016-09-28 119 views
2

我在TensorFlow中构建了一个简单的4层神经网络(2个隐藏层)。我没有使用由TensorFlow提供的内置NN,而是实现了我自己的基本版本。现在,为了保持W(权重)和B(偏见)张量的在一个地方,我建立了这些变量这样的字典:如何使用Saver对象在TensorFlow中保存变量字典?

weights = { 
    'h1': tf.Variable(tf.random_normal([n_input, n_hidden_1])), 
    'h2': tf.Variable(tf.random_normal([n_hidden_1, n_hidden_2])), 
    'out': tf.Variable(tf.random_normal([n_hidden_2, n_classes])) 
} 
biases = { 
    'b1': tf.Variable(tf.random_normal([n_hidden_1])), 
    'b2': tf.Variable(tf.random_normal([n_hidden_2])), 
    'out': tf.Variable(tf.random_normal([n_classes])) 
} 

后,我学会了这些参数,我想用节电器对象来拯救他们。我试过这个:

saver = tf.train.Saver([weights,biases]) 
save_path = saver.save(sess,"./data/model.ckpt") 

但是我没有成功这样做。看到的错误是:现在

TypeError: unhashable type: 'dict' 

,一个解决方案是将所有的变量分离:H1,H2,出,B1,B2,bias_out(出偏差字典)为单个变量,并将其保存,但这似乎是一个天真的方法。如果我后来有更多的变量需要杵在一起,我想保持这样,它更干净,更易于管理。如何将分组变量保存在一起?

回答

2

Tensorflow Saver不接受字典列表。也许你应该尝试merge your dictionaries first

parameters = weights.copy() 
parameters.update(bias) 

或(与Python 3.5)

parameters = {**weights,**bias} 

而在这之后:

saver = tf.train.Saver(parameters) 
save_path = saver.save(sess,"./data/model.ckpt") 

另一个解决方法:

saver = tf.train.Saver({name:variable for name,variable in weights.items()+bias.items()}) 
save_path = saver.save(sess,"./data/model.ckpt") 

的最后的解决方案可能有一些概率lem,就像“out”一样是权重和偏差的关键,所以似乎只有一个[“out”:variable]将被保存。

+0

这是我验证它的方法:使用'python inspect_checkpoint.py --file_name =“path/to/model/file”'。输出如下: (type_of_var1)[shape] 例如。 h1(DT_FLOAT)[784,256] – arshellium

+0

最后我用了这个虽然是正确的语法。 saver = tf.train.Saver({** weights,** biasses}) Thanks @corentin – arshellium