Ошибка StopIteration при попытке построить ввод данных для модели

from __future__ import print_function

import tensorflow as tf
import os

#Dataset Parameters - CHANGE HERE
MODE = 'folder' # or 'file', if you choose a plain text file (see above).
DATASET_PATH = "D:\\Downloads\\Work\\" # the dataset file or root folder path.

# Image Parameters
N_CLASSES = 7 # CHANGE HERE, total number of classes
IMG_HEIGHT = 64 # CHANGE HERE, the image height to be resized to
IMG_WIDTH = 64 # CHANGE HERE, the image width to be resized to
CHANNELS = 3 # The 3 color channels, change to 1 if grayscale

# Reading the dataset
# 2 modes: 'file' or 'folder'
def read_images(dataset_path, mode, batch_size):
    imagepaths, labels = list(), list()
    if mode == 'file':
        # Read dataset file
        data = open(dataset_path, 'r').read().splitlines()
        for d in data:
            imagepaths.append(d.split(' ')[0])
            labels.append(int(d.split(' ')[1]))
    elif mode == 'folder':
        # An ID will be affected to each sub-folders by alphabetical order
        label = 0
        # List the directory
        #try:  # Python 2
        classes = next(os.walk(dataset_path))[1]
        #except Exception:  # Python 3
        #    classes = sorted(os.walk(dataset_path).__next__()[1])
        # List each sub-directory (the classes)
        for c in classes:
            c_dir = os.path.join(dataset_path, c)
            try:  # Python 2
                walk = os.walk(c_dir).next()
            except Exception:  # Python 3
                walk = os.walk(c_dir).__next__()
            # Add each image to the training set
            for sample in walk[2]:
                # Only keeps jpeg images
                if sample.endswith('.bmp'):
                    imagepaths.append(os.path.join(c_dir, sample))
                    labels.append(label)
            label += 1
    else:
        raise Exception("Unknown mode.")

    # Convert to Tensor
    imagepaths = tf.convert_to_tensor(imagepaths, dtype=tf.string)
    labels = tf.convert_to_tensor(labels, dtype=tf.int32)
    # Build a TF Queue, shuffle data
    image, label = tf.train.slice_input_producer([imagepaths, labels],
                                                 shuffle=True)

    # Read images from disk
    image = tf.read_file(image)
    image = tf.image.decode_jpeg(image, channels=CHANNELS)

    # Resize images to a common size
    image = tf.image.resize_images(image, [IMG_HEIGHT, IMG_WIDTH])

    # Normalize
    image = image * 1.0/127.5 - 1.0

    # Create batches
    X, Y = tf.train.batch([image, label], batch_size=batch_size,
                          capacity=batch_size * 8,
                          num_threads=4)

    return X, Y

# Parameters
learning_rate = 0.001
num_steps = 10000
batch_size = 32
display_step = 100

# Network Parameters
dropout = 0.75 # Dropout, probability to keep units

# Build the data input
X, Y = read_images(DATASET_PATH, MODE, batch_size)

Выдает ошибку

StopIteration                             Traceback (most recent call last)
<ipython-input-27-510f945ab86c> in <module>()
      9 
     10 # Build the data input
---> 11 X, Y = read_images(DATASET_PATH, MODE, batch_size)

<ipython-input-26-c715e653cf59> in read_images(dataset_path, mode, batch_size)
     14         # List the directory
     15         #try:  # Python 2
---> 16         classes = next(os.walk(dataset_path))[1]
     17         #except Exception:  # Python 3
     18         #    classes = sorted(os.walk(dataset_path).__next__()[1])

StopIteration: 

Я видел документацию для next() и обнаружил, что вы больше не можете использовать at как .next, но после исправления он по-прежнему выдает ошибку StopIteration. Я проверил значение classes на моем локальном Python, и он дает мне список ['Класс0', 'Класс1', 'Класс2', 'Класс3', 'Класс4', 'Класс5', 'Класс6']


person Huck Finn    schedule 25.11.2020    source источник
comment
Я использовал это руководство, чтобы помочь мне wizardforcel.gitbooks.io/tensorflow- примеры-aymericdamien/   -  person Huck Finn    schedule 26.11.2020
comment
Добро пожаловать в Stackoverflow. Вы можете проверить это: минимальный воспроизводимый пример и соответствующим образом отредактировать свой вопрос, так как он, кажется, содержит много кода, который, на первый взгляд, может не иметь отношения к вашему вопросу. Это поможет другим помочь вам с вашей проблемой.   -  person piterbarg    schedule 26.11.2020


Ответы (2)


StopIteration означает, что итерируемый объект пуст, вы также получаете его в таком случае:

>>> next(iter([]))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

Скорее всего указанный вами путь не существует.

person Cory Nezin    schedule 25.11.2020

os.walk возвращает итератор, и есть хитрая деталь: сам python использует исключения, в частности StopIteration, чтобы сигнализировать о том, что итератор полностью использован.

В вашем примере я предполагаю, что, вероятно, каталог, который вы пытаетесь пройти, пуст.

Я думаю, что вам, вероятно, следует использовать os.listdir для вывода содержимого каталога.

https://docs.python.org/3/library/os.html#os.listdir

person Joac    schedule 25.11.2020