Имеется датасет (фото объектов) из 41 класса и 31 подкласса (не каждый класс содержит подклассы). Подскажите как сделать, что бы модель распознавала изображения не только по классам, но и подклассам?
dataset_dir = pathlib.Path(.....)
batch_size = 32
img_width = 200
img_heigth = 200
dataset_train = tf.keras.utils.image_dataset_from_directory(
dataset_dir,
validation_split = 0.2,
subset= 'training',
seed = 123,
image_size = (img_heigth, img_width),
batch_size = batch_size)
dataset_validation = tf.keras.utils.image_dataset_from_directory(
dataset_dir,
validation_split = 0.2,
subset= 'validation',
seed = 123,
image_size = (img_heigth, img_width),
batch_size = batch_size)
class_names = dataset_train.class_names
print(f'Class names: {class_names}')
model = Sequential([Rescaling(1./255, input_shape=(img_heigth, img_width, 3)),
#аугментация
RandomFlip("horizontal"),
RandomRotation(0.2),
RandomZoom(0.2),
RandomContrast(0.2),
#слои сверточные
tf.keras.layers.Conv2D(64,3, padding='same', activation='relu'),
tf.keras.layers.Conv2D(64,3, padding='same', activation='relu'),
tf.keras.layers.MaxPooling2D(),
tf.keras.layers.Conv2D(128,3, padding='same', activation='relu'),
tf.keras.layers.Conv2D(128,3, padding='same', activation='relu'),
tf.keras.layers.Conv2D(128,3, padding='same', activation='relu'),
tf.keras.layers.MaxPooling2D(),
tf.keras.layers.Conv2D(128,3, padding='same', activation='relu'),
tf.keras.layers.Conv2D(128,3, padding='same', activation='relu'),
tf.keras.layers.Conv2D(128,3, padding='same', activation='relu'),
tf.keras.layers.MaxPooling2D(),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.BatchNormalization(),
tf.keras.layers.Conv2D(256,3, padding='same', activation='relu'),
tf.keras.layers.Conv2D(256,3, padding='same', activation='relu'),
tf.keras.layers.MaxPooling2D(),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.BatchNormalization(),
# полносвязные слои
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.BatchNormalization(),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.BatchNormalization(),
#выходной слой равный числу классов классификации изображений
tf.keras.layers.Dense(num_classes)])
model.compile(optimizer='Adam',
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=['accuracy'])
model.summary()