2017-02-09 22 views
14

我正在嘗試一個簡單的來自github link的tensorflow演示代碼。
我目前使用Python版本3.5.2

TypeError:只能將整數標量數組轉換爲標量索引

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 

回答

28

可以修改功能:

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的問題。最近的一次更改使得將單元素數組作爲標量用於索引的過程中出現錯誤。

2

此文件可能損壞:

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是有問題的值,是在堆棧跟蹤的上一行計算的。

我可以看到至少有兩種方法可以繼續。

  1. 刪除有問題的文件,看看問題是否消失。這將允許您驗證文件以某種方式損壞。

  2. 使用調試器進入代碼,然後檢查用於計算違規變量的值。使用獲得的知識從那裏開始。

3

您提供的代碼鏈接使用名爲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) 
+1

這對我有用,但後來得到這個錯誤:w_h = tf.histogram_summary(「權重」,W) AttributeError:模塊'tensorflow'沒有屬性'histogram_summary' –

+0

在這裏有相同的問題。 – Amir

+1

這是因爲api在最新版本中發生了變化。現在直方圖彙總已移至tf.summary.histogram。 – oat

相關問題