finetune主要采用此博客的方法:
https://blog.youkuaiyun.com/Alienge/article/details/81012363
同时非常感谢该博主
最近需要做个例子,先训练,然后测试,再finetune,再测试。训练和finetune不说了, 就是那个博客的方法了。可是那个网络,太隆昌了。其实我是不太喜欢这么复杂的算法的,不过要求用,只好用这个。这造成了我的一点不自信,毕竟例子是比较简单的,所以我进入不太好的的第一步,用pywrap_tensorflow查看模型:
from tensorflow.python import pywrap_tensorflow
import os
import sys
class Logger(object):
def __init__(self, filename="Default.log"):
self.terminal = sys.stdout
self.log = open(filename, "a")
def write(self, message):
self.terminal.write(message)
self.log.write(message)
def flush(self):
pass
type = sys.getfilesystemencoding()
sys.stdout = Logger('....txt')
checkpoint_path1 = ‘...’
reader1 = pywrap_tensorflow.NewCheckpointReader(checkpoint_path1)
var_to_shape_map1 = reader1.get_variable_to_shape_map()
for key1 in var_to_shape_map1:
print("tensor_name: ",key1)
print(reader1.get_tensor(key1))
我以后不想用这个方法去对比模型前后变化,我没用好,有时候输出挺正常的,有时候每个层的顺序是混乱的。而且finetune中以前某些层后面连了新层,以前的老层并没有删掉(怎么删掉老层??有人知道吗?关键是老层还一起训练了,这个解决以后再发一篇),老层和新层都一起输出了,造成总体上比较乱。除非设置要保存的层。搞这个浪费了一些时间。后来还是用了以上博客中的方法。那个方法刚开始没成功,后来把 value[i].all()==value[i+1].all()改成了(value[i]==value[i+1]).all(),结果正常。
weight_test = g.get_tensor_by_name('layer1/weights:0')
......
for i in range(epoch)
...
weight_test_value = sess.run(weight_test,feed_dict={x_place: batch_xs, y_place: batch_ys})
value.append(weight_test_value)
for i in range(len(value)-1):
if (value[i]==value[i+1]).all():
print("weight is equal")
不过这并没有让我成功使用finetune得到的model。于是引出来第二个大坑:tf.train.saver()
首先,我train了一个model,用saver()保存了。然后,我在finetune代码里,用saver()恢复了图,增加了一些新层,又restore了参数。但是后来,我一直在用这个同样的saver保存。其实我之前就实验过保存不同的list,但是当时脑抽,居然没想到这一点。后来加了个saver2 = tf.train.saver(),再保存,再用demo读取这个model去测试,就正常了。