TypeError:“ str”对象不是迭代器

时间:2019-11-25 15:50:09

标签: python tensorflow keras deep-learning

我正在尝试使用macOS Anaconda运行基本的CNN。 所有Keras ati都是最新的(我至少这样认为,但我确定是这样)

除了需要运行此行时,我能够运行所有内容,

classifier.fit_generator('training_set',
                     steps_per_epoch = 8000,
                     epochs = 25,
                     validation_data = test_set

当我尝试运行时出现错误,

TypeError:“ str”对象不是迭代器

这是我的代码,

# Importing the Keras libraries and packages
from keras.models import Sequential
from keras.layers import Conv2D
from keras.layers import MaxPooling2D
from keras.layers import Flatten
from keras.layers import Dense

# Initialising the CNN
classifier = Sequential()

# Step 1 - Convolution
classifier.add(Conv2D(32, (3, 3), input_shape = (64, 64, 3), activation = 'relu'))

# Step 2 - Pooling
classifier.add(MaxPooling2D(pool_size = (2, 2)))

# Adding a second convolutional layer
classifier.add(Conv2D(32, (3, 3), activation = 'relu'))
classifier.add(MaxPooling2D(pool_size = (2, 2)))

# Step 3 - Flattening
classifier.add(Flatten())

# Step 4 - Full connection
classifier.add(Dense(units = 128, activation = 'relu'))
classifier.add(Dense(units = 1, activation = 'sigmoid'))

# Compiling the CNN
classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])

# Part 2 - Fitting the CNN to the images

from keras.preprocessing.image import ImageDataGenerator

train_datagen = ImageDataGenerator(rescale = 1./255,
                                   shear_range = 0.2,
                                   zoom_range = 0.2,
                                   horizontal_flip = True)

test_datagen = ImageDataGenerator(rescale = 1./255)

training_set = train_datagen.flow_from_directory('/Users/Dan/Desktop/CNN/dataset/training_set',
                                                 target_size = (64, 64),
                                                 batch_size = 32,
                                                 class_mode = 'binary')

test_set = test_datagen.flow_from_directory('/Users/Dan/Desktop/CNN/dataset/test_set',
                                            target_size = (64, 64),
                                            batch_size = 32,
                                            class_mode = 'binary')

classifier.fit_generator('training_set',
                         steps_per_epoch = 8000,
                         epochs = 25,
                         validation_data = test_set,
                         validation_steps = 2000)

# Saving Weights
weights = classifier.save_weights

"""
Single Prediction
"""
import numpy as np
from keras.preprocessing import image


test_image = image.load_img(('dataset/predictions/cat_or_dog_2.jpg'), target_size=(64, 64))
test_image = image.img_to_array(test_image)
test_image = np.expand_dims(test_image, axis = 0)
result = classifier.predict(test_image)
training_set.class_indices
if result[0][0] == 1:
    prediction = 'Dog'
else:
    prediction = 'Cat'

这是代码本身正在运行的错误,

from keras.models import Sequential
from keras.layers import Conv2D
from keras.layers import MaxPooling2D
from keras.layers import Flatten
from keras.layers import Dense

# Initialising the CNN
classifier = Sequential()

# Step 1 - Convolution
classifier.add(Conv2D(32, (3, 3), input_shape = (64, 64, 3), activation = 'relu'))

# Step 2 - Pooling
classifier.add(MaxPooling2D(pool_size = (2, 2)))

# Adding a second convolutional layer
classifier.add(Conv2D(32, (3, 3), activation = 'relu'))
classifier.add(MaxPooling2D(pool_size = (2, 2)))

# Step 3 - Flattening
classifier.add(Flatten())

# Step 4 - Full connection
classifier.add(Dense(units = 128, activation = 'relu'))
classifier.add(Dense(units = 1, activation = 'sigmoid'))

# Compiling the CNN
classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])
Using TensorFlow backend.
2019-11-25 19:39:19.093497: I tensorflow/core/platform/cpu_feature_guard.cc:145] This TensorFlow binary is optimized with Intel(R) MKL-DNN to use the following CPU instructions in performance critical operations:  SSE4.1 SSE4.2 AVX AVX2 FMA
To enable them in non-MKL-DNN operations, rebuild TensorFlow with the appropriate compiler flags.
2019-11-25 19:39:19.095093: I tensorflow/core/common_runtime/process_util.cc:115] Creating new thread pool with default inter op setting: 4. Tune using inter_op_parallelism_threads for best performance.

