>

keras에서 (y_true, y_pred)를 입력으로 사용할뿐만 아니라 네트워크 내부 레이어의 출력을 출력 레이어의 레이블로 사용해야하는 손실 함수를 사용자 정의하려고합니다. 네트워크 레이아웃

여기서 내부 출력은 1D 특징 벡터 인 xn입니다. 오른쪽 상단 모서리에서 출력은 xn '이며 이는 xn의 예측입니다. 즉, xn은 xn '의 레이블입니다.

[Ax, Ay]는 전통적으로 y_true, [Ax ', Ay']는 y_pred입니다.

이 두 손실 구성 요소를 하나로 결합하고 네트워크를 공동으로 훈련하고 싶습니다.

아이디어 나 생각은 대단히 감사합니다!


  • 답변 # 1

    누군가가 같은 것을 검색하는 경우,이 게시물에 제공된 네트워크를 기반으로 여기에 게시 한 방법을 알아 냈습니다.

    아이디어는 맞춤형 손실 기능을 정의하고이를 네트워크의 출력으로 사용하는 것입니다. (표기 : A  변수 A 의 실제 레이블입니다. 및 A'  변수 A 의 예측값입니다. )

    def customized_loss(args):
        #A is from the training data
        #S is the internal state
        A, A', S, S' = args 
        #customize your own loss components
        loss1 = K.mean(K.square(A - A'), axis=-1)
        loss2 = K.mean(K.square(S - S'), axis=-1)
        #adjust the weight between loss components
        return 0.5 * loss1 + 0.5 * loss2
     def model():
         #define other inputs
         A = Input(...) # define input A
         #construct your model 
         cnn_model = Sequential()
         ...
         # get true internal state
         S = cnn_model(prev_layer_output0)
         # get predicted internal state output
         S' = Dense(...)(prev_layer_output1)
         # get predicted A output
         A' = Dense(...)(prev_layer_output2)
         # customized loss function
         loss_out = Lambda(customized_loss, output_shape=(1,), name='joint_loss')([A, A', S, S'])
         model = Model(input=[...], output=[loss_out])
         return model
      def train():
          m = model()
          opt = 'adam'
          model.compile(loss={'joint_loss': lambda y_true, y_pred:y_pred}, optimizer = opt)
          # train the model 
          ....
    
    

  • 답변 # 2

    먼저 기능 API를 사용해야합니다. 그런 다음 네트워크 출력을 출력과 내부 계층의 결과로 정의하고이를 단일 출력으로 병합 한 다음 (연결하여) 병합 된 출력을 두 부분으로 나누고 손실 계산을 수행하는 사용자 지정 손실 함수를 만들어야합니다. 자체적으로.

    같은 것 :

    def customLoss(y_true, y_pred):
        #loss here
        internalLayer = Convolution2D()(inputs) #or other layers
        internalModel = Model(input=inputs, output=internalLayer)
        tmpOut = Dense(...)(internalModel)
        mergedOut = merge([tmpOut, mergedOut], mode = "concat", axis = -1)
        fullModel = Model(input=inputs, output=mergedOut)
        fullModel.compile(loss = customLoss, optimizer = "whatever")
    
    

  • 답변 # 3

    이 구현에 관한 예약이 있습니다. 병합 된 레이어에서 계산 된 손실은 병합 된 두 분기로 다시 전파됩니다. 일반적으로 하나의 레이어를 통해 전파하려고합니다.

  • 이전 entity framework - C #에서"활성화 된 이벤트 시간 스레드 예외"를 수정하는 방법?
  • 다음 php - 문자열의 특정 부분을 어떻게 교체합니까?