【问题标题】:ValueError: Dimension (-1) must be in the range [0, 2) in KerasValueError:维度 (-1) 必须在 Keras 中的 [0, 2) 范围内
【发布时间】:2018-02-28 12:33:13
【问题描述】:

突然间,我在使用 tensorflow 后端 (python2.7) 的 kears 时遇到了这个错误,每个代码都出现同样的错误。我认为它的 keras 1 和 2 不兼容,但事实并非如此

Dimension (-1) must be in the range [0, 2), where 2 is the number of dimensions in the input. for 'metrics/acc/ArgMax' (op: 'ArgMax') with input shapes: [?,?], [].

'我更新了 tensorflow 和 keras 类似的问题(链接↓↓)但仍然是同样的错误 ValueError: Dimension (-1) must be in the range [0, 2) 完整代码(示例)

**Code updated the whole code** 

using TensorFlow backend.
I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA   library libcublas.so locally
I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcudnn.so locally
I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA   library libcufft.so locally
I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcuda.so.1 locally
I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA  library libcurand.so locally
60000 train samples
10000 test samples
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_1 (Dense)              (None, 512)               401920    
 _________________________________________________________________
dropout_1 (Dropout)          (None, 512)               0         
_________________________________________________________________
dense_2 (Dense)              (None, 512)               262656    
_________________________________________________________________
dropout_2 (Dropout)          (None, 512)               0         
_________________________________________________________________
dense_3 (Dense)              (None, 10)                5130      
=================================================================
Total params: 669,706
Trainable params: 669,706
Non-trainable params: 0
_________________________________________________________________
Traceback (most recent call last):
  File "mnist_mlp.py", line 48, in <module>
    metrics=['accuracy'])
  File "/home/usr/miniconda2/lib/python2.7/site-packages/keras/models.py", line 784, in compile
    **kwargs)
  File "/home/usr/miniconda2/lib/python2.7/site-packages/keras/engine/training.py", line 924, in compile
    handle_metrics(output_metrics)
  File "/home/usr/miniconda2/lib/python2.7/site-packages/keras/engine/training.py", line 921, in handle_metrics
    mask=masks[i])
  File "/home/usr/miniconda2/lib/python2.7/site-packages/keras/engine/training.py", line 450, in weighted
    score_array = fn(y_true, y_pred)
  File "/home/usr/miniconda2/lib/python2.7/site-packages/keras/metrics.py", line 25, in categorical_accuracy
    return K.cast(K.equal(K.argmax(y_true, axis=-1),
  File "/home/usr/miniconda2/lib/python2.7/site-packages/keras/backend/tensorflow_backend.py", line 1333, in argmax
    return tf.argmax(x, axis)
  File "/home/usr/.local/lib/python2.7/site-packages/tensorflow/python/ops/math_ops.py", line 249, in argmax
    return gen_math_ops.arg_max(input, axis, name)
  File "/home/usr/.local/lib/python2.7/site-packages/tensorflow/python/ops/gen_math_ops.py", line 168, in arg_max
    name=name)
  File "/home/usr/.local/lib/python2.7/site-packages/tensorflow/python/framework/op_def_library.py", line 759, in apply_op
    op_def=op_def)
  File "/home/usr/.local/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 2242, in create_op
    set_shapes_for_outputs(ret)
  File "/home/usr/.local/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 1617, in set_shapes_for_outputs
    shapes = shape_func(op)
  File "/home/usr/.local/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 1568, in call_with_requiring
    return call_cpp_shape_fn(op, require_shape_fn=True)
  File "/home/usr/.local/lib/python2.7/site-packages/tensorflow/python/framework/common_shapes.py", line 610, in call_cpp_shape_fn
    debug_python_shape_fn, require_shape_fn)
  File "/home/usr/.local/lib/python2.7/site-packages/tensorflow/python/framework/common_shapes.py", line 675, in _call_cpp_shape_fn_impl
    raise ValueError(err.message)
ValueError: Dimension (-1) must be in the range [0, 2), where 2 is the number of dimensions in the input. for 'metrics/acc/ArgMax' (op: 'ArgMax') with input shapes: [?,?], [].'

【问题讨论】:

标签: tensorflow keras


【解决方案1】:

当我尝试将已保存的模型从我的 mac 加载到 DigOcean 时,我遇到了相同的错误消息(由于默认的 Digital Ocean 应用程序)。更新 tensorflow 使用:

pip3 install --upgrade tensorflow

并且安装了 1.3.0,当我重新启动 jupyter 内核时问题得到解决。

【讨论】:

    【解决方案2】:

    我刚开始玩 Keras,遇到了同样的问题。我遵循了不同论坛上提出的不同解决方法——包括运行 tensorflow/keras 本身的升级——但这似乎对我不起作用。

    问题似乎是 Keras 中的 argmax 函数。默认情况下调用后端时,axis=-1 超出范围,因为只有 [0, 2) 是合法的。

    我的解决方案一直是重写分类准确度函数:

    import keras.backend as K
    
    def get_categorical_accuracy_keras(y_true, y_pred):
        return K.mean(K.equal(K.argmax(y_true, axis=1), K.argmax(y_pred, axis=1)))
    

    (我在this thread找到公式)

    它应该等效于以下利用 numpy 库的函数:

    import numpy as np
    
    def get_categorical_accuracy(y_true, y_pred):
        return (np.argmax(y_true, axis=1) == np.argmax(y_pred, axis=1)).mean()
    

    在模型编译中使用get_categorical_accuracy_keras函数:

    model.compile(loss=losses.categorical_crossentropy, optimizer='adam', metrics=[get_categorical_accuracy_keras])
    

    似乎解决了问题。

    当然,我自己也想使用已经定义的准确度,所以欢迎任何在这个意义上的建议

    【讨论】:

    • 我能够使用这种方法来获得准确性。但是,当尝试使用此指标加载保存的模型时,会引发“未知指标函数:get_categorical_accuracy_keras”错误。我使用了 keras.model 中的“load_model”...
    • 我在加载模型时传递了一个自定义对象。结果很好。感谢您的解决方案!
    猜你喜欢
    • 2018-02-22
    • 1970-01-01
    • 2018-04-29
    • 2021-05-12
    • 2019-11-25
    • 1970-01-01
    • 2016-12-21
    • 1970-01-01
    • 2018-05-31
    相关资源
    最近更新 更多