from keras.preprocessing.image import ImageDataGenerator

train_datagen = ImageDataGenerator(rescale = 1./255,
                                   shear_range = 0.2,
                                   zoom_range = 0.2,
                                   horizontal_flip = True)

test_datagen = ImageDataGenerator(rescale = 1./255)

training_set = train_datagen.flow_from_directory('/Users/Dan/Desktop/CNN/dataset/training_set',
                                                 target_size = (64, 64),
                                                 batch_size = 32,
                                                 class_mode = 'binary')
Found 8000 images belonging to 2 classes.

test_set = test_datagen.flow_from_directory('/Users/Dan/Desktop/CNN/dataset/test_set',
                                            target_size = (64, 64),
                                            batch_size = 32,
                                            class_mode = 'binary')
Found 2000 images belonging to 2 classes.

classifier.fit_generator('training_set',
                         steps_per_epoch = 8000,
                         epochs = 25,
                         validation_data = test_set,
                         validation_steps = 2000)
Epoch 1/25
Traceback (most recent call last):

  File "<ipython-input-7-e4696e5027ff>", line 5, in <module>
    validation_steps = 2000)

  File "/Users/Dan/opt/anaconda3/lib/python3.7/site-packages/keras/legacy/interfaces.py", line 91, in wrapper
    return func(*args, **kwargs)

  File "/Users/Dan/opt/anaconda3/lib/python3.7/site-packages/keras/engine/training.py", line 1732, in fit_generator
    initial_epoch=initial_epoch)

  File "/Users/Dan/opt/anaconda3/lib/python3.7/site-packages/keras/engine/training_generator.py", line 185, in fit_generator
    generator_output = next(output_generator)

  File "/Users/Dan/opt/anaconda3/lib/python3.7/site-packages/keras/utils/data_utils.py", line 742, in get
    six.reraise(*sys.exc_info())

  File "/Users/Dan/opt/anaconda3/lib/python3.7/site-packages/six.py", line 696, in reraise
    raise value

  File "/Users/Dan/opt/anaconda3/lib/python3.7/site-packages/keras/utils/data_utils.py", line 711, in get
    inputs = future.get(timeout=30)

  File "/Users/Dan/opt/anaconda3/lib/python3.7/multiprocessing/pool.py", line 657, in get
    raise self._value

  File "/Users/Dan/opt/anaconda3/lib/python3.7/multiprocessing/pool.py", line 121, in worker
    result = (True, func(*args, **kwds))

  File "/Users/Dan/opt/anaconda3/lib/python3.7/site-packages/keras/utils/data_utils.py", line 650, in next_sample
    return six.next(_SHARED_SEQUENCES[uid])

TypeError: 'str' object is not an iterator

有什么我想念的吗?或错误的行,因为我确定一切正确。

2 个答案:

答案 0 :(得分:3)

您要传递字符串作为第一个参数,您要传递training_set变量。

classifier.fit_generator(training_set,
                         steps_per_epoch = 8000,
                         epochs = 25,
                         validation_data = test_set,
                         validation_steps = 2000)

答案 1 :(得分:1)

不熟悉该软件包,但查看文档后会发现training_set应该是生成器:

  

generator:生成器或Sequence的实例   (keras.utils.Sequence)对象,以避免出现重复数据   使用多重处理。发电机的输出必须是   元组(输入,目标)元组(输入,目标,sample_weights)。   该元组(生成器的单个输出)进行单个批处理。   因此,此元组中的所有数组必须具有相同的长度(等于   到此批次的大小)。不同批次可能有不同   大小。例如,最后一个时期通常较小   如果数据集的大小不能被其他人整除   批量大小。预计生成器将遍历其数据   无限期地在steps_per_epoch批处理完成后,纪元结束   被模型看到。

但是您使用的值为'training_set'的字符串,我猜您的意思是training_set(不带引号)。 https://keras.io/models/sequential/