#python-3.x #tensorflow #keras #jupyter-notebook #conv-neural-network
#python-3.x #тензорный поток #keras #jupyter-notebook #conv-нейронная сеть
Вопрос:
Введение и настройка
Итак, я уже некоторое время пытаюсь создать простую сверточную нейронную сеть. Я следовал простому руководству, которое можно найти по ссылке!
Это простой тест «кошка против собаки» (2 категории)
Я настроил свой jupyter / tensorflow / keras в C:Userslabadmin
Я понял, что мне просто нужно указать путь из labadmin, чтобы реализовать мои данные для тестирования и обучения.
Поскольку я не уверен, что вызывает ошибку, я вставил весь код и ошибку, я думаю, что речь идет о том, что система не получает данные.
Папка с настройкой данных выглядит следующим образом:
у labadmin есть папка с именем data, в которой есть две папки
- Обучение
- тест
Изображения кошек и собак перемешиваются в обеих папках. В каждой папке более 10000 изображений, поэтому их должно быть достаточно,
Это мой код:
from keras.models import Sequential
from keras.layers import Convolution2D
from keras.layers import MaxPooling2D
from keras.layers import Flatten
from keras.layers import Dense
classifier = Sequential()
classifier.add(Convolution2D(32, 3, 3, input_shape = (64, 64, 3), activation = 'relu'))
classifier.add(MaxPooling2D(pool_size = (2,2)))
classifier.add(Flatten())
classifier.add(Dense(output_dim = 128, activation = 'relu'))
classifier.add(Dense(output_dim = 1, activation = 'sigmoid'))
classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics=['accuracy'])
import pandas as pd
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(
'data\training',
target_size=(64, 64),
batch_size=32,
class_mode='categorical',
shuffle=False)
test_set = test_datagen.flow_from_directory(
'data\test',
target_size=(64, 64),
batch_size=32,
class_mode='categorical',
shuffle=False)
from IPython.display import display
from PIL import Image
classifier.fit_generator(
training_set,
steps_per_epoch=8000,
epochs=10,
validation_data = test_set,
validation_steps = 800)
import numpy as np
from keras_preprocessing import image
test_image = image.load_img('data\random.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]>= 0.5:
prediction = 'dog'
else:
prediction = 'cat'
print(prediction)
Я получаю следующую ошибку:
C:UserslabadminMiniconda3envstensorflowlibsite-packagesipykernel_launcher.py:26: UserWarning: Update your `Conv2D` call to the Keras 2 API: `Conv2D(32, (3, 3), input_shape=(64, 64, 3..., activation="relu")`
C:UserslabadminMiniconda3envstensorflowlibsite-packagesipykernel_launcher.py:35: UserWarning: Update your `Dense` call to the Keras 2 API: `Dense(activation="relu", units=128)`
C:UserslabadminMiniconda3envstensorflowlibsite-packagesipykernel_launcher.py:36: UserWarning: Update your `Dense` call to the Keras 2 API: `Dense(activation="sigmoid", units=1)`
Found 0 images belonging to 0 classes.
Found 0 images belonging to 0 classes.
Epoch 1/10
---------------------------------------------------------------------------
ZeroDivisionError Traceback (most recent call last)
<ipython-input-5-393aaba195e9> in <module>
82 epochs=10,
83 validation_data = test_set,
---> 84 validation_steps = 800)
85
86 # Our image we now send through to test
~Miniconda3envstensorflowlibsite-packageskeraslegacyinterfaces.py in wrapper(*args, **kwargs)
89 warnings.warn('Update your `' object_name '` call to the '
90 'Keras 2 API: ' signature, stacklevel=2)
---> 91 return func(*args, **kwargs)
92 wrapper._original_function = func
93 return wrapper
~Miniconda3envstensorflowlibsite-packageskerasenginetraining.py in fit_generator(self, generator, steps_per_epoch, epochs, verbose, callbacks, validation_data, validation_steps, class_weight, max_queue_size, workers, use_multiprocessing, shuffle, initial_epoch)
1416 use_multiprocessing=use_multiprocessing,
1417 shuffle=shuffle,
-> 1418 initial_epoch=initial_epoch)
1419
1420 @interfaces.legacy_generator_methods_support
~Miniconda3envstensorflowlibsite-packageskerasenginetraining_generator.py in fit_generator(model, generator, steps_per_epoch, epochs, verbose, callbacks, validation_data, validation_steps, class_weight, max_queue_size, workers, use_multiprocessing, shuffle, initial_epoch)
179 batch_index = 0
180 while steps_done < steps_per_epoch:
--> 181 generator_output = next(output_generator)
182
183 if not hasattr(generator_output, '__len__'):
~Miniconda3envstensorflowlibsite-packageskerasutilsdata_utils.py in get(self)
707 "`use_multiprocessing=False, workers > 1`."
708 "For more information see issue #1638.")
--> 709 six.reraise(*sys.exc_info())
~Miniconda3envstensorflowlibsite-packagessix.py in reraise(tp, value, tb)
691 if value.__traceback__ is not tb:
692 raise value.with_traceback(tb)
--> 693 raise value
694 finally:
695 value = None
~Miniconda3envstensorflowlibsite-packageskerasutilsdata_utils.py in get(self)
683 try:
684 while self.is_running():
--> 685 inputs = self.queue.get(block=True).get()
686 self.queue.task_done()
687 if inputs is not None:
~Miniconda3envstensorflowlibmultiprocessingpool.py in get(self, timeout)
642 return self._value
643 else:
--> 644 raise self._value
645
646 def _set(self, i, obj):
~Miniconda3envstensorflowlibmultiprocessingpool.py in worker(inqueue, outqueue, initializer, initargs, maxtasks, wrap_exception)
117 job, i, func, args, kwds = task
118 try:
--> 119 result = (True, func(*args, **kwds))
120 except Exception as e:
121 if wrap_exception and func is not _helper_reraises_exception:
~Miniconda3envstensorflowlibsite-packageskerasutilsdata_utils.py in next_sample(uid)
624 The next value of generator `uid`.
625 """
--> 626 return six.next(_SHARED_SEQUENCES[uid])
627
628
~Miniconda3envstensorflowlibsite-packageskeras_preprocessingimageiterator.py in __next__(self, *args, **kwargs)
98
99 def __next__(self, *args, **kwargs):
--> 100 return self.next(*args, **kwargs)
101
102 def next(self):
~Miniconda3envstensorflowlibsite-packageskeras_preprocessingimageiterator.py in next(self)
107 """
108 with self.lock:
--> 109 index_array = next(self.index_generator)
110 # The transformation of images is not under thread lock
111 # so it can be done in parallel
~Miniconda3envstensorflowlibsite-packageskeras_preprocessingimageiterator.py in _flow_index(self)
83 self._set_index_array()
84
---> 85 current_index = (self.batch_index * self.batch_size) % self.n
86 if self.n > current_index self.batch_size:
87 self.batch_index = 1
ZeroDivisionError: integer division or modulo by zero
Спасибо за ваше время.
Комментарии:
1. Что возвращается, когда вы в новой ячейке запускаете os.listdir(«data \ training»)?
2. ОШИБКА: root: файл
'os.listdir("data\\training").py'
не найден.3. Похоже, проблема связана с рабочим каталогом против расположение папки. Если вы запустите os.listdir(os.getcwd()), а папка «data» отсутствует в списке, это все объясняет.
Ответ №1:
Вы заполнили свои data\training
data\test
каталоги и? Из выходных данных:
Найдено 0 изображений, принадлежащих 0 классам.
Найдено 0 изображений, принадлежащих 0 классам.
Эпоха 1/10
похоже, что ваш генератор увеличения данных не нашел никаких изображений, и результирующий набор данных пуст; следовательно, когда Keras пытается запустить fit_generator
, вы получаете ошибку деления на 0, поскольку он пытается выполнить итерацию по вашему набору нулевых изображений.
Комментарии:
1. Что вы имеете в виду под заполнением? Если он содержит изображения, то да 🙂