Multi sparse_categorical_crossentropy TruePositives指标不兼容的形状:[2,128]与[2,64]

问题描述 投票:0回答:1

我正在尝试为每个课程添加各种简单的指标。 tf.keras.metrics.TruePositives, tf.keras.metrics.Precision ...当最后一个Dense层为两个或更多时,这会导致崩溃。

InvalidArgumentError: Incompatible shapes: [2,128] vs. [2,64]
     [[{{node metrics_12/fp/LogicalAnd}}]]

如果我仅使用accuracy作为指标,则可以使用。我很确定我缺少基本的东西。就TensorFlow和深度学习而言,我只是一个小人物。我究竟做错了什么?如何获得每个班级的指标? (示例代码只有0,1类,在实际应用中还有更多类)

Colab链接:https://colab.research.google.com/drive/1aAz1pfN6ttBp8nU6rZgo8OA_Hwdseyg8

#%%

from typing import List, Set, Dict, Tuple, Optional, Any
import numpy as np
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, BatchNormalization, CuDNNLSTM, LSTM, Flatten

#%%

# Create random training values for demo purposes.
#
# train_x is [
#   [
#        [0.3, 0.54 ... 0.8],
#        [0.4, 0.6 ... 0.55],
#        ...
#   ],
#   [
#        [0.3, 0.54 ... 0.8],
#        [0.4, 0.6 ... 0.55],
#        ...
#   ],
#   ...
# ]
#
# train_y is corresponding classification of train_x sequences, always 0 or 1
# [0, 1, 0, 1, 0, ... 0]

SAMPLES_CNT = 1000

train_x = np.random.rand(SAMPLES_CNT,5,4)
train_y = np.vectorize(lambda x: int(round(x)))(np.random.rand(SAMPLES_CNT))

val_x = np.random.rand(int(SAMPLES_CNT * 0.1),5,4)
val_y = np.vectorize(lambda x: int(round(x)))(np.random.rand(int(SAMPLES_CNT * 0.1)))

#%%

shape = Tuple[int, int]
model = Sequential()
model.add(LSTM(32,input_shape=train_x.shape[1:], return_sequences=True, stateful=False))
model.add(Dropout(0.2))
model.add(BatchNormalization())
model.add(LSTM(32,input_shape=train_x.shape[1:], return_sequences=False, stateful=False))
model.add(Dropout(0.2))
model.add(BatchNormalization())
model.add(Dense(16, activation="relu"))
model.add(Dropout(0.2))
model.add(Dense(2, activation="softmax"))

metrics = [
    'accuracy',
    tf.keras.metrics.TruePositives(name='tp'),
    tf.keras.metrics.FalsePositives(thresholds=[0.5, 0.5], name='fp'),
    tf.keras.metrics.TrueNegatives(name='tn'),
    tf.keras.metrics.FalseNegatives(name='fn'),
    tf.keras.metrics.BinaryAccuracy(name='accuracy'),
    tf.keras.metrics.Precision(name='precision'),
    tf.keras.metrics.Recall(name='recall'),
    tf.keras.metrics.AUC(name='auc'),
]

model.compile(
    optimizer=tf.keras.optimizers.Adam(lr=0.001, decay=1e-6),
    loss='sparse_categorical_crossentropy',
    metrics=metrics
)

fit = model.fit(
    train_x, train_y,
    batch_size=64,
    epochs=2,
    validation_data=(val_x, val_y),
    shuffle=False,
)

for i, val in enumerate(model.metrics_names):
    print(model.metrics_names[i], fit.history[val][:1])

tensorflow machine-learning keras deep-learning lstm
1个回答
0
投票

其中一些指标应该仅适用于一个班级。

您需要Dense(1, activation='sigmoid')'binary_crossentropy'

© www.soinside.com 2019 - 2024. All rights reserved.