tensorflow: speichern und wiederherstellen der Sitzung
Ich versuche umzusetzen, ein Vorschlag aus den Antworten:
Tensorflow: wie speichern/wiederherstellen-ein Modell???
Ich habe ein Objekt, das umschließt eine tensorflow
Modell in einer sklearn
Stil.
import tensorflow as tf
class tflasso():
saver = tf.train.Saver()
def __init__(self,
learning_rate = 2e-2,
training_epochs = 5000,
display_step = 50,
BATCH_SIZE = 100,
ALPHA = 1e-5,
checkpoint_dir = "./",
):
...
def _create_network(self):
...
def _load_(self, sess, checkpoint_dir = None):
if checkpoint_dir:
self.checkpoint_dir = checkpoint_dir
print("loading a session")
ckpt = tf.train.get_checkpoint_state(self.checkpoint_dir)
if ckpt and ckpt.model_checkpoint_path:
self.saver.restore(sess, ckpt.model_checkpoint_path)
else:
raise Exception("no checkpoint found")
return
def fit(self, train_X, train_Y , load = True):
self.X = train_X
self.xlen = train_X.shape[1]
# n_samples = y.shape[0]
self._create_network()
tot_loss = self._create_loss()
optimizer = tf.train.AdagradOptimizer( self.learning_rate).minimize(tot_loss)
# Initializing the variables
init = tf.initialize_all_variables()
" training per se"
getb = batchgen( self.BATCH_SIZE)
yvar = train_Y.var()
print(yvar)
# Launch the graph
NUM_CORES = 3 # Choose how many cores to use.
sess_config = tf.ConfigProto(inter_op_parallelism_threads=NUM_CORES,
intra_op_parallelism_threads=NUM_CORES)
with tf.Session(config= sess_config) as sess:
sess.run(init)
if load:
self._load_(sess)
# Fit all training data
for epoch in range( self.training_epochs):
for (_x_, _y_) in getb(train_X, train_Y):
_y_ = np.reshape(_y_, [-1, 1])
sess.run(optimizer, feed_dict={ self.vars.xx: _x_, self.vars.yy: _y_})
# Display logs per epoch step
if (1+epoch) % self.display_step == 0:
cost = sess.run(tot_loss,
feed_dict={ self.vars.xx: train_X,
self.vars.yy: np.reshape(train_Y, [-1, 1])})
rsq = 1 - cost / yvar
logstr = "Epoch: {:4d}\tcost = {:.4f}\tR^2 = {:.4f}".format((epoch+1), cost, rsq)
print(logstr )
self.saver.save(sess, self.checkpoint_dir + 'model.ckpt',
global_step= 1+ epoch)
print("Optimization Finished!")
return self
Wenn ich laufen:
tfl = tflasso()
tfl.fit( train_X, train_Y , load = False)
Bekomme ich die Ausgabe:
Epoch: 50 cost = 38.4705 R^2 = -1.2036
b1: 0.118122
Epoch: 100 cost = 26.4506 R^2 = -0.5151
b1: 0.133597
Epoch: 150 cost = 22.4330 R^2 = -0.2850
b1: 0.142261
Epoch: 200 cost = 20.0361 R^2 = -0.1477
b1: 0.147998
Jedoch, wenn ich versuche, wiederherstellen der Parameter (auch ohne zu töten das Objekt):
tfl.fit( train_X, train_Y , load = True)
Bekomme ich seltsame Ergebnisse. Zunächst werden die geladenen Wert entspricht nicht dem gespeicherten ein.
loading a session
loaded b1: 0.1 <------- Loaded another value than saved
Epoch: 50 cost = 30.8483 R^2 = -0.7670
b1: 0.137484
Was ist der richtige Weg, zu laden, und wahrscheinlich prüfen Sie zunächst die gespeicherte Variablen?
- tensorflow Dokumentation ist frei von ziemlich einfache Beispiele, die Sie haben zu Graben in den Beispiele-Ordner und Sinn machen Sie es meist auf Ihre eigenen
Du musst angemeldet sein, um einen Kommentar abzugeben.
TL;DR: sollten Sie versuchen, Nacharbeit dieser Klasse, so dass
self.create_network()
genannt wird (i) nur einmal, und (ii) vor dertf.train.Saver()
aufgebaut ist.Gibt es zwei geringfügige Probleme hier, die sind durch die code-Struktur und das Standardverhalten des
tf.Zug.Saver
constructor. Wenn Sie konstruieren ein Bildschirmschoner ohne Argumente (wie in deinem code), es speichert den aktuellen Satz von Variablen im Programm, und fügt ops, um das Diagramm zu speichern und wiederherstellen. In Ihrem code, wenn Sie anrufentflasso()
ist, wird es bauen ein Bildschirmschoner, und es werden keine Variablen (weilcreate_network()
wurde noch nicht genannt). Als Ergebnis der checkpoint sollte leer sein.Das zweite Problem ist, dass standardmäßig das format einer gespeicherten checkpoint ist eine Karte aus dem
name
- Eigenschaft einer Variablen auf den aktuellen Wert. Wenn Sie erstellen Sie zwei Variablen mit dem gleichen Namen, werden Sie automatisch "uniquified" von TensorFlow:Die Folge davon ist, dass, wenn Sie nennen
self.create_network()
im zweiten Aufruftfl.fit()
, die Variablen haben alle verschiedene Namen aus der Namen, die gespeichert werden in der checkpoint—oder gewesen wäre, wenn der Sparer-aufgebaut worden, nachdem das Netzwerk. (Sie können dieses Verhalten vermeiden, indem ein name-Variable
Wörterbuch-saver-Konstruktor, aber das ist meist Recht umständlich.)Gibt es zwei workarounds:
In jeder Aufruf
tflasso.fit()
erstellen Sie das gesamte Modell neu definieren ein neuestf.Graph
, dann in das Diagramm das Netzwerk und die Schaffung einestf.train.Saver
.EMPFOHLEN Erstellen Sie das Netzwerk, dann die
tf.train.Saver
imtflasso
Konstruktor, und Wiederverwendung dieses Diagramm bei jedem Aufruftflasso.fit()
. Beachten Sie, dass müssen Sie möglicherweise ein wenig mehr Arbeit neu zu organisieren Dinge (insbesondere, ich bin mir nicht sicher, was Sie tun, mitself.X
undself.xlen
), aber es sollte möglich sein, dies zu erreichen mit Platzhalter und Fütterung.xlen
innerhalbself._create_network()
um die input-GrößeX
(Platzhalter init:self.vars.xx = tf.placeholder("float", shape=[None, self.xlen])
). Von dem, was Sie sagen, der bevorzugte Weg ist, um passxlen
an den Initialisierer.tf.Graph
und stellen Sie es als Standard, bevor Sie (i) erstellen Sie das Netzwerk, und (ii) machen Sie eineSaver
. Wenn Sie wickeln den Körper dertflasso.fit()
imwith tf.Graph().as_default():
block, und bewegen Sie denSaver
Bau innerhalb dieses Blocks, die Namen sollten die gleichen sein, jedes mal, wenn Sie anrufenfit()
.