TypeError: только целочисленные скалярные массивы могут быть преобразованы в скалярный индекс
Я пытаюсь создать простой демонстрационный код тензорного потока из github link.
Я в настоящее время использую 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
Ответы
Ответ 1
вы можете изменить функцию:
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
В приведенной ссылке кода используется отдельный файл с именем 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)
Ответ 3
Этот файл, скорее всего, поврежден:
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
bytes:
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.
Я вижу как минимум два способа продолжения.
-
Удалите повреждающий файл и посмотрите, не исчезла ли проблема. Это позволит вам проверить, что файл каким-то образом поврежден.
-
Используйте отладчик для входа в код и затем проверяйте значения, используемые для вычисления переменной-нарушителя. Используйте полученные знания, чтобы исходить оттуда.