рдЬрдм рдПрдХ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд╕реЗрдЯ рдкрд░ рдПрдХ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕реАрдЦрдиреЗ рдХреА рджрдХреНрд╖рддрд╛ рдХреЗ рджреЛ рдкреНрд░рдореБрдЦ рдкреИрд░рд╛рдореАрдЯрд░ - рддреНрд░реБрдЯрд┐ рдФрд░ рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рд╕рдЯреАрдХрддрд╛ - рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдкрд░ рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП, рд╣рд╛рдирд┐ рдлрд╝рдВрдХреНрд╢рди рдФрд░ рд╕рдЯреАрдХрддрд╛ рдореАрдЯреНрд░рд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпреЗ рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдХрд╛рд░реНрдп (рд╡рд░реНрдЧреАрдХрд░рдг рдпрд╛ рдЫрд╡рд┐ рд╡рд┐рднрд╛рдЬрди, рд╡рд╕реНрддреБ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ, рдкреНрд░рддрд┐рдЧрдорди) рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рднрд┐рдиреНрди рд╣реЛрддреЗ рд╣реИрдВред рдХреЗрд░рд╕ рдореЗрдВ, рд╣рдо рдЕрдкрдиреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдиреБрдХрд╕рд╛рди рдлрд╝рдВрдХреНрд╢рди рдФрд░ рд╕рдЯреАрдХрддрд╛ рдореАрдЯреНрд░рд┐рдХ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрд╕реНрдЯрдо рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рд▓реЗрдЦ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреАред рдХреМрди рдкрд░рд╡рд╛рд╣ рдХрд░рддрд╛ рд╣реИ, рдХреГрдкрдпрд╛, рдмрд┐рд▓реНрд▓реА рдХреЗ рдиреАрдЪреЗред
рдХреНрд░рд╛рд╕ рдореЗрдВ рдХрд╕реНрдЯрдо рд▓реЙрд╕ рдлрдВрдХреНрд╢рдВрд╕
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдореЗрдВ рдФрд╕рдд рдФрд╕рдд рддреНрд░реБрдЯрд┐ (MAE) рддреНрд░реБрдЯрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдХрд╕реНрдЯрдо MAE рд╣рд╛рдирд┐ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
from keras import backend as K def mae(y_true, y_pred): true_value = K.sum(y_true * K.arange(0, 100, dtype="float32"), axis=-1) pred_value = K.sum(y_pred * K.arange(0, 100, dtype="float32"), axis=-1) mae = K.mean(K.abs(true_value - pred_value)) return mae
рдпрд╣рд╛рдВ рд╣рдо рдХреЗрд░ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдпреЛрдЧ, рдЕрд░реЗрдВрдЬ, рдорд╛рдзреНрдп рдФрд░ рдПрдмреНрд╕ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
рдЙрд╕реА рддрд░рд╣, рдЖрдк рдЕрдкрдиреА рд╕рдЯреАрдХрддрд╛ рдореАрдЯреНрд░рд┐рдХ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рджреЛ рд╣рд┐рд╕реНрдЯреЛрдЧреНрд░рд╛рдо рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП earth_movers_distance рдореАрдЯреНрд░рд┐рдХ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ:
from keras import backend as K def earth_movers_distance(y_true, y_pred): cdf_true = K.cumsum(y_true, axis=-1) cdf_pred = K.cumsum(y_pred, axis=-1) emd = K.sqrt(K.mean(K.square(cdf_true - cdf_pred), axis=-1)) return K.mean(emd)
рд╣рдорд╛рд░реЗ mae рдФрд░ earth_movers_distance рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдЕрд▓рдЧ рдореЙрдбреНрдпреВрд▓ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЖрдпрд╛рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдореЙрдбрд▓ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╕рдордп рдЙрдиреНрд╣реЗрдВ рдиреБрдХрд╕рд╛рди рдФрд░ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдорд╛рдкрджрдВрдбреЛрдВ рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:
from utils.metrics import mae, earth_movers_distance loss = earth_movers_distance model.compile(optimizer=optimizer, loss=loss, metrics=[mae, "accuracy"])
рдХрд╕реНрдЯрдо рд╣рд╛рдирд┐ рд╕рдорд╛рд░реЛрд╣ рдХреЗ рд╕рд╛рде рдПрдХ рдХреЗрд░рд╕ рдореЙрдбрд▓ рд▓реЛрдб рд╣реЛ рд░рд╣рд╛ рд╣реИ
рдХреЗрд░рд╕ рдореЗрдВ рдПрдХ рдореЙрдбрд▓ рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░рддреЗ рд╕рдордп, рдЖрдк рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдЪрд░рдг рдореЗрдВ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдореЙрдбрд▓ рдХреЗ рдмрд╛рдж рдХреЗ рд▓реЛрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдПрдЪ 5 рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдореЙрдбрд▓ рд╡рдЬрди рдмрдЪрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рд╣рдо рдХрд╕реНрдЯрдо рд▓реЙрд╕ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдФрд░ рдХреНрд╡рд╛рд▓рд┐рдЯреА рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдПрдХ рд╕рдорд╕реНрдпрд╛ рдореЗрдВ рднрд╛рдЧ рд╕рдХрддреЗ рд╣реИрдВред рдЬрдм рд╣рдо load_weights рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП h5 рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рднрд╛рд░ рдЙрдард╛рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддреНрд░реБрдЯрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
ValueError: Unknown loss function:earth_movers_distance
рдпрд╣ рдХреЗрд░рд╕ рдХрд╛ рдПрдХ рдкреНрд░рд╕рд┐рджреНрдз рдмрдЧ рд╣реИ (
рдЙрдиреНрд╣реЛрдВрдиреЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рднрдВрдбрд╛рд░ рдореЗрдВ рдЬреАрдердм
рдкрд░ рд▓рд┐рдЦрд╛ рдерд╛ )ред
рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╣рдорд╛рд░реЗ рдХрд╕реНрдЯрдо рд▓реЙрд╕ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдФрд░ рдХреНрд╡рд╛рд▓рд┐рдЯреА рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдХреЛ рдХреЗрд░рд╕ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
from keras.utils.generic_utils import get_custom_objects get_custom_objects().update({"earth_movers_distance": earth_movers_distance, "age_mae": age_mae})
рдЕрднреА рдХреЗ рд▓рд┐рдП рдмрд╕ рдЗрддрдирд╛ рд╣реАред рд╕рднреА рдХреЛ рд╢реБрднрдХрд╛рдордирд╛рдПрдБ рдФрд░ рдЖрдкрдХреЛ рдЬрд▓реНрдж рд╣реА рдорд┐рд▓рддреЗ рд╣реИрдВ!