具有三个参数的keras中的自定义指标
Custom metric in keras with three parameters
大家好,我正在使用 keras 构建一个 deepNN 来预测时间序列,更具体地说,我使用的是 Conv1D,所以输入是具有这种形状的张量:
[samples, window_size, 1]
input_2 = Input(shape=(window_size, 1),name= "input_CNN")
我的问题是我想要一个需要接收 3 个参数而不是 2 个标准 y_pred
和 y_true
的自定义指标。这是因为我的指标需要安全地计算,因为它不依赖于值可能为零的除法(例如,当 = 0 时在百分比误差中所做的)。我的指标的完整公式如下所示:
如何传递 y_true_N 并拥有这样的度量函数?
def rmsse(y_true, y_pred, y_true_N):
N = len(y_true)
numerator = K.mean(K.square(y_true - y_pred))
denominator = K.mean(K.square(y_true_N[1:N]-y_true_N[0:N-1]))
return K.sqrt(numerator/denominator)
其中 y_true_N
对应于训练中的所有目标值,而 y_true
和 y_pred
对应于验证中的目标。
我希望我已经清楚了,如果有人有例子可以告诉我如何得到它吗?提前致谢
考虑到你的分母是你报的定义的固定量,我觉得把你的损失函数中的第三个输入定义在外面是没有问题的
这里有一个代码示例:
def rmsse(y_true, y_pred):
numerator = K.mean(K.square(y_true - y_pred))
denominator = K.mean(K.square(y_true_N[1:N]-y_true_N[0:N-1]))
return K.sqrt(numerator/denominator)
N = 1900
X = np.random.uniform(0,100, (N+100, 30)).astype('float32')
y = np.random.uniform(0,100, N+100).astype('float32')
y_true_N = y[:N].astype('float32')
inp = Input((30))
x = Dense(50)(inp)
x = Dense(1)(x)
model = Model(inp, x)
model.compile('adam', loss=rmsse)
model.fit(X[:N], y[:N], epochs=3, validation_data=(X[N:], y[N:]))
大家好,我正在使用 keras 构建一个 deepNN 来预测时间序列,更具体地说,我使用的是 Conv1D,所以输入是具有这种形状的张量:
[samples, window_size, 1]
input_2 = Input(shape=(window_size, 1),name= "input_CNN")
我的问题是我想要一个需要接收 3 个参数而不是 2 个标准 y_pred
和 y_true
的自定义指标。这是因为我的指标需要安全地计算,因为它不依赖于值可能为零的除法(例如,当 = 0 时在百分比误差中所做的)。我的指标的完整公式如下所示:
如何传递 y_true_N 并拥有这样的度量函数?
def rmsse(y_true, y_pred, y_true_N):
N = len(y_true)
numerator = K.mean(K.square(y_true - y_pred))
denominator = K.mean(K.square(y_true_N[1:N]-y_true_N[0:N-1]))
return K.sqrt(numerator/denominator)
其中 y_true_N
对应于训练中的所有目标值,而 y_true
和 y_pred
对应于验证中的目标。
我希望我已经清楚了,如果有人有例子可以告诉我如何得到它吗?提前致谢
考虑到你的分母是你报的定义的固定量,我觉得把你的损失函数中的第三个输入定义在外面是没有问题的
这里有一个代码示例:
def rmsse(y_true, y_pred):
numerator = K.mean(K.square(y_true - y_pred))
denominator = K.mean(K.square(y_true_N[1:N]-y_true_N[0:N-1]))
return K.sqrt(numerator/denominator)
N = 1900
X = np.random.uniform(0,100, (N+100, 30)).astype('float32')
y = np.random.uniform(0,100, N+100).astype('float32')
y_true_N = y[:N].astype('float32')
inp = Input((30))
x = Dense(50)(inp)
x = Dense(1)(x)
model = Model(inp, x)
model.compile('adam', loss=rmsse)
model.fit(X[:N], y[:N], epochs=3, validation_data=(X[N:], y[N:]))