如何将权重传递给keras中的均方误差

如何将权重传递给keras中的均方误差,keras,Keras,我试图解决一个回归问题,这是一个多标签问题,有8个标签,我使用均方误差损失,但数据集不平衡,我想把权重传递给损失函数。目前我正在以这种方式编译模型 model.compile(loss='mse', optimizer=Adam(lr=0.0001), metrics=['mse', 'acc']) 是否有人可以建议是否可以将权重添加到均方误差中,如果可以,我该怎么做 提前谢谢 标签看起来是这样的 # 首先创建一个字典,说明您希望为每个类增加多少权重,例如: class_weights =

我试图解决一个回归问题,这是一个多标签问题,有8个标签,我使用均方误差损失,但数据集不平衡,我想把权重传递给损失函数。目前我正在以这种方式编译模型

model.compile(loss='mse', optimizer=Adam(lr=0.0001), metrics=['mse', 'acc'])
是否有人可以建议是否可以将权重添加到均方误差中,如果可以,我该怎么做

提前谢谢

标签看起来是这样的

#
首先创建一个字典,说明您希望为每个类增加多少权重,例如:

class_weights = {0: 1,
                 1: 1,
                 2: 1, 
                 3: 9, 
                 4: 1...} # Do this for all eight classes
然后将其传递到model.fit:

model.fit(X, y, class_weight=class_weights)
下面是一个基于您的问题陈述的自定义损失函数的小实现

  • 您可以从中找到有关keras损失函数的更多信息,也可以从中查看其官方文档

  • Keras本身不处理低级操作,如张量积、卷积等。相反,它依赖于一个专门的、优化良好的张量操纵库来实现这一点,充当Keras的“后端引擎”。更多信息可以在这里找到,也可以从

  • 使用K.int_shape(张量_名称)查找


嘿,我已经更新了这个问题,我已经给出了标签信息,你的答案还有效吗?`(1)无效参数:不兼容的形状:[8,8]vs[3,8][{{{node training/Adam/gradients/loss/nelu_loss/sub_grade/BroadcastGradientArgs}}]`我相信不兼容的形状问题是在计算K.dot时出现的。你能把整个代码分享给我吗?这样我就可以调试并修复它了?否则,我将很难给你们一个完全可行的解决方案。我在计算K.dot时做了一个小改动。现在应该可以了。您还可以使用
K.init_形状(tensor_name)
获取张量的形状,并在需要时对形状进行必要的修改。嘿,ValueError:无法编译模型,因为它没有优化损失。有什么想法吗?我只有0和1作为类在这种情况下,你只需要类的权重={0:,1:}。不需要到处去实现自定义的损失和添加20行到您的代码哈哈
model.fit(X, y, class_weight=class_weights)
import keras
from keras.models import Sequential
from keras.layers import Conv2D, Flatten, Dense, Conv1D, LSTM, TimeDistributed
import keras.backend as K


# custom loss function
def custom_mse(class_weights):
    def loss_fixed(y_true, y_pred):
        """
        :param y_true: A tensor of the same shape as `y_pred`
        :param y_pred:  A tensor resulting from a sigmoid
        :return: Output tensor.
        """
        # print('y_pred:', K.int_shape(y_pred))
        # print('y_true:', K.int_shape(y_true))
        y_pred = K.reshape(y_pred, (8, 1))
        y_pred = K.dot(class_weights, y_pred)
        # calculating mean squared error
        mse = K.mean(K.square(y_pred - y_true), axis=-1)
        # print('mse:', K.int_shape(mse))
        return mse

model = Sequential()
model.add(Conv1D(8, (1), input_shape=(28, 28)))
model.add(Flatten())
model.add(Dense(8))

# custom class weights
class_weights = K.variable([[0.25, 1., 2., 3., 2., 0.6, 0.5, 0.15]])
# print('class_weights:', K.int_shape(class_weights))

model.compile(optimizer='adam', loss=custom_mse(class_weights), metrics=['accuracy'])