如何在喀拉拉邦正确使用损失函数?

时间:2019-08-14 17:44:38

标签: python tensorflow keras deep-learning

我正在测试一种损失函数,以同时降低MSE和Cross_Entropy。我定义了损失函数,但损失似乎并没有减少。我是深度学习领域的新手,欢迎任何建议。谢谢

import numpy as np
from sklearn.preprocessing import MinMaxScaler

x1=np.random.uniform(0,100, 1000)
x2=np.random.uniform(-20,20, 1000)
y1= [int(i) for i in x1 % 3]
y2= x1*1.5 + np.random.randn(1000)
y3= 2*x1*x1 + np.random.randn(1000)
y4= x1*2.5 -10 +np.random.randn(1000)
y5=x1*2.5 +10 +np.random.randn(1000)

xs=np.array([x1,x2]).T
y1s= np.array(y1).reshape(-1,1)
y2s= np.array([y2,y3, y4, y5]).T
y1s=to_categorical(y1s)
scaler= MinMaxScaler()
xs_normed=scaler.fit_transform(xs)

from keras.layers import Dense, Input, Concatenate, Lambda
from keras.models import Model
from keras.losses import mse, categorical_crossentropy
import keras.backend as K

def loss_fun(real,pred, alpha=1, beta=1):

    c1_pred=pred[0]
    c1_real=real[0]
    c2_pred=pred[1]
    c2_real=real[1]
    loss1=mse(c2_real, c2_pred)
    loss2=categorical_crossentropy(c1_real, c1_pred)
    loss=K.sum(alpha*loss1 + beta*loss2)
    return loss

inputs= Input(shape=(2,))
d1=Dense(256, activation='relu')(inputs)
d2=Dense(256, activation='relu')(d1)
d3=Dense(3, activation='softmax')(d2)
d5=Dense(256)(d2)
d6=Dense(4)(d5)
model= Model(inputs=inputs, outputs= [d3, d6])
model.compile(optimizer='Adam', loss=loss_fun)

model.fit(x=xs_normed, y= [y1s, y2s], batch_size=128, epochs=100)

2 个答案:

答案 0 :(得分:0)

首先,使用定义的损失函数没有错。

但是我希望您使用此损失函数,因为您了解要优化的内容。您的损失函数将共同在欧式空间和角度度量空间上优化模型。

模型无法学习的原因可能是

  1. 您的alpha和beta值可能需要调整,因此最好尝试不同的组合,例如列表[1e-3,1e-2,1e-1,1]中的所有成对值。
  2. 您的问题可能不适合这种损失,尤其是当您的目标不是单编码的矢量时。

答案 1 :(得分:0)

更好地使用:

model.compile(loss=['categorical_crossentropy', 'mse'], 
              loss_weights = [beta, alpha], ...)

如果这不起作用,那么问题不在于您的损失。