在Keras中实现自定义目标函数

我正在尝试实现我自己的成本函数,具体来说是下面的这个函数:

enter image description here

我知道这个问题在这个网站上已经被问过多次,我读到的答案通常是类似于下面的内容:

def custom_objective(y_true, y_pred):....return L

人们似乎总是使用y_truey_pred,然后说你只需要编译模型model.compile(loss=custom_objective),然后就可以继续进行。没有人真正提到在代码中的某个地方y_true=somethingy_pred=something。这是我必须在我的模型中指定的内容吗?

我的代码

我不确定我是否正确地使用.predict()来获取模型在训练过程中的运行预测:

params = {'lr': 0.0001, 'batch_size': 30, 'epochs': 400, 'dropout': 0.2, 'optimizer': 'adam', 'losses': 'avg_partial_likelihood', 'activation':'relu', 'last_activation': 'linear'}def model(x_train, y_train, x_val, y_val):    l2_reg = 0.4    kernel_init ='he_uniform'     bias_init ='he_uniform'    layers=[20, 20, 1]    model = Sequential()    # 第一层    model.add(Dense(layers[0], input_dim=x_train.shape[1],                    W_regularizer=l2(l2_reg),                    kernel_initializer=kernel_init,                    bias_initializer=bias_init))    model.add(BatchNormalization(axis=-1, momentum=momentum, center=True))    model.add(Activation(params['activation']))    model.add(Dropout(params['dropout']))    # 第二层及以后    for layer in range(0, len(layers)-1):        model.add(Dense(layers[layer+1], W_regularizer=l2(l2_reg),                        kernel_initializer=kernel_init,                        bias_initializer=bias_init))        model.add(BatchNormalization(axis=-1, momentum=momentum, center=True))        model.add(Activation(params['activation']))        model.add(Dropout(params['dropout']))    # 最后一层    model.add(Dense(layers[-1], activation=params['last_activation'],                    kernel_initializer=kernel_init,                    bias_initializer=bias_init))    model.compile(loss=params['losses'],                  optimizer=keras.optimizers.adam(lr=params['lr']),                  metrics=['accuracy'])    history = model.fit(x_train, y_train,                         validation_data=[x_val, y_val],                        batch_size=params['batch_size'],                        epochs=params['epochs'],                        verbose=1)    y_pred = model.predict(x_train, batch_size=params['batch_size'])    history_dict = history.history    model_output = {'model':model,                     'history_dict':history_dict,                    'log_risk':y_pred}    return model_output

然后创建模型:

model(x_train, y_train, x_val, y_val)

到目前为止我的目标函数

‘log_risk’ 将是y_true,而x_train将用于计算y_pred

def avg_partial_likelihood(x_train, log_risk):    from lifelines import CoxPHFitter    cph = CoxPHFitter()    cph.fit(x_train, duration_col='survival_fu_combine', event_col='death',           show_progress=False)    # 获得exp(hx)    cph_output = pd.DataFrame(cph.summary).T    # 求和风险比    hazard_ratio_sum = cph_output.iloc[1,].sum()    # -log(sum(exp(hxj)))    neg_log_sum = -np.log(hazard_ratio_sum)    # 正事件(死亡==1)的总和    sum_noncensored_events = (x_train.death==1).sum()    # 负对数似然    neg_likelihood = -(log_risk + neg_log_sum)/sum_noncensored_events    return neg_likelihood

如果我尝试运行会出现的错误

  AttributeError                            Traceback (most recent call last)<ipython-input-26-cf0236299ad5> in <module>()----> 1 model(x_train, y_train, x_val, y_val)<ipython-input-25-d0f9409c831a> in model(x_train, y_train, x_val, y_val)     45     model.compile(loss=avg_partial_likelihood,     46                   optimizer=keras.optimizers.adam(lr=params['lr']),---> 47                   metrics=['accuracy'])     48      49     history = model.fit(x_train, y_train, ~\Anaconda3\lib\site-packages\keras\engine\training.py in compile(self, optimizer, loss, metrics, loss_weights, sample_weight_mode, weighted_metrics, target_tensors, **kwargs)    331                 with K.name_scope(self.output_names[i] + '_loss'):    332                     output_loss = weighted_loss(y_true, y_pred,--> 333                                                 sample_weight, mask)    334                 if len(self.outputs) > 1:    335                     self.metrics_tensors.append(output_loss)~\Anaconda3\lib\site-packages\keras\engine\training_utils.py in weighted(y_true, y_pred, weights, mask)    401         """    402         # score_array has ndim >= 2--> 403         score_array = fn(y_true, y_pred)    404         if mask is not None:    405             # Cast the mask to floatX to avoid float64 upcasting in Theano<ipython-input-23-ed57799a1f9d> in avg_partial_likelihood(x_train, log_risk)     27      28     cph.fit(x_train, duration_col='survival_fu_combine', event_col='death',---> 29            show_progress=False)     30      31     # obtain exp(hx)~\Anaconda3\lib\site-packages\lifelines\fitters\coxph_fitter.py in fit(self, df, duration_col, event_col, show_progress, initial_beta, strata, step_size, weights_col)     90         """     91 ---> 92         df = df.copy()     93      94         # Sort on timeAttributeError: 'Tensor' object has no attribute 'copy'

回答:

Related Posts

为什么我们在K-means聚类方法中使用kmeans.fit函数?

我在一个视频中使用K-means聚类技术,但我不明白为…

如何获取Keras中ImageDataGenerator的.flow_from_directory函数扫描的类名?

我想制作一个用户友好的GUI图像分类器,用户只需指向数…

如何查看每个词的tf-idf得分

我试图了解文档中每个词的tf-idf得分。然而,它只返…

如何修复 ‘ValueError: Found input variables with inconsistent numbers of samples: [32979, 21602]’?

我在制作一个用于情感分析的逻辑回归模型时遇到了这个问题…

如何向神经网络输入两个不同大小的输入?

我想向神经网络输入两个数据集。第一个数据集(元素)具有…

逻辑回归与机器学习有何关联

我们正在开会讨论聘请一位我们信任的顾问来做机器学习。一…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注