2017-02-09 35 views
14

Próbuję prosty kod demo tensorflow z github link.
obecnie używam wersji Pythona 3.5.2

TypeError: tylko całkowite tablice skalarne można przekonwertować na indeks skalarny

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. 

wpadłem na ten błąd, gdy próbowałem board.py w linii poleceń. Zainstalowałem wszystkie zależności, które są wymagane do uruchomienia.

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 

Odpowiedz

28

można zmodyfikować funkcję:

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

nową wersję:

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

dodać [0] w końcu.

To wydaje się być problem z najnowszą wersją Numpy. Niedawna zmiana spowodowała błąd w traktowaniu tablicy jednowarstwowej jako skalaru w celu indeksowania.

2

Ten plik jest prawdopodobnie uszkodzony:

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

Przeanalizujmy błąd wysłana.

To oznacza, że ​​kod jest obecnie pracuje z danego pliku:

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

Traceback wskazuje, że ślad stosu następująco:

Traceback (most recent call last): 

To oznacza, że ​​możesz czytać swoje zbiory danych z '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) 

To, wskazuje, że kod jest wyodrębnianie obrazów:

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

To wskazuje, że oczekuje się, że kod, aby przeczytać rows * cols * num_images bajtów:

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

Jest to linia, która błędy:

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 

I Oczekiwano, że size jest problematyczną wartością i został obliczony w poprzednim wierszu stosu.

Widzę co najmniej dwa sposoby postępowania.

  1. Usuń plik naruszający i sprawdź, czy problem zniknął. Umożliwiłoby to sprawdzenie, czy plik jest w jakiś sposób uszkodzony.

  2. Użyj debuggera, aby wejść do kodu, a następnie sprawdź wartości użyte do obliczenia zmiennej powodującej obrażenia. Wykorzystaj zdobytą wiedzę, aby przejść od tego miejsca.

3

Link Kod podałeś wykorzystuje oddzielny plik o nazwie input_data.py pobrać dane z MNIST stosując następujące dwie linie w board.py

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

Ponieważ dane MNIST jest tak często używane w celach demonstracyjnych, Tensorflow zapewnia sposób automatycznego pobierania.

Zastąp powyższe dwie linie w board.py następującymi dwoma liniami, a błąd zniknie.

from tensorflow.examples.tutorials.mnist import input_data 
mnist = input_data.read_data_sets('MNIST_data', one_hot=True) 
+1

Ten pracował dla mnie, ale wtedy dostał ten błąd: w_h = tf.histogram_summary („wagi”, w) AttributeError: Moduł „tensorflow” nie ma atrybutu „histogram_summary” –

+0

mający ten sam problem tutaj. – Amir

+1

To dlatego, że api zmienił się w najnowszej wersji. Teraz podsumowanie histogramu zostało przeniesione do tf.summary.histogram. – oat