我正在测试一种损失函数,以同时降低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)
答案 0 :(得分:0)
首先,使用定义的损失函数没有错。
但是我希望您使用此损失函数,因为您了解要优化的内容。您的损失函数将共同在欧式空间和角度度量空间上优化模型。
模型无法学习的原因可能是
答案 1 :(得分:0)
更好地使用:
model.compile(loss=['categorical_crossentropy', 'mse'],
loss_weights = [beta, alpha], ...)
如果这不起作用,那么问题不在于您的损失。