2017-12-30 26 views
0

나는 CIFAR10 데이터 세트를 사용하여 이미지를 제거하기 위해 네트워크를 교육하고 있습니다. 손실이 mse/classification_accuracy가되도록 사용자 지정 손실 함수를 생성하려고합니다. 내 네트워크가 32x32 (시끄러운) 이미지를 입력 받고 32x32 (노이즈가있는) 이미지를 예측한다고 가정하면 y_pred 및 Y_true는 32x32 이미지의 배열로 가정합니다. 따라서 내 사용자 지정 손실 기능은 다음과 같습니다맞춤형 손실 기능 : y_pred의 데이터에 model.predict 수행

def custom_loss(): 
    def joint_optimized_loss(y_true, y_pred): 
     mse = K.mean(K.square(y_pred - y_true), axis=-1) 
     preds = classif_model.predict(y_pred) 
     correctPreds = 0 
     totPreds = 0 
     for pred in preds: 
      predictedClass = pred.index(max(pred)) 
      totPreds += 1 
      if predictedClass == currentClass: 
       correctPreds += 1 
     classifAccuracy = correctPreds/totPreds 
     loss = mse/classifAccuracy 
     return loss 
    return joint_optimized_loss 
myModel.compile(optimizer='adadelta', loss=custom_loss()) 

classif_model은 10 개 클래스 중 하나에 CIFAR10 이미지를 분류 사전 교육을받은 모델입니다. 그것은 32x32 이미지의 배열을받습니다.

Traceback (most recent call last):

File "myCode.py", line 94, in

myModel.compile(optimizer='adadelta', loss=custom_loss()) File "/home/rvidalma/anaconda2/envs/tensorUpdated/lib/python2.7/site-packages/keras/engine/training.py", line 850, in compile

sample_weight, mask) File "/home/rvidalma/anaconda2/envs/tensorUpdated/lib/python2.7/site-packages/keras/engine/training.py", line 450, in weighted

score_array = fn(y_true, y_pred) File "myCode.py", line 57, in joint_optimized_loss

preds = classif_model.predict(y_pred) File "/home/rvidalma/anaconda2/envs/tensorUpdated/lib/python2.7/site-packages/keras/models.py", line 913, in predict

return self.model.predict(x, batch_size=batch_size, verbose=verbose) File "/home/rvidalma/anaconda2/envs/tensorUpdated/lib/python2.7/site-packages/keras/engine/training.py", line 1713, in predict

verbose=verbose, steps=steps) File "/home/rvidalma/anaconda2/envs/tensorUpdated/lib/python2.7/site-packages/keras/engine/training.py", line 1260, in _predict_loop

batches = _make_batches(num_samples, batch_size) File "/home/rvidalma/anaconda2/envs/tensorUpdated/lib/python2.7/site-packages/keras/engine/training.py", line 374, in _make_batches

num_batches = int(np.ceil(size/float(batch_size)))
AttributeError: 'Dimension' object has no attribute 'ceil'

내가이 사실 y_true이 함께 할 수있는 뭔가가 생각하고 훈련하기 전에, 따라서 classif_model 비어있는, 모두 텐서가 y_pred 있습니다 : 내 코드를 실행하면

그러나 나는 다음과 같은 오류가 발생합니다. 예측은 배열이 예상대로 실패합니다. 그러나 나는

내가 대신의 가치를 점점 시도 ...이 문제를 해결하는 방법에 대한 확실하지 않다 y_pred K.get_value이 (y_pred),하지만 나에게 다음과 같은 오류 제공합니다 사용 :

tensorflow.python.framework.errors_impl.InvalidArgumentError: Shape [-1,32,32,3] has negative dimensions [[Node: input_1 = Placeholderdtype=DT_FLOAT, shape=[?,32,32,3], _device="/job:localhost/replica:0/task:0/cpu:0"]]

답변

0

을 당신은 할 수 없습니다 미분 할 수 없기 때문에 정확도를 손실 함수로 사용하십시오. 이것이 교차 엔트로피와 같은 정확도에 대한 상한이 대신 사용되는 이유입니다.

또한 정확도를 구현하는 방법도 기호가 아니므로 keras.backend의 함수 만 사용하여 올바르게 작동하도록 손실을 구현해야합니다.