2017-12-30 29 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であるという事実とは何かを持っていると思います。予測は配列を期待しているので失敗します。しかし、私はこの問題を解決する方法について確認していない...

私は、の値がK.get_value(y_pred)を使用して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の関数のみを使用してください。

関連する問題