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)) 

컨볼 루션 레이어에는 'relu'를 사용하고 완전히 연결된 레이어의 활성화 기능은 'sigmoid'입니다. 정품 인증 기능을 변경하려고했지만 효과가 없습니다.

내 분석이 있습니다. 나는 내가 동일한 코드와 더 간단한 CNN으로 차를 성공적으로 운전할 수 있기 때문에 프로그램의 버그에 동의하지 않는다. 이유는 시뮬레이터 나 신경망의 구조라고 생각합니다. 실제자가 운전 차량에서 조향 각도 인 훈련 신호에는 소음이 있어야합니다. 그러므로, 운전자는 실제 도로에서 여전히 바퀴를 보유하지 못한다. 그러나 시뮬레이터에서 트레이닝 신호는 매우 깨끗합니다. 조향 각도의 거의 60 %가 0입니다. 옵티마이 저는 CNN의 출력을 0에 가깝게함으로써 쉽게 작업을 수행 할 수 있습니다. 최적화 프로그램이 너무 게으른 것 같습니다. 그러나 우리가 정말로이 CNN 출력을 원할 때, 그것은 또한 0을줍니다. 그래서, 나는이 0 조향각에 작은 잡음을 추가합니다. 게으른 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)) 

그것은 엔비디아의 네트워크 아키텍처를 모방하고 사라지는 그라디언트에서 고통을하지 않습니다 그래서 내가 제안하고있어이 솔루션은이 모델을 시도합니다.

+0

제안 해 주셔서 대단히 감사합니다. 요즘 또 다른 슬픈 문제에 대해 연구하고 있습니다. 다른 사람들을 무시하는 것은 어떤 문화에서는 매우 심각합니다. 나는 무시하지 않을 것이지만 나의 작은 마음은 그렇게 많은 메시지를 처리 ​​할 수 ​​없다. 나는 돌아올거야. –

+0

귀하의 90 % 신뢰가 옳습니다. 게으른 Convolution Neural Network가 사라졌습니다. 고맙습니다. 나는 그라디언트가 사라지는 것처럼 보입니다. 그래디언트가 네트워크를 통과 할 수없는 경우, 최적화 프로그램은 게으른 CNN을 제공하여 작업을 완료해야합니다! 그것은 가능하지만 자세한 이유는 연구 할 만하다고 생각합니다. –