作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在 Keras 中编写一个 RMSE 函数,该函数仅对不为零的数组值运行 RMSE。我有两个数组 arr1 和 arr2。两个数组在完全相同的位置都有零(因此它们对 RMSE 值的贡献为零)。但是,我需要将除以的数字更改为 arr1 (或 arr2)中非零值的数量
def root_mean_squared_error(y_true, y_pred):
nonzero = tf.count_nonzero(y_pred)
num_zeros=tf.reduce_sum(tf.where(tf.not_equal(y_pred,0),tf.ones_like(y_pred),tf.zeros_like(y_pred)))
return K.sqrt((K.sum(K.square(y_pred - y_true))/tf.cast(nonzero, tf.float32)))
mc = keras.callbacks.ModelCheckpoint('modelsPerEpoch/weights{epoch:06d}.hdf5',
save_weights_only=False,
period=1)
decay_learner = ValidationLearningRateScheduler()
main_input = Input(shape=(None, 2, 100, 100), dtype='float32', name='input')
mask=Input(shape=(1, 100, 100), dtype='float32', name='mask')
hidden = ConvLSTM2D(filters=16,
kernel_size=(5, 5),
padding='same',
return_sequences=False,
data_format='channels_first')(main_input)
output = Conv2D(filters=1,
kernel_size=(1, 1),
padding='same',
activation='sigmoid',
kernel_initializer='glorot_uniform',
data_format='channels_first',
name='output')(hidden)
output_with_mask=Multiply()([output, mask])
sgd = SGD(lr=0.002, momentum=0.0, decay=0.0, nesterov=False)
model = Model(inputs=[main_input, mask], outputs=output_with_mask)
model.compile(optimizer=sgd,
loss=root_mean_squared_error,
metrics=[metrics.mse, root_mean_squared_error])
但是,当我运行此命令时,我在命令行中返回了“inf”。我该如何解决这个问题?
最佳答案
y_true
和 y_pred
在完全相同的位置有零,根据您的代码无效。您在命令行中得到 inf
是因为 y_pred
中的非零数字为 0,即代码中的 nonzero
= 0。您应该计算正确的非零数字,并避免使用以下代码除以 0。
def root_mean_squared_error(y_true, y_pred):
nonzero = tf.count_nonzero(y_true)
...
return K.switch(K.equal(nonzero,0)
, K.constant(value=0.)
, K.sqrt((K.sum(K.square(y_pred - y_true))/tf.cast(nonzero, tf.float32))))
关于python - 在 Keras 中添加自定义均方根误差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55770077/
我是一名优秀的程序员,十分优秀!