私は画像分類のためのおもちゃモデルを作りました。プログラムは、cifar10 tutorialのように緩やかに構成されています。トレーニングはうまく始まりますが、結局プログラムがクラッシュします。私は、どこかのオペレーションが追加されたときのためにグラフを完成させました。そして、テンソルボードでそれは素晴らしいように見えますが、最終的には凍結し、強制的に再起動します(または最終的な再起動を待つ)。出口はGPUメモリ問題のように見えるが、モデルは小さく、フィットしなければならない。もし私がGPUメモリ(別の4GBを与える)を割り当てると、クラッシュします。このテンソルフローコードがクラッシュするのはなぜですか?
データは256x256x3の画像で、ラベルはtfrecordsファイルに保存されています。トレーニング機能コードは次のようになります。
def loss(logits, labels):
xentropy = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=labels, logits=logits, name='cross_entropy_per_example')
xentropy_mean = tf.reduce_mean(xentropy, name='cross_entropy')
tf.add_to_collection('losses', xentropy_mean)
return xentropy_mean
def training(loss, global_step, learning_rate):
optimizer = tf.train.AdamOptimizer(learning_rate)
train_op = optimizer.minimize(loss, global_step=global_step)
return train_op
バッチは
def distorted_inputs(batch_size):
filename_queue = tf.train.string_input_producer(
['data/train.tfrecords'], num_epochs=None)
reader = tf.TFRecordReader()
_, serialized_example = reader.read(filename_queue)
features = tf.parse_single_example(serialized_example,
features={'label': tf.FixedLenFeature([], tf.int64),
'image': tf.FixedLenFeature([], tf.string)})
label = features['label']
label = tf.cast(label, tf.int32)
image = tf.decode_raw(features['image'], tf.uint8)
image = (tf.cast(image, tf.float32)/255) - 0.5
image = tf.reshape(image, shape=[256, 256, 3])
# data augmentation
image = tf.image.random_flip_up_down(image)
image = tf.image.random_flip_left_right(image)
print('filling the queue with {} images ' \
'before starting to train'.format(MIN_QUEUE_EXAMPLES))
return _generate_batch(image, label, MIN_QUEUE_EXAMPLES, BATCH_SIZE)
と
で生成されます。def train():
with tf.Graph().as_default():
global_step = tf.contrib.framework.get_or_create_global_step()
train_images_batch, train_labels_batch = distorted_inputs(batch_size=BATCH_SIZE)
train_logits = inference(train_images_batch)
train_batch_loss = loss(train_logits, train_labels_batch)
train_op = training(train_batch_loss, global_step, 0.1)
merged = tf.summary.merge_all()
saver = tf.train.Saver(tf.global_variables())
gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.75)
sess_config=tf.ConfigProto(gpu_options=gpu_options)
sess = tf.Session(config=sess_config)
train_summary_writer = tf.summary.FileWriter(
os.path.join(ROOT, 'logs', 'train'), sess.graph)
init = tf.global_variables_initializer()
sess.run(init)
coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(sess=sess, coord=coord)
tf.Graph().finalize()
for i in range(5540):
start_time = time.time()
summary, _, batch_loss = sess.run([merged, train_op, train_batch_loss])
duration = time.time() - start_time
train_summary_writer.add_summary(summary, i)
if i % 10 == 0:
msg = 'batch: {} loss: {:.6f} time: {:.8} sec/batch'.format(
i, batch_loss, str(time.time() - start_time))
print(msg)
coord.request_stop()
coord.join(threads)
sess.close()
損失とトレーニングopはそれぞれcross_entropyとアダム・オプティマイザです
def _generate_batch(image, label,
min_queue_examples=MIN_QUEUE_EXAMPLES,
batch_size=BATCH_SIZE):
images_batch, labels_batch = tf.train.shuffle_batch(
[image, label], batch_size=batch_size,
num_threads=12, capacity=min_queue_examples + 3 * BATCH_SIZE,
min_after_dequeue=min_queue_examples)
tf.summary.image('images', images_batch)
return images_batch, labels_batch
私は何が欠けていますか?
あなたは何を求めているのですか...うまくいかないのですか? – rmeertens
Windowsを実行している場合、windbgにクラッシュダンプをロードして、どのモジュールが故障しているかを確認できます。 –
プログラムは私のマシンをフリーズするまで、通常は800回以上繰り返した後に実行されます(バッチサイズ64または128は問題ありません)。だから、私は(GPU)のメモリリーク(RAMの使用率は全体的に安定している)と思われますが、どこに問題があるのか分かりません。 AFAIK以来、テンソルフロープログラムの実行中/実行中に詳細なGPUメモリ使用情報を取得する方法はありません。テンソルフローの経験がある人が自分のコードで犯人であると思っていますか?私はまだグラフモデルに少し慣れていません。役に立ったら、私はTesla k40でUbuntu 16.04、tf 1.0.0、python 3.5を実行しています。 –