質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

570閲覧

SENet(CNN)がanaconda上でエラーが出ずに停止してしまう問題について

trafalbad

総合スコア303

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/04/06 10:08

SENet(CNN)を実装し、caifar10のデータをサンプルに読み込ませました。訓練画像1万枚です。

エラーは出ずに実装上は問題ないようなのですが、sess.run()を実行すると、エラーが出ずに止まってしまいます。

ローカルで動かしているのですが、
1、SENet自体が層が深く計算量が多いから
または
2、実装に問題がある

のどちらかだと思うのですが、エラーが出ずに止まる理由として何が考えられるのでしょうか?

思い当たることでもいいので、ご教授お願いします。

python

1import tensorflow as tf 2import os 3import math 4import numpy as np 5from tflearn.layers.conv import global_avg_pool 6from tensorflow.contrib.layers import batch_norm, flatten 7from tensorflow.contrib.framework import arg_scope 8 9weight_decay = 0.0005 10momentum = 0.9 11 12init_learning_rate = 0.1 13cardinality = 8 # how many split ? 14blocks = 3 # res_block ! (split + transition) 15depth = 64 # out channel 16 17reduction_ratio = 4 18 19batch_size = 128 20iteration = 391 21# 128 * 391 ~ 50,000 22 23test_iteration = 10 24 25training_flag = tf.placeholder(tf.bool) 26learning_rate = tf.placeholder(tf.float32, name='learning_rate') 27 28 29def conv_layer(input, filter, kernel, stride, padding='SAME', layer_name="conv"): 30 with tf.name_scope(layer_name): 31 network = tf.layers.conv2d(inputs=input, use_bias=False, filters=filter, kernel_size=kernel, strides=stride, padding=padding) 32 return network 33 34def Global_Average_Pooling(x): 35 return global_avg_pool(x, name='Global_avg_pooling') 36 37def Average_pooling(x, pool_size=[2,2], stride=2, padding='SAME'): 38 return tf.layers.average_pooling2d(inputs=x, pool_size=pool_size, strides=stride, padding=padding) 39 40def Fully_connected(x, units=9, layer_name='fully_connected') : 41 with tf.name_scope(layer_name) : 42 return tf.layers.dense(inputs=x, use_bias=False, units=units) 43 44def Batch_Normalization(x): 45 shape = x.get_shape().as_list() 46 assert len(shape) in [2, 4] 47 48 if len(shape) == 2: 49 batch_mean, batch_var = tf.nn.moments(x, [0]) 50 else: 51 batch_mean, batch_var = tf.nn.moments(x, [0, 1, 2]) 52 53 mean0, variance0 = tf.nn.moments(x, [0, 1, 2]) 54 return tf.nn.batch_normalization(x, mean0, variance0, None, None, 1e-5) 55 56 57class SE_ResNet(): 58 def __init__(self, x, training): 59 self.training = training 60 self.model = self.Build_SEnet(x) 61 62 def first_layer(self, x, scope): 63 with tf.name_scope(scope) : 64 x = conv_layer(x, filter=64, kernel=[3, 3], stride=1, layer_name=scope+'_conv1') 65 x = Batch_Normalization(x) 66 return tf.nn.relu(x) 67 68 def transform_layer(self, x, stride, scope): 69 with tf.name_scope(scope) : 70 x = conv_layer(x, filter=depth, kernel=[1,1], stride=1, layer_name=scope+'_conv1') 71 x = Batch_Normalization(x) 72 x = tf.nn.relu(x) 73 74 x = conv_layer(x, filter=depth, kernel=[3,3], stride=stride, layer_name=scope+'_conv2') 75 x = Batch_Normalization(x) 76 return tf.nn.relu(x) 77 78 79 def transition_layer(self, x, out_dim, scope): 80 with tf.name_scope(scope): 81 x = conv_layer(x, filter=out_dim, kernel=[1,1], stride=1, layer_name=scope+'_conv1') 82 return Batch_Normalization(x) 83 84 def split_layer(self, input_x, stride, layer_name): 85 with tf.name_scope(layer_name) : 86 layers_split = list() 87 for i in range(cardinality) : 88 splits = self.transform_layer(input_x, stride=stride, scope=layer_name + '_splitN_' + str(i)) 89 layers_split.append(splits) 90 91 return tf.concat(layers_split, axis=3) 92 93 def squeeze_excitation_layer(self, input_x, out_dim, ratio, layer_name): 94 with tf.name_scope(layer_name) : 95 96 97 squeeze = Global_Average_Pooling(input_x) 98 99 excitation = Fully_connected(squeeze, units=out_dim / ratio, layer_name=layer_name+'_fully_connected1') 100 excitation = tf.nn.relu(excitation) 101 excitation = Fully_connected(excitation, units=out_dim, layer_name=layer_name+'_fully_connected2') 102 excitation = tf.nn.sigmoid(excitation) 103 104 excitation = tf.reshape(excitation, [-1,1,1,out_dim]) 105 return input_x * excitation 106 107 def residual_layer(self, input_x, out_dim, layer_num, res_block=blocks): 108 # split + transform(bottleneck) + transition + merge 109 # input_dim = input_x.get_shape().as_list()[-1] 110 111 for i in range(res_block): 112 input_dim = int(np.shape(input_x)[-1]) 113 114 if input_dim * 2 == out_dim: 115 flag = True 116 stride = 2 117 channel = input_dim // 2 118 else: 119 flag = False 120 stride = 1 121 122 x = self.split_layer(input_x, stride=stride, layer_name='split_layer_'+layer_num+'_'+str(i)) 123 x = self.transition_layer(x, out_dim=out_dim, scope='trans_layer_'+layer_num+'_'+str(i)) 124 x = self.squeeze_excitation_layer(x, out_dim=out_dim, ratio=reduction_ratio, layer_name='squeeze_layer_'+layer_num+'_'+str(i)) 125 126 if flag is True : 127 pad_input_x = Average_pooling(input_x) 128 pad_input_x = tf.pad(pad_input_x, [[0, 0], [0, 0], [0, 0], [channel, channel]]) # [?, height, width, channel] 129 else : 130 pad_input_x = input_x 131 132 input_x = tf.nn.relu(x + pad_input_x) 133 134 return input_x 135 136 137 def Build_SEnet(self, input_x): 138 # only cifar10 architecture 139 140 input_x = self.first_layer(input_x, scope='first_layer') 141 142 x = self.residual_layer(input_x, out_dim=64, layer_num='1') 143 x = self.residual_layer(x, out_dim=128, layer_num='2') 144 x = self.residual_layer(x, out_dim=256, layer_num='3') 145 146 x = Global_Average_Pooling(x) 147 x = flatten(x) 148 149 return Fully_connected(x, layer_name='final_fully_connected') 150 151 152 153def loss(logits, labels): 154 labels = tf.cast(labels, tf.int64) 155 cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=logits, labels=labels, name='cross_entropy_per_example') 156 cross_entropy_mean = tf.reduce_mean(cross_entropy, name='cross_entropy__raw_') 157 tf.add_to_collection('losses', cross_entropy_mean) 158 # The total loss is defined as the cross entropy loss plus all of the weight(L2 loss) 159 return tf.add_n(tf.get_collection('losses'), name='total_loss') 160 161 162# In[4]: # train using AdamOptimizer 163 164 165def train(total_loss, global_step): 166 167 loss_averages = tf.train.ExponentialMovingAverage(0.9, name='avg') 168 losses = tf.get_collection('losses') 169 loss_averages_op = loss_averages.apply(losses + [total_loss]) 170 171 172 # Compute gradients. 173 with tf.control_dependencies([loss_averages_op]): 174 opt = tf.train.AdamOptimizer() # instead of tf.train.AdamOptimizer() 175 grads = opt.compute_gradients(total_loss) 176 177 # Apply gradients. 178 apply_gradient_op = opt.apply_gradients(grads, global_step=global_step) 179 for var in tf.trainable_variables(): 180 tf.summary.histogram(var.op.name, var) 181 182 for grad, var in grads: 183 if grad is not None: 184 tf.summary.histogram(var.op.name + '/gradients', grad) 185 186 # Track the moving averages of all trainable variables. 187 variable_averages = tf.train.ExponentialMovingAverage(0.9999, global_step) 188 variables_averages_op = variable_averages.apply(tf.trainable_variables()) 189 190 with tf.control_dependencies([apply_gradient_op, variables_averages_op]): 191 train_op = tf.no_op(name='train') 192 193 return train_op # Op for training. 194 195 196# 実行 197with tf.Graph().as_default(): 198 global_step = tf.contrib.framework.get_or_create_global_step() 199 # for train 200 train_image, train_label = distorted_inputs('/Users/Downloads/train.tfrecords',128) # データ読み込み関数で画像とラベルを返す。 201 202 c_logits = SE_ResNet(train_image, training=training_flag).model 203 loss = loss(c_logits, train_label) 204 train_op = train(loss, global_step) 205 206 class _LoggerHook(tf.train.SessionRunHook): 207 def begin(self): 208 self._step = -1 209 self._start_time = time.time() 210 211 def before_run(self, run_context): 212 self._step += 1 213 return tf.train.SessionRunArgs(loss) # Asks for loss value. 214 215 def after_run(self, run_context, run_values): 216 if self._step % 10 == 0: 217 current_time = time.time() 218 duration = current_time - self._start_time 219 self._start_time = current_time 220 221 loss_value = run_values.results 222 examples_per_sec = 10 * 128 / duration 223 sec_per_batch = float(duration / 10) 224 225 format_str = ('%s: step %d, loss = %.2f (%.1f examples/sec; %.3f ' 226 'sec/batch)') 227 print (format_str % (datetime.now(), self._step, loss_value, 228 examples_per_sec, sec_per_batch)) 229 with tf.train.MonitoredTrainingSession(checkpoint_dir='/Users/Downloads/senet_dir', 230 hooks=[tf.train.StopAtStepHook(last_step=4000), 231 tf.train.NanTensorHook(loss), _LoggerHook()], config=tf.ConfigProto(log_device_placement=False)) as mon_sess: 232 while not mon_sess.should_stop(): 233 mon_sess.run(train_op) 234 235 236>>>エラーが出ずに止まる 237Filling queue with 4000 CIFAR images before starting to train. This will take a few minutes. (データ読み込み関数に書いたメッセージ) 238

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mkgrei

2018/04/06 12:30

とりあえず停止している時間によるかと思います。メモリーが足りないと環境によってはスワップが発生してより一層処理が遅くなります。
trafalbad

2018/04/06 13:14 編集

実は重い時と違って止まり方が特殊で重いときは左のワクの中が、アスタリスクマークになったままなんですが、今回はすぐに処理完了の数字になるんです。コード見て思ったのですが、monsessのとこで定義してあるtime()を書いてないからスタートしてないだけなのでしょうか?
mkgrei

2018/04/07 16:07

distorted_inputsでロードしていますが、この関数の中身が載せられていません。どのような処理をしているのでしょうか。
guest

回答1

0

ベストアンサー

最後の実行を行うwith文のインデントが_LoggerHookのメソッドの中に入ってしまっているので、実行されていません。


実行されるとリソースエラーが出ます。
バッチ処理が実装されていないように見えます。

投稿2018/04/08 01:18

編集2018/04/08 01:21
mkgrei

総合スコア8560

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

trafalbad

2018/04/08 01:43

ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問