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

标签 python tensorflow machine-learning keras

我正在与 CNN 项目合作,对音高序列进行分类。音高类别共有 51 个类别,这意味着我想对数据集中的 51 个可用音高进行分类。

对于指标,我计划使用精确度、召回率、F1 分数。我引用this post使函数像这样:

我制作的函数:

from keras import backend as K

def 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 recall

def 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 precision

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()))

我使用metrics=['accuracy', f1_m, precision_m,recall_m]进行的模型运算

epochs = 200
batch_size = 50
weight_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.

如果我从指标中删除 f1_m、 precision_m、recall_m,我不会收到任何错误。 有没有关于如何将这些 f1_m、 precision_m、recall_m 包含在指标中而不出现 None value 错误的线索?还是因为我的分类不是二元的?谢谢。

最佳答案

根据 this thread您应该将优化器更改为:

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()))

关于Python:model.fit() 错误,不支持 None 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66085190/

相关文章:

java - 将 AWS SageMaker 机器学习模型转换为 Java 库

python - 如何使用 setup.py 只安装依赖项?

python - 在python中结合mp4和wav

python - 将多个值插入数据库

tensorflow - 如何在 Tensorflow 和 numpydoc 中使用 intersphinx?

node.js - 在 Node.js 中加载 TensorFlow 卡住图 (.pb)

tensorflow - 有人能给我解释一下 Multibox 损失函数吗?

python - 映射到列表错误 : Series object not callable

r - 如何使用 RevoScaleR 在 SQL Server 中创建表?

python - TF-IDF 和非 TF-IDF 功能的准确性