5

遅延畳み込みニューラルネットワークを防止する方法は?私はKERASでトレーニングした後、「怠惰なCNN」で終わります。入力が何であれ、出力は一定です。問題は何だと思いますか?怠惰な畳み込みニューラルネットワークを防ぐには?

私はNVIDIAのセルフドライブカーのエンドツーエンドラーニングの実験を繰り返そうとしますthe paper。絶対に、私は本当の車を持っていませんが、Udacityのsimulatorです。シミュレータは、車の前景に関する図を生成します。

enter image description here

CNNは姿を受け取り、それがトラックに車を維持するために舵角を与えます。ゲームのルールは、シミュレートされたクルマの走行を安全に保つことです。それほど難しいことではありません。

奇妙なことは、KERASでトレーニングした後、怠惰なCNNで終わることがあります。これは一定のステアリング角度を与えます。シミュレートされた車はトリックを外しますが、CNNの出力には変化はありません。特に、層がより深くなる。 CNNはthe paperです。

このようなCNNを使用すると、トレーニング後に便利なモデルが得られます。

model = Sequential() 
model.add(Lambda(lambda x: x/255.0 - 0.5, input_shape = (160,320,3))) 
model.add(Cropping2D(cropping=((70,25),(0,0)))) 
model.add(Conv2D(24, 5, strides=(2, 2))) 
model.add(Activation('relu')) 
model.add(Conv2D(36, 5, strides=(2, 2))) 
model.add(Activation('relu')) 
model.add(Conv2D(48, 5, strides=(2, 2))) 
model.add(Activation('relu')) 
model.add(Flatten()) 
model.add(Dense(50)) 
model.add(Activation('sigmoid')) 
model.add(Dense(10)) 
model.add(Activation('sigmoid')) 
model.add(Dense(1)) 

しかし、深いCNNを使用すると、遅延CNNを受け取る機会が増えます。 具体的には、NVIDIAが好きなCNNを使用すると、トレーニングが終わるたびに怠惰なCNNが届きます。

model = Sequential() 
model.add(Lambda(lambda x: x/255.0 - 0.5, input_shape = (160,320,3))) 
model.add(Cropping2D(cropping=((70,25),(0,0)))) 
model.add(Conv2D(24, 5, strides=(2, 2))) 
model.add(Activation('relu')) 
model.add(Conv2D(36, 5, strides=(2, 2))) 
model.add(Activation('relu')) 
model.add(Conv2D(48, 5, strides=(2, 2))) 
model.add(Activation('relu')) 
model.add(Conv2D(64, 3, strides=(1, 1))) 
model.add(Activation('relu')) 
model.add(Conv2D(64, 3, strides=(1, 1))) 
model.add(Activation('relu')) 
model.add(Flatten()) 
model.add(Dense(1164)) 
model.add(Activation('sigmoid')) 
model.add(Dense(100)) 
model.add(Activation('sigmoid')) 
model.add(Dense(50)) 
model.add(Activation('sigmoid')) 
model.add(Dense(10)) 
model.add(Activation('sigmoid')) 
model.add(Dense(1)) 

Iは畳み込み層のための「relu」を使用し、完全に接続された層の活性化機能は、「シグモイド」です。私は活性化機能を変更しようとしますが、効果はありません。

私の分析があります。私はプログラムのバグに同意しません。なぜなら、同じコードと簡単なCNNで車を運転することができたからです。理由は、シミュレータまたはニューラルネットワークの構造だと思います。実際の自走車では、舵角であるトレーニング信号にノイズが含まれているはずです。そのため、運転者は実際の車道にまだ車輪を保持していない。しかし、シミュレータでは、トレーニング信号はきれいです。操舵角のほぼ60%はゼロです。オプティマイザは、CNNの出力をゼロに近づけることによって簡単にジョブを実行できます。オプティマイザも怠惰だと思われます。しかし、このCNNの出力が本当に必要なときには、ゼロも与えます。だから、私はこれらのゼロステアリング角度に小さなノイズを加えます。怠惰なCNNを取得する機会は少なくなりますが、それは消えていません。

私の分析についてどう思いますか?私が使用できる他の戦略はありますか? CNNの研究の長い歴史のなかで、同様の問題が解決されたのかどうか疑問に思っています。

リソース

関連するファイルはGitHubにアップロードされています。これらのファイルを使って実験全体を繰り返すことができます。

+0

関連ファイルは[GitHub] https://github.com/BlueBirdHouse/CarND-Behavioral-Cloning-P3/にアップロードされています。これらのファイルを使って実験全体を繰り返すことができます。 –

+0

コメントスペースを使用して質問を更新しないでください。代わりに投稿を編集してください – desertnaut

答えて

1

GitHubリポジトリにはデータが含まれていないため、モデルを実行できません。だから、私は自分の答えを90%確信している。

しかし、ネットワークの主な問題は、密集したレイヤーの後でsigmoidアクティブ化機能だと思います。私は、彼らのうちの2つだけがうまくいくとうまくいくと思うが、4つがあまりにも多い。

残念ながら、NVIDIAのEnd to End Learning for Self-Driving Cars紙が明示的に指定しませんが、これらの日のデフォルトの活性化は、もはやsigmoid(それはかつてあったように)が、reluです。それがなぜそうに興味があるのであればthis discussionを参照してください。だから私は提案しています解決策は、このモデルを試してみてくださいです:

model = Sequential() 
model.add(Lambda(lambda x: x/255.0 - 0.5, input_shape = (160,320,3))) 
model.add(Cropping2D(cropping=((70,25),(0,0)))) 
model.add(Conv2D(24, (5, 5), strides=(2, 2), activation="relu")) 
model.add(Conv2D(36, (5, 5), strides=(2, 2), activation="relu")) 
model.add(Conv2D(48, (5, 5), strides=(2, 2), activation="relu")) 
model.add(Conv2D(64, (3, 3), strides=(1, 1), activation="relu")) 
model.add(Conv2D(64, (3, 3), strides=(1, 1), activation="relu")) 
model.add(Flatten()) 
model.add(Dense(1164, activation="relu")) 
model.add(Dense(100, activation="relu")) 
model.add(Dense(50, activation="relu")) 
model.add(Dense(10, activation="relu")) 
model.add(Dense(1)) 

これは、NVIDIAのネットワークアーキテクチャを模倣すると消失グラデーション悩まされることはありません。

+0

ありがとうございます。私は最近、別の悲しい問題に取り組んでいます。他のものを無視することは、文化によっては非常に深刻です。私は無視していませんが、私の小さな心はあまりにも多くのメッセージを処理することができません。戻ります。 –

+0

あなたの90%の信頼は正しいです。怠惰なコンボリューションニューラルネットワークがなくなりました。ありがとうございました。私は勾配の問題が消えているようです。グラディエントがネットワークを通過できない場合、オプティマイザはレイジーCNNを提供してジョブを終了する必要があります。それは可能ですが、詳しい理由は研究する価値があると思います。 –

関連する問題