Python 无法在keras中定义自定义损失函数

Python 无法在keras中定义自定义损失函数,python,tensorflow,keras,jupyter-notebook,Python,Tensorflow,Keras,Jupyter Notebook,使用: Keras 2.1.5 ipython 6.2.1 ipython_genutils 0.2.0 Python 3 Windows 7(x64)-8GB ram-仅限CPU 我正试图在jupyter笔记本上制作一个神经网络,它工作得很好,直到我决定编写一个自定义损失函数。对于初学者,我决定编写一个简单的均方损失函数。 损失函数为: def msqeloss(y_true, y_pred): return K.sum(K.square(y_true-y_pred),0) 我将此

使用:

  • Keras 2.1.5
  • ipython 6.2.1
  • ipython_genutils 0.2.0
  • Python 3
  • Windows 7(x64)-8GB ram-仅限CPU
  • 我正试图在jupyter笔记本上制作一个神经网络,它工作得很好,直到我决定编写一个自定义损失函数。对于初学者,我决定编写一个简单的均方损失函数。 损失函数为:

    def msqeloss(y_true, y_pred):
         return K.sum(K.square(y_true-y_pred),0)
    
    我将此函数输入到模型中,如下所示:

    ...
    model.add(Dropout(0.1))
    model.add(Flatten())
    model.add(Dense(120,activation='relu'))
    model.add(Dropout(0.1))
    model.add(Dense(3,activation='softmax'))
    model.compile(optimizer='RMSprop',loss=msqeloss,metrics=['accuracy'])
    ...
    
    完整堆栈错误如下所示:

     AttributeError                            Traceback (most recent call last)
    <ipython-input-10-86f0a38b9a14> in <module>()
         42         model.add(Dropout(0.1))
         43         model.add(Dense(3,activation='softmax'))
    ---> 44         model.compile(optimizer='RMSprop',loss=msqeloss,metrics=['accuracy'])
         45         csv_logger = CSVLogger('meanlog_loss_log'+str(index)+'.csv', append=True, separator=';')
         46         model.fit(Xtrain,one_hot_labels,batch_size=10,epochs=Epochs,validation_data=(Xtest,np_utils.to_categorical(ytest, num_classes=3)),callbacks=[csv_logger])
    
    ~\Anaconda3\lib\site-packages\keras\models.py in compile(self, optimizer, loss, metrics, sample_weight_mode, weighted_metrics, target_tensors, **kwargs)
        822                            weighted_metrics=weighted_metrics,
        823                            target_tensors=target_tensors,
    --> 824                            **kwargs)
        825         self.optimizer = self.model.optimizer
        826         self.loss = self.model.loss
    
    ~\Anaconda3\lib\site-packages\keras\engine\training.py in compile(self, optimizer, loss, metrics, loss_weights, sample_weight_mode, weighted_metrics, target_tensors, **kwargs)
        828                 with K.name_scope(self.output_names[i] + '_loss'):
        829                     output_loss = weighted_loss(y_true, y_pred,
    --> 830                                                 sample_weight, mask)
        831                 if len(self.outputs) > 1:
        832                     self.metrics_tensors.append(output_loss)
    
    ~\Anaconda3\lib\site-packages\keras\engine\training.py in weighted(y_true, y_pred, weights, mask)
        427         """
        428         # score_array has ndim >= 2
    --> 429         score_array = fn(y_true, y_pred)
        430         if mask is not None:
        431             # Cast the mask to floatX to avoid float64 upcasting in Theano
    
    <ipython-input-9-d8157a575c41> in msqeloss(y_true, y_pred)
          1 def msqeloss(y_true, y_pred):
    ----> 2     return K.sum(K.square(y_true-y_pred),0)
    
    AttributeError: 'int' object has no attribute 'sum'
    
    AttributeError回溯(最近一次调用)
    在()
    42型号。添加(辍学(0.1))
    43型号。添加(密集型(3,激活=softmax'))
    --->44 model.compile(优化器='RMSprop',loss=msqeloss,metrics=['accurity']))
    45 csv_logger=CSVLogger('meanlog_loss_log'+str(index)+'.csv',append=True,separator=';'))
    46 model.fit(Xtrain,one_hot_标签,批处理大小=10,epochs=epochs,验证数据=(Xtest,np_utils.to_category(ytest,num_classes=3)),回调=[csv_logger])
    编译中的~\Anaconda3\lib\site packages\keras\models.py(self、优化器、损耗、度量、样本权重模式、加权度量、目标张量、**kwargs)
    822加权度量=加权度量,
    823目标张量=目标张量,
    -->824**夸尔格)
    825 self.optimizer=self.model.optimizer
    826 self.loss=self.model.loss
    编译中的~\Anaconda3\lib\site packages\keras\engine\training.py(self、优化器、损耗、度量、损耗权重、样本权重模式、加权度量、目标张量、**kwargs)
    828带有K.name \-u作用域(self.output \-u names[i]+'.\u loss'):
    829输出损耗=加权损耗(y_真,y_pred,
    -->830样品(重量,面罩)
    831如果透镜(自输出)>1:
    832自度量张量追加(输出损失)
    ~\Anaconda3\lib\site packages\keras\engine\training.py加权(y_真、y_pred、权重、掩码)
    427         """
    428#分数_阵列的ndim>=2
    -->429分数数组=fn(y_真,y_pred)
    430如果掩码不是无:
    431#将遮罩投射到floatX上,以避免float64在场景中向上投射
    在msqeloss中(y_true,y_pred)
    1 def msqeloss(y_true,y_pred):
    ---->2返回K.sum(K.square(y_true-y_pred),0)
    AttributeError:“int”对象没有属性“sum”
    
    我是Keras的新手,任何帮助都将不胜感激。请帮我解决这个问题,因为它已经困扰我两天了。
    提前感谢。

    您在哪里定义了
    K
    ?是的,正如@Kapil所提到的,似乎在您的代码中的某个地方,您将
    K
    keras.backend
    重新定义为
    int
    变量……非常感谢您。即使在这里问这个问题,我现在也觉得很傻。非常感谢!