我正在尝试为每个课程添加各种简单的指标。 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])
其中一些指标应该仅适用于一个班级。
您需要Dense(1, activation='sigmoid')
和'binary_crossentropy'
。