573 KiB
573 KiB
Инициализация Keras¶
In [1]:
import os
os.environ["KERAS_BACKEND"] = "torch"
import keras
print(keras.__version__)
Загрузка набора данных для задачи классификации¶
В данном примере используется фрагмент набора данных Cats and Dogs Classification Dataset
В наборе данных два класса: кошки и собаки
Ссылка: https://www.kaggle.com/datasets/bhavikjikadara/dog-and-cat-classification-dataset
In [2]:
import kagglehub
import os
path = kagglehub.dataset_download("bhavikjikadara/dog-and-cat-classification-dataset")
path = os.path.join(path, "PetImages")
Формирование выборок¶
In [3]:
from keras.src.legacy.preprocessing.image import ImageDataGenerator
batch_size = 64
data_loader = ImageDataGenerator(validation_split=0.2)
train = data_loader.flow_from_directory(
directory=path,
target_size=(224, 224),
color_mode="rgb",
class_mode="binary",
batch_size=batch_size,
shuffle=True,
seed=9,
subset="training",
)
valid = data_loader.flow_from_directory(
directory=path,
target_size=(224, 224),
color_mode="rgb",
class_mode="binary",
batch_size=batch_size,
shuffle=True,
seed=9,
subset="validation",
)
train.class_indices
Out[3]:
Архитектура AlexNet¶
Проектирование архитектуры AlexNet¶
In [4]:
from keras.api.models import Sequential
from keras.api.layers import InputLayer, Conv2D, MaxPooling2D, Dropout, Flatten, Dense, BatchNormalization
alexnet_model = Sequential()
# Входной слой
alexnet_model.add(InputLayer(shape=(224, 224, 3)))
# Первый скрытый слой
alexnet_model.add(Conv2D(96, kernel_size=(11, 11), strides=(4, 4), activation="relu"))
alexnet_model.add(MaxPooling2D(pool_size=(3, 3), strides=(2, 2)))
alexnet_model.add(BatchNormalization())
# Второй скрытый слой
alexnet_model.add(Conv2D(256, kernel_size=(5, 5), activation="relu"))
alexnet_model.add(MaxPooling2D(pool_size=(3, 3), strides=(2, 2)))
alexnet_model.add(BatchNormalization())
# Третий скрытый слой
alexnet_model.add(Conv2D(256, kernel_size=(3, 3), activation="relu"))
# Четвертый скрытый слой
alexnet_model.add(Conv2D(384, kernel_size=(3, 3), activation="relu"))
# Пятый скрытый слой
alexnet_model.add(Conv2D(384, kernel_size=(3, 3), activation="relu"))
alexnet_model.add(MaxPooling2D(pool_size=(3, 3), strides=(2, 2)))
alexnet_model.add(BatchNormalization())
# Шестой скрытый слой
alexnet_model.add(Flatten())
alexnet_model.add(Dense(4096, activation="tanh"))
alexnet_model.add(Dropout(0.5))
# Седьмой скрытый слой
alexnet_model.add(Dense(4096, activation="tanh"))
alexnet_model.add(Dropout(0.5))
# Выходной слой
alexnet_model.add(Dense(1, activation="sigmoid"))
alexnet_model.summary()
Обучение глубокой модели¶
In [5]:
alexnet_model.compile(
loss="binary_crossentropy",
optimizer="adam",
metrics=["accuracy"],
)
alexnet_model.fit(
x=train,
validation_data=valid,
epochs=100
)
Out[5]:
Оценка качества модели¶
In [6]:
alexnet_model.evaluate(valid)
Out[6]:
In [16]:
import mahotas as mh
from matplotlib import pyplot as plt
cat = mh.imread("data/-cat.jpg")
plt.imshow(cat)
plt.show()
dog = mh.imread("data/-dog.jpg")
plt.imshow(dog)
plt.show()
In [17]:
resized_cat = mh.resize.resize_rgb_to(cat, (224, 224))
resized_dog = mh.resize.resize_rgb_to(dog, (224, 224))
resized_dog.shape
Out[17]:
In [19]:
results = [
1
if alexnet_model.predict(item.reshape(1, 224, 224, 3).astype("float32"))
> 0.5
else 0
for item in [resized_cat, resized_dog]
]
for result in results:
display(result, list(valid.class_indices.keys())[list(valid.class_indices.values()).index(result)])