Python: model.fit() 错误,None 值不受支持

我正在进行一个卷积神经网络(CNN)项目,用于对一系列音高进行分类。音高类别总共有51类,意味着我希望对数据集中可用的51个音高进行分类。

对于评估指标,我计划使用精确率、召回率和F1分数。我参考了这个帖子来创建如下函数:

我创建的函数如下:

from keras import backend as Kdef recall_m(y_true, y_pred):    true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))    possible_positives = K.sum(K.round(K.clip(y_true, 0, 1)))    recall = true_positives / (possible_positives + K.epsilon())    return recalldef precision_m(y_true, y_pred):    true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))    predicted_positives = K.sum(K.round(K.clip(y_pred, 0, 1)))    precision = true_positives / (predicted_positives + K.epsilon())    return precisiondef f1_m(y_true, y_pred):    precision = precision_m(y_true, y_pred)    recall = recall_m(y_true, y_pred)    return 2*((precision*recall)/(precision+recall+K.epsilon()))

我使用metrics=['accuracy', f1_m, precision_m, recall_m]创建的模型操作如下:

epochs = 200batch_size = 50weight_optimizer = keras.optimizers.Adam(lr=0.0001)with tf.device('/device:GPU:0'):  model.compile(optimizer = weight_optimizer , loss = "categorical_crossentropy", metrics=['accuracy', f1_m, precision_m, recall_m]])  history = model.fit(X_train, y_train, batch_size = batch_size, epochs = epochs, verbose = 1, validation_split=0.1)

然后我得到了这个错误:

ValueError: in user code:    /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/training.py:805 train_function  *        return step_function(self, iterator)    /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/training.py:795 step_function  **        outputs = model.distribute_strategy.run(run_step, args=(data,))    /usr/local/lib/python3.6/dist-packages/tensorflow/python/distribute/distribute_lib.py:1259 run        return self._extended.call_for_each_replica(fn, args=args, kwargs=kwargs)    /usr/local/lib/python3.6/dist-packages/tensorflow/python/distribute/distribute_lib.py:2730 call_for_each_replica        return self._call_for_each_replica(fn, args, kwargs)    /usr/local/lib/python3.6/dist-packages/tensorflow/python/distribute/distribute_lib.py:3417 _call_for_each_replica        return fn(*args, **kwargs)    /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/training.py:788 run_step  **        outputs = model.train_step(data)    /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/training.py:758 train_step        self.compiled_metrics.update_state(y, y_pred, sample_weight)    /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/compile_utils.py:408 update_state        metric_obj.update_state(y_t, y_p, sample_weight=mask)    /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/utils/metrics_utils.py:90 decorated        update_op = update_state_fn(*args, **kwargs)    /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/metrics.py:177 update_state_fn        return ag_update_state(*args, **kwargs)    /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/metrics.py:620 update_state  **        matches, sample_weight=sample_weight)    /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/metrics.py:355 update_state        values = math_ops.cast(values, self._dtype)    /usr/local/lib/python3.6/dist-packages/tensorflow/python/util/dispatch.py:201 wrapper        return target(*args, **kwargs)    /usr/local/lib/python3.6/dist-packages/tensorflow/python/ops/math_ops.py:964 cast        x = ops.convert_to_tensor(x, name="x")    /usr/local/lib/python3.6/dist-packages/tensorflow/python/profiler/trace.py:163 wrapped        return func(*args, **kwargs)    /usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/ops.py:1540 convert_to_tensor        ret = conversion_func(value, dtype=dtype, name=name, as_ref=as_ref)    /usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/constant_op.py:339 _constant_tensor_conversion_function        return constant(v, dtype=dtype, name=name)    /usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/constant_op.py:265 constant        allow_broadcast=True)    /usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/constant_op.py:283 _constant_impl        allow_broadcast=allow_broadcast))    /usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/tensor_util.py:445 make_tensor_proto        raise ValueError("None values not supported.")    ValueError: None values not supported.

如果我从metrics中删除f1_m, precision_m, recall_m,就不会出现任何错误。是否有任何线索可以让我在不出现None values错误的情况下将这些f1_m, precision_m, recall_m包含在metrics中?或者是因为我的分类不是二元分类?谢谢你。


回答:

根据这个线程,你应该将优化器改为如下:

optimizer = "adam"

另外,你的函数f1_m是不完整的,应该是这样的。

def f1_m(y_true, y_pred):    precision = precision_m(y_true, y_pred)    recall = recall_m(y_true, y_pred)    return 2*((precision*recall)/(precision+recall+K.epsilon()))

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

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