2016-10-18 3 views
3

テンソルフローCIFAR10チュートリアルのサンプルコードにドロップアウトを追加しようとしていますが、難しかったです。TensorflowにDROPOUTを追加するCIFAR10ディープCNNの例

ディープMNISTテンソルフローチュートリアルにはドロップアウトの例が含まれていますが、CIFAR10チュートリアルのアプローチとは異なるインタラクティブグラフが使用されています。また、CIFAR10チュートリアルでは、プレースホルダを使用せず、feed_dictを使用してオプティマイザに変数を渡すこともありません。これは、MNISTモデルでトレーニングのドロップアウト確率を渡すために使用されます。

私は何をしようとしています:cifar10_train.train以内

は()私は、デフォルトのグラフの下で、ドロップアウトの確率プレースホルダを定義します。それは、次のとおりです。

def train(): 
    """Train CIFAR-10 for a number of steps.""" 
    with tf.Graph().as_default(): 
    global_step = tf.Variable(0, trainable=False) 
    keep_drop_prob = = tf.placeholder(tf.float32) 

下には、まだ電車()モジュール内で、私はcifar10.inferenceを呼び出すことにより、計算、グラフを作成するときに()私もそうのように、keep_drop_probプレースホルダを渡す:

"""Build a Graph that computes the logits predictions from the 
inference model.""" 
logits = cifar10.inference(images, keep_drop_prob) 

cifar10.inference()モジュールの中で、私は今渡されたkeep_drop_probプレースホルダを取り、それを使用するので、同じように、私のドロップアウト層を定義するには:

drop1 = tf.nn.dropout(norm1, keep_drop_prob) 

を今、私は定義し、KEの値を渡しますep_drop_probそのような、まだ電車内の()モジュールを損失の計算:そうのように、私のクロスエントロピーを計算するとき次に

"""Calculate loss.""" 
loss = cifar10.loss(logits, labels, keep_drop_prob = 0.5) 

cifar10.loss()モジュール内で、私は、渡されたkeep_drop_prob値を使用します。

"""Calculate the average cross entropy loss across the batch.""" 
labels = tf.cast(labels, tf.int64) 
cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(
    logits, labels, keep_drop_prob, name='cross_entropy_per_example') 

これまでのところ、私がこれまで行ってきたことが正しいか、次に何をする必要があるかは分かりません。

ご協力いただければ幸いです!

答えて

2

私は解決策を見つけたと信じています。

私は正しい軌道に乗っていたようですが、keep_drop_probプレースホルダを少し外に出て行ったようです。

は、私は、次行っているドロップアウトを追加する:ここに示されているように、私はcifar10_train.train()モジュール内keep_drop_probプレースホルダを追加

def train(): 
    """Train CIFAR-10 for a number of steps.""" 
    with tf.Graph().as_default(): 
    global_step = tf.Variable(0, trainable=False) 
    keep_drop_prob = = tf.placeholder(tf.float32) 

cifar10_train.trainのグラフを構築します私はそれをプレースホルダを渡すだけでなく、cifar10.inference()モジュール内にその値

"""Build a Graph that computes the logits predictions from the 
inference model.""" 
logits = cifar10.inference(images, keep_drop_prob=0.5) 

を定義し、私は今keep_drop_probのplaceholdを取る()モジュールえーそれが渡され、私のドロップアウト層を定義するためにそれを使用し、またtensorboardにログインするためのアクティベーションの概要にそれを渡した。

drop1 = tf.nn.dropout(norm1, keep_drop_prob) 
_activation_summary(drop1) 

私はtensorboardグラフで見てみると、私はそこに私のドロップアウトのOPを参照してください。また、ドロップアウト演算子のkeep_prob変数を調べて、logitsグラフを作成するときに渡した値を変更することで、value属性に影響を与えることができます。

私の次のテストでは、keep_drop_probを1に設定して0にして、ネットワークから期待される結果が得られるようにします。

これがドロップアウトを実装する最も効率的な方法であるとは確信していませんが、私はそれがうまく機能していると確信しています。

私は1つのkeep_drop_probプレースホルダしか持っていないので、ドロップアウトの多くのレイヤー(各コンボリューションatm後に1つ)に渡します。テンソルフローは、一意のプレースホルダを必要とするのではなく、各ドロップアウト演算に一意のディストリビューションを使用します。

編集:evalモジュールに必要な変更を加えることを忘れないでくださいが、ドロップアウトには値1を渡してください。

関連する問題