我正在尝试使用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
有什么我想念的吗?或错误的行,因为我确定一切正确。
答案 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/