2017-03-02 3 views
1

나는 다음과 같은 네트워크 구조를 구현하는 방법을 찾고 있어요 사용 손실 또는 영업 이익 (현재 Keras를 사용하여이 그러나 theano 수 있습니다) : keras/theano 전체 네트워크

, 우리는 몇 가지 간단한 네트워크를 제공하고 가정하지만, 이 출력을 직접 기반으로 원하는 손실을 계산할 수 없으며 다른 작업이 필요하며이 작업의 출력을 기준으로 손실이 정의됩니다. 그러나이 작업은 네트워크의 출력뿐만 아니라 전체 네트워크 개체 (예 : 그라디언트)를 필요로합니다.

어떻게이 작업을 수행 할 수 있습니까? 네트워크의 상단에있는 사용자 지정 계층이나 사용자 지정 손실 기능에서 작업을 수행 할 수 있다고 생각하지만 어느 버전에도 전체 네트워크에 액세스 할 수있는 방법이 있습니다. 어떤 제안?

+0

Keras 모델에 추가 레이어를 추가하는 것에 대해 이야기하고 있습니까? –

+0

네, 새로운 레이어가 아닙니다. 레이어는 입력뿐만 아니라 네트워크 구조에도 액세스해야합니다 (예 : 내 맞춤 레이어가 시작되는 지점까지 네트워크의 그래디언트를 계산할 수 있어야 함). 레이어가 완벽한 솔루션인지 확신 할 수 없으므로 아마도 사용자 정의 레이어가없는 네트워크 만 사용하고 대신 네트워크 그라디언트가 포함 된 사용자 지정 작업을 수행하는 손실 함수를 정의 할 수 있습니다. 그러나 이렇게하려면 손실 함수는 전체 네트워크에 대한 액세스가 필요하지만 AFAIK는 입력으로만 (y_true, y_label)을 가져옵니다. – brina

답변

2

간단한 네트워크가 있다고 가정하지만이 출력을 기반으로 원하는 손실을 직접 계산할 수는 없으며 다른 작업이 필요하며 손실은이 작업의 출력을 기준으로 정의됩니다. 그러나이 작업은 네트워크의 출력뿐만 아니라 전체 네트워크 개체 (예 : 그라디언트)를 필요로합니다.

다음과 같은 모델이 있다고합니다.

import keras.applications.vgg16 as vgg16 

model = vgg16.VGG16(weights='imagenet') 
model.summary() 

예를 들어, 지금 당신은 실제로 범주 입력 이미지 (길이 1000 imagenet 1000 개 범주를 가지고 있기 때문에의 벡터를) 예측이 모델의 마지막 레이어를 삭제하고 싶습니다.

# Remove last Linear/Dense layer. 
model.layers.pop() 
model.outputs = [model.layers[-1].output] 
model.layers[-1].outbound_nodes = [] 
model.summary() 

지금,이 모델 (출력 크기 10)와 선형 층을 추가하고 수정 신경망 모델의 출력을 사용할 수 있습니다.

model.add(Dense(10, activation='softmax')) 
model.summary() 

이 모델의 출력물로 벡터 (길이 10)가 표시됩니다.

model.compile()model.fit() 기능을 사용하여 모델을 컴파일하고 교육 할 수 있습니다. 모델을 훈련시키는 데 사용할 손실 기능 유형을 설정할 수 있습니다.

+0

내 질문이 분명하지 않은 것 같습니다. 새 레이어 또는 맞춤 손실 기능은 출력 뉴런뿐만 아니라 전체 네트워크 (예 : 네트워크 그라디언트를 계산할 수 있어야 함)를 사용해야합니다. 그러나 손실 함수의 경우 인수가있는 함수 (y_true, y_loss)가 항상 필요합니다 (https://keras.io/objectives/). 즉 전체 네트워크에 액세스 할 수 없습니다. 마찬가지로, [맞춤 레이어는 직접 입력 값만 가져옵니다] (https://keras.io/layers/writing-your-own-keras-layers/)는 호출하기위한 인수로 전체 모델에 액세스 할 수 없으며 내가 볼 수 있듯이. – brina

+0

나는 당신이 의미하는 바를 이해하지 못한다. - "새로운 층 또는 커스텀 손실 기능은 FULL 네트워크를 사용해야한다." 신경 네트워크에 대한 이해가 잘못되었다고 생각합니다. 신경망이 실수를 할 때마다 특정 계층과 관련이있을뿐만 아니라 전체 네트워크와 관련된 모든 모델 매개 변수를 업데이트하기 때문에! 그래서, 당신이 말했을 때, "손실 기능은 전체 네트워크에 접근 할 수 없습니다"- 그것은 말이되지 않습니다!신경망은 분류 작업을 배우려고하는데, 손실 함수는 네트워크가 얼마나 실수를하는지 나타냅니다! 그에 따라 가중치 매개 변수를 업데이트하십시오. –

+0

나를 믿어 라, 나는 네트워크를 이해한다;) 분명히 나는 ​​그것을 할 표준 이었다면 분명히 그런 새로운 네트워크 op/layer 또는 loss를 디자인하는 방법을 묻지 않을 것이다. 이제, 내가하고있는 일을 안다고 저를 믿으면, 이것이 순수한 구현 문제가됩니다. 손실 기능 내에서 네트워크에 액세스하려면 어떻게해야합니까? 또는 전체 네트워크에 액세스하기 위해 새 레이어와 사용자 지정 op를 어떻게 디자인해야합니까? 그라디언트를 직접 구현해야한다는 것을 알고 있습니다. – brina

관련 문제