2016-07-28 8 views
0

TFLearnとTensorflowを使用してCNNを実行しています。私の現在のアプローチは、トレーニングとテストの間でバッチサイズが変わるため、実行ごとにモデルを再構築しています。私はいくつかの記憶上の問題に気づいた後、さらに調査したところ、グラフを再利用できると思うすべてを行っているにもかかわらず、各実行時にグラフ全体を再作成していました。私はデフォルトのグラフを使用していません、私はすべてのトレーニングを通して私のグラフの同じインスタンスを保持しています、そして、すべての変数は再利用がtrueに設定されています。私のTensorboardの出力で見ることができるように、私は2回目のトレーニングエポック後に2セットすべてを持っています。私は最初のセットだけを再利用するために何ができるのですか?Tensorflowがグラフを再作成しても新しい変数を作成する

def build_and_run_model(self, num_labels, data, labels, holdout, holdout_labels, batch_size, checkpoint_directory=None, checkpoint_file=None, restore=False, 
         num_epochs=10, train=True, image_names=None, gpu_memory_fraction=0): 
    if not self.graph: 
     self.graph = tf.Graph() 

    with tf.Session(config=tf.ConfigProto(log_device_placement=False), graph=self.graph) as session: 
     tflearn.config.is_training(train, session) 

     if train: 
      keep_prob = .8 
     else: 
      keep_prob = 1 

     # Building 'AlexNet' 
     network = input_data(shape=[None, 227, 227, 3]) 
     network = conv_2d(network, 96, 11, strides=4, activation='relu') 
     network = max_pool_2d(network, 3, strides=2) 
     network = local_response_normalization(network) 
     network = conv_2d(network, 256, 5, activation='relu') 
     network = max_pool_2d(network, 3, strides=2) 
     network = local_response_normalization(network) 
     network = conv_2d(network, 384, 3, activation='relu') 
     network = conv_2d(network, 384, 3, activation='relu') 
     network = conv_2d(network, 256, 3, activation='relu') 
     network = max_pool_2d(network, 3, strides=2) 
     network = local_response_normalization(network) 
     network = fully_connected(network, 4096, activation='tanh') 
     network = dropout(network, keep_prob) 
     network = fully_connected(network, 4096, activation='tanh') 
     network = dropout(network, keep_prob) 
     network = fully_connected(network, num_labels, activation='softmax') 
     network = regression(network, optimizer="adam", 
          loss='categorical_crossentropy', 
          learning_rate=self.build_learning_rate(), batch_size=batch_size) 

     if not self.model: 
      model = self.model = tflearn.DNN(network, tensorboard_dir="./tflearn_logs/", checkpoint_path=checkpoint_directory + checkpoint_file, tensorboard_verbose=3) 

     else: 
      model = self.model 

     if restore | (not train): 
      logger.info("Restoring checkpoint from ' % s'." % (checkpoint_directory + checkpoint_file)) 
      ckpt = tf.train.get_checkpoint_state(checkpoint_directory) 
      logger.info("Loading variables from ' % s'." % ckpt.model_checkpoint_path) 
      model.load(ckpt.model_checkpoint_path) 
     else: 
      tf.initialize_all_variables().run() 

     if train: 
      model.fit(data, labels, n_epoch=int(num_epochs), shuffle=True, 
         show_metric=True, batch_size=batch_size, snapshot_step=None, 
         snapshot_epoch=True, run_id='alexnet_imagerecog') 

Tensorboard with duplicated model

答えて

0

私は、デフォルトのグラフが何を意味するかの誤解があったように見えます。私は、もし私がそのモデルを走らせるたびに上のようにグラフを作成したのであればグラフを作ったと思ったが、それはそうではないようだ。次のようにブロック内にモデルを作成するコードを変更しました。

tf.reset_default_graph() 
g = tf.Graph() 
with g.as_default() as g: 

この問題はもう表示されません。次のように

0

また、それを書くことができます:
with tf.Graph().as_default(), tf.Session() as session:

関連する問題