TypeError:仅整数标量数组可以转换为标量索引
numpy
python
python-3.x
tensorflow
11
0

我正在尝试从github link获得一个简单的tensorflow演示代码。
我目前正在使用python版本3.5.2

Z:\downloads\tensorflow_demo-master\tensorflow_demo-master>py Python
3.5.2 (v3.5.2:4def2a2901a5, Jun 25 2016, 22:18:55) [MSC v.1900 64 bit (AMD64)] on win32<br> Type "help", "copyright", "credits" or "license" for more information.

我在命令行中尝试使用board.py时遇到了此错误。我已经安装了运行该程序所需的所有依赖项。

def _read32(bytestream):
    dt = numpy.dtype(numpy.uint32).newbyteorder('>')
    return numpy.frombuffer(bytestream.read(4), dtype=dt)

def extract_images(filename):
    """Extract the images into a 4D uint8 numpy array [index, y, x, depth]."""
    print('Extracting', filename)
    with gzip.open(filename) as bytestream:
        magic = _read32(bytestream)
        if magic != 2051:
            raise ValueError(
                'Invalid magic number %d in MNIST image file: %s' %
                (magic, filename))
        num_images = _read32(bytestream)
        rows = _read32(bytestream)
        cols = _read32(bytestream)
        buf = bytestream.read(rows * cols * num_images)
        data = numpy.frombuffer(buf, dtype=numpy.uint8)
        data = data.reshape(num_images, rows, cols, 1)
    return data

Z:\downloads\tensorflow_demo-master\tensorflow_demo-master>py board.py
Extracting  Z:/downloads/MNIST dataset\train-images-idx3-ubyte.gz
Traceback (most recent call last):  
File "board.py", line 3, in <module>
    mnist = input_data.read_data_sets(r'Z:/downloads/MNIST dataset', one_hot=True)  
File "Z:\downloads\tensorflow_demo-master\tensorflow_demo-master\input_data.py", line 150, in read_data_sets
    train_images = extract_images(local_file) 
File "Z:\downloads\tensorflow_demo-master\tensorflow_demo-master\input_data.py", line 40, in extract_images
    buf = bytestream.read(rows * cols * num_images) 
File "C:\Users\surak\AppData\Local\Programs\Python\Python35\lib\gzip.py", line 274, in read
    return self._buffer.read(size)
TypeError: only integer scalar arrays can be converted to a scalar index
参考资料:
Stack Overflow
收藏
评论
共 3 个回答
高赞 时间 活跃

您可以修改功能:

def _read32(bytestream):
    dt = numpy.dtype(numpy.uint32).newbyteorder('>')
    return numpy.frombuffer(bytestream.read(4), dtype=dt)

新版本:

def _read32(bytestream):
    dt = numpy.dtype(numpy.uint32).newbyteorder('>')
    return numpy.frombuffer(bytestream.read(4), dtype=dt)[0]

最后加[0]

这似乎是最新版本的Numpy的问题。最近的更改使出于索引目的将单元素数组视为标量是错误的。

收藏
评论

您提供使用名为一个单独的文件中的代码链接input_data.py使用以下两行从MNIST到下载数据board.py

import input_data 
mnist = input_data.read_data_sets("/tmp/data/",one_hot=True)

由于MNIST数据经常用于演示目的,因此Tensorflow提供了一种自动下载数据的方法。

用以下两行替换board.py的以上两行,错误将消失。

from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets('MNIST_data', one_hot=True)
收藏
评论

该文件可能已损坏:

Z:/downloads/MNIST dataset\train-images-idx3-ubyte.gz

让我们分析您发布的错误。

这表明代码当前正在处理相关文件:

Extracting  Z:/downloads/MNIST dataset\train-images-idx3-ubyte.gz

Traceback指示遵循堆栈跟踪:

Traceback (most recent call last):

这表明您从'Z:/downloads/MNIST dataset'

File "board.py", line 3, in <module>
    mnist = input_data.read_data_sets(r'Z:/downloads/MNIST dataset', one_hot=True)

这表明该代码正在提取图像:

File "Z:\downloads\tensorflow_demo-master\tensorflow_demo-master\input_data.py", line 150, in read_data_sets
    train_images = extract_images(local_file)

这表明代码应读取rows * cols * num_images个字节:

File "Z:\downloads\tensorflow_demo-master\tensorflow_demo-master\input_data.py", line 40, in extract_images
    buf = bytestream.read(rows * cols * num_images)

这是错误的行:

File "C:\Users\surak\AppData\Local\Programs\Python\Python35\lib\gzip.py", line 274, in read
    return self._buffer.read(size)
TypeError: only integer scalar arrays can be converted to a scalar index

我希望size是有问题的值,并且是在stacktrace的前一行计算得出的。

我至少可以看到两种方法。

  1. 删除有问题的文件,然后查看问题是否消失。这将使您能够验证文件是否以某种方式损坏。

  2. 使用调试器进入代码,然后检查用于计算有问题的变量的值。使用所获得的知识从那里继续。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题