我目前正在使用 Keras 制作预测模型。它接受两个时间序列并输出 0 到 1 之间的数字。目前,我的准确度非常低,因为模型只有在获得确切的数字时才被认为是“正确的”。例如,正确的数字是0.34,如果预测为0.35,则认为是错误的。我希望能够认为某个范围内的所有数字都是正确的,例如:在真实值的 0.05 范围内。另一种选择可能是四舍五入,但我遇到了它输出小数点后 6 位的问题。
这是我的 CNN 代码: def 网络模型(): 模型 = tf.keras.Sequential([
tf.keras.layers.Conv2D(filters = 16, kernel_size=(2, 2), activation='relu',padding='same'),
tf.keras.layers.Conv2D(filters = 9, kernel_size=(2, 2), activation='relu',padding='same'),
tf.keras.layers.MaxPooling2D(pool_size=(2, 2)),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(256, activation='relu'),
tf.keras.layers.Dense(1, activation='sigmoid')
])
model.compile(optimizer='adam',
loss = tf.keras.losses.BinaryCrossentropy(),
metrics=['accuracy'])
return model
对于这种特定情况,您可以将自定义准确度函数定义为指标,并为您的
Callback
模型定义 Keras
。
自定义准确度指标:
import keras.backend as K
def custom_accuracy(y_true, y_pred, tolerance=0.05):
absolute_difference = K.abs(y_true - y_pred)
correct_predictions = K.cast(absolute_difference <= tolerance, dtype='float32')
return K.mean(correct_predictions)
model.compile(optimizer='adam', loss='mse', metrics=[custom_accuracy])
自定义回调:
from keras.callbacks import Callback
import numpy as np
class CustomAccuracyCallback(Callback):
def __init__(self, validation_data, tolerance=0.05):
super(CustomAccuracyCallback, self).__init__()
self.validation_data = validation_data
self.tolerance = tolerance
def on_epoch_end(self, epoch, logs={}):
x_val, y_val = self.validation_data
y_pred = self.model.predict(x_val)
accuracy = np.mean(np.abs(y_val - y_pred) <= self.tolerance)
print(f"\nEpoch {epoch + 1}: Custom Accuracy: {accuracy:.4f}")
logs['custom_accuracy'] = accuracy
custom_callback = CustomAccuracyCallback((x_val, y_val))
model.fit(x_train, y_train, validation_data=(x_val, y_val), callbacks=[custom_callback])