1

画像のノイズを除去するためにネットワークをトレーニングしています。このために、CIFAR10 データセットを使用しています。損失が mse / classification_accuracy になるようにカスタム損失関数を生成しようとしています。私のネットワークが入力として 32x32 (ノイズあり) 画像を受け取り、32x32 (ノイズ除去済み) 画像を予測する場合、y_pred と Y_true は 32x32 画像の配列になると想定しています。したがって、私のカスタム損失関数は次のようになります。

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 は、CIFAR10 画像を 10 クラスのいずれかに分類する事前トレーニング済みモデルです。32x32 の画像の配列を受け取ります。

ただし、コードを実行すると、次のエラーが発生します。

トレースバック (最新の呼び出しが最後):

ファイル「myCode.py」の 94 行目

myModel.compile(optimizer='adadelta', loss=custom_loss()) ファイル "/home/rvidalma/anaconda2/envs/tensorUpdated/lib/python2.7/site-packages/keras/engine/training.py"、850 行目、コンパイル中

sample_weight, mask) ファイル "/home/rvidalma/anaconda2/envs/tensorUpdated/lib/python2.7/site-packages/keras/engine/training.py"、450 行目、加重

score_array = fn(y_true, y_pred) ファイル「myCode.py」、57 行目、joint_optimized_loss 内

preds = classif_model.predict(y_pred) ファイル "/home/rvidalma/anaconda2/envs/tensorUpdated/lib/python2.7/site-packages/keras/models.py"、913 行目、predict 内

return self.model.predict(x, batch_size=batch_size, verbose=verbose) ファイル "/home/rvidalma/anaconda2/envs/tensorUpdated/lib/python2.7/site-packages/keras/engine/training.py", 行1713年、予測

verbose=verbose, steps=steps) ファイル "/home/rvidalma/anaconda2/envs/tensorUpdated/lib/python2.7/site-packages/keras/engine/training.py"、1260 行目、_predict_loop 内

batches = _make_batches(num_samples, batch_size) ファイル "/home/rvidalma/anaconda2/envs/tensorUpdated/lib/python2.7/site-packages/keras/engine/training.py"、374 行目、_make_batches 内

num_batches = int(np.ceil(size / float(batch_size)))
AttributeError: 'Dimension' オブジェクトに属性 'ceil' がありません

y_trueこれは、とy_predが両方ともテンソルであり、トレーニング前は空classif_model.predictであり、配列を期待しているため失敗するという事実と関係があると思います。ただし、これを修正する方法がわかりません...

代わりにy_predusingの値を取得しようとK.get_value(y_pred)しましたが、次のエラーが発生します。

tensorflow.python.framework.errors_impl.InvalidArgumentError: 形状 [-1,32,32,3] には負の次元があります [[Node: input_1 = Placeholderdtype=DT_FLOAT, shape=[?,32,32,3], _device="/ジョブ:localhost/レプリカ:0/タスク:0/cpu:0"]]

4

2 に答える 2

0

私はほとんど同じ問題を抱えていましたが、これを試してみましたが、うまくいきました。

それ以外の:

preds = classif_model.predict(y_pred)

試す:

preds = classif_model(y_pred)

理由はわかりませんが、model.predict(y) を使用する場合は batch_size が必要であり、コンパイル中には何もないため、model.predict(y) を使用できないためです。これが間違っている場合は修正してください。

于 2018-05-25T07:09:07.640 に答える