3

KerasのCNNでマルチクラスマルチラベル分類を実行しようとしています。私は同様の質問からthis functionに基づいて個々のラベル精度関数を作成しようとしてきましたKeras Multilabel Multiclass個別タグ精度

私がしようとした、関連するコードは次のとおりです。

labels = ["dog", "mammal", "cat", "fish", "rock"] #I have more 
interesting_id = [0]*len(labels) 
interesting_id[labels.index("rock")] = 1 #we only care about rock's accuracy 
interesting_label = K.variable(np.array(interesting_label), dtype='float32') 

def single_class_accuracy(interesting_class_id): 
    def single(y_true, y_pred): 
     class_id_true = K.argmax(y_true, axis=-1) 
     class_id_preds = K.argmax(y_pred, axis=-1) 
     # Replace class_id_preds with class_id_true for recall here 
     accuracy_mask = K.cast(K.equal(class_id_preds, interesting_class_id), 'float32') 
     class_acc_tensor = K.cast(K.equal(class_id_true, class_id_preds), 'float32') * accuracy_mask 
     class_acc = K.sum(class_acc_tensor)/K.maximum(K.sum(accuracy_mask), 1) 
     return class_acc 
    return single 

し、後でそれがメトリックとして呼ばれている:

model.compile(optimizer=SGD(lr=0.0001, momentum=0.9), 
       loss='binary_crossentropy', metrics=[metrics.binary_accuracy, 
       single_class_accuracy(interesting_id)]) 

しかし、私は取得していますエラーは次のとおりです。

> Traceback (most recent call last): 
    File "/share/pkg/tensorflow/r1.3/install/lib/python3.6/site-packages/tensorflow/python/framework/op_def_library.py", line 490, in apply_op 
    preferred_dtype=default_dtype) 
    File "/share/pkg/tensorflow/r1.3/install/lib/python3.6/site-packages/tensorflow/python/framework/ops.py", line 676, in internal_convert_to_tensor 
    ret = conversion_func(value, dtype=dtype, name=name, as_ref=as_ref) 
    File "/share/pkg/tensorflow/r1.3/install/lib/python3.6/site-packages/tensorflow/python/ops/variables.py", line 677, in _TensorConversionFunction 
    "of type '%s'" % (dtype.name, v.dtype.name)) 
ValueError: Incompatible type conversion requested to type 'int64' for variable of type 'float32_ref' 

During handling of the above exception, another exception occurred: 

> Traceback (most recent call last): 
    File "bottleneck_model.py", line 190, in <module> 
    main() 
    File "bottleneck_model.py", line 171, in main 
    loss='binary_crossentropy', metrics=[metrics.binary_accuracy, binary_accuracy_with_threshold, single_class_accuracy(interesting_label)]) 
    File "/share/pkg/keras/2.0.6/install/lib/python3.6/site-packages/keras/engine/training.py", line 898, in compile 
    metric_result = masked_metric_fn(y_true, y_pred, mask=masks[i]) 
    File "/share/pkg/keras/2.0.6/install/lib/python3.6/site-packages/keras/engine/training.py", line 494, in masked 
    score_array = fn(y_true, y_pred) 
    File "bottleneck_model.py", line 81, in single 
    accuracy_mask = K.cast(K.equal(class_id_preds, interesting_class_id), 'float32') 
    File "/share/pkg/keras/2.0.6/install/lib/python3.6/site-packages/keras/backend/tensorflow_backend.py", line 1516, in equal 
    return tf.equal(x, y) 
    File "/share/pkg/tensorflow/r1.3/install/lib/python3.6/site-packages/tensorflow/python/ops/gen_math_ops.py", line 753, in equal 
    result = _op_def_lib.apply_op("Equal", x=x, y=y, name=name) 
    File "/share/pkg/tensorflow/r1.3/install/lib/python3.6/site-packages/tensorflow/python/framework/op_def_library.py", line 526, in apply_op 
    inferred_from[input_arg.type_attr])) 
TypeError: Input 'y' of 'Equal' Op has type float32 that does not match type int64 of argument 'x'. 

I H aveはタイプを無駄に変更しようとしました。

答えて

2

K.equalへの入力には、異なるデータ型があります。 class_id_predsfloat32またはinteresting_class_idint64にキャストすることを前提としています。私に無効な引数エラーを与える

interesting_class_id = K.cast(interesting_class_id, 'int64')

+0

:後者は整数(それ以外の場合は、他のテンソルをキャスト)である場合、これはエラーを解決する必要があります。形状64が一致しない12 –

+0

私はこれを解決した後に発生した事後エラーだと思います。私はあなたが提供したコードの断片をさらに助けてくれるのではないかと心配しています – rvinas