UnboundLocalError: local variable 'class_name' referenced before assignment

UnboundLocalError: local variable 'class_name' referenced before assignment

我是 Keras 和 Theano 的新手,现在正尝试在 Keras 上实现我自己的损失函数。但是这个错误出现了。我认为问题出在我自己的损失函数上,但我现在知道如何解决它了。有人可以帮我解决这个问题吗?

import theano
import theano.tensor as T
def cost_estimation(y_true, y_pred):
    for k in range(10):
        d=T.log(1+T.exp((int(bool(y_true[k]==min(y_true)))*2-1)*(y_pred[k]-y_true[k])))
        cost=cost+d
    return  d  

keras 层:

model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3),
                 activation='relu',
                 input_shape=input_shape))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(num_classes, activation='relu'))

#loss=keras.losses.categorical_crossentropy,
model.compile(loss='cost_estimation',
              optimizer='adam',
              metrics=['accuracy'])

model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs,
          verbose=1, validation_data=(x_test, y_test))

这里是错误:

    ---------------------------------------------------------------------------
UnboundLocalError                         Traceback (most recent call last)
<ipython-input-6-d63101c47c94> in <module>()
    130 model.compile(loss='cost_estimation',
    131               optimizer='adam',
--> 132               metrics=['accuracy'])
    133 
    134 model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs,

/usr/local/lib/python2.7/dist-packages/keras/models.pyc in compile(self, optimizer, loss, metrics, sample_weight_mode, **kwargs)
    764                            metrics=metrics,
    765                            sample_weight_mode=sample_weight_mode,
--> 766                            **kwargs)
    767         self.optimizer = self.model.optimizer
    768         self.loss = self.model.loss

/usr/local/lib/python2.7/dist-packages/keras/engine/training.pyc in compile(self, optimizer, loss, metrics, loss_weights, sample_weight_mode, **kwargs)
    738             loss_functions = [losses.get(l) for l in loss]
    739         else:
--> 740             loss_function = losses.get(loss)
    741             loss_functions = [loss_function for _ in range(len(self.outputs))]
    742         self.loss_functions = loss_functions

/usr/local/lib/python2.7/dist-packages/keras/losses.pyc in get(identifier)
     88     if isinstance(identifier, six.string_types):
     89         identifier = str(identifier)
---> 90         return deserialize(identifier)
     91     elif callable(identifier):
     92         return identifier

/usr/local/lib/python2.7/dist-packages/keras/losses.pyc in deserialize(name, custom_objects)
     80                                     module_objects=globals(),
     81                                     custom_objects=custom_objects,
---> 82                                     printable_module_name='loss function')
     83 
     84 

/usr/local/lib/python2.7/dist-packages/keras/utils/generic_utils.pyc in deserialize_keras_object(identifier, module_objects, custom_objects, printable_module_name)
    155             if fn is None:
    156                 raise ValueError('Unknown ' + printable_module_name,
--> 157                                  ':' + class_name)
    158         return fn
    159     else:

UnboundLocalError: local variable 'class_name' referenced before assignment

这似乎是 keras 代码库中的一个问题。似乎如果将 a 字符串传递给 loss 参数,则会出现此错误。要解决此问题,请通过 cost_estimation 本身就丢失了,这样你就避免了那个代码分支。

model.compile(optimizer='rmsprop',
                  loss=cost_estimation, # not 'cost_estimation'
                  metrics=['accuracy'])