画像のノイズを除去するためにネットワークをトレーニングしています。このために、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_pred
usingの値を取得しようと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"]]