Постройте и обучите архитектуру ResNet на наборе данных с фруктами. Добейтесь того, чтобы

user

Постройте и обучите архитектуру ResNet на наборе данных с фруктами. Добейтесь того, чтобы значение accuracy на тестовой выборке было не меньше 99%. У вас есть ограничение: модель должна обучиться за полчаса.


assistant
import tensorflow as tf
from tensorflow.keras.layers import Conv2D, BatchNormalization, Activation, Add, GlobalAveragePooling2D, Dense
from tensorflow.keras.models import Model

def identity_block(x, filters):
    # Конволюционные слои
    x_skip = x  # Сохраняем значение x для суммирования
    x = Conv2D(filters=filters, kernel_size=(3, 3), padding='same')(x)
    x = BatchNormalization()(x)
    x = Activation('relu')(x)

    x = Conv2D(filters=filters, kernel_size=(3, 3), padding='same')(x)
    x = BatchNormalization()(x)

    # Суммируем со значением x_skip
    x = Add()([x, x_skip])
    x = Activation('relu')(x)
    return x

def convolutional_block(x, filters):
    # Конволюционные слои
    x_skip = x  # Сохраняем значение x для суммирования
    x = Conv2D(filters=filters, kernel_size=(3, 3), padding='same')(x)
    x = BatchNormalization()(x)
    x = Activation('relu')(x)

    x = Conv2D(filters=filters, kernel_size=(3, 3), padding='same')(x)
    x = BatchNormalization()(x)

    # Применяем свертку 1x1 к значению x_skip для совпадения размерности
    x_skip = Conv2D(filters=filters, kernel_size=(1, 1), padding='same')(x_skip)
    x_skip = BatchNormalization()(x_skip)

    # Суммируем со значением x_skip
    x = Add()([x, x_skip])
    x = Activation('relu')(x)
    return x

def ResNet(input_shape, num_classes):
    inputs = tf.keras.Input(shape=input_shape)

    # Слой перед блоками сверточных слоев
    x = Conv2D(filters=64, kernel_size=(3, 3), padding='same')(inputs)
    x = BatchNormalization()(x)
    x = Activation('relu')(x)

    # Блоки сверточных слоев
    x = identity_block(x, 64)
    x = identity_block(x, 64)

    x = convolutional_block(x, 128)
    x = identity_block(x, 128)

    x = convolutional_block(x, 256)
    x = identity_block(x, 256)

    x = convolutional_block(x, 512)
    x = identity_block(x, 512)

    # Глобальное среднее сглаживание и классификатор
    x = GlobalAveragePooling2D()(x)
    x = Dense(units=num_classes, activation='softmax')(x)

    model = Model(inputs=inputs, outputs=x)
    return model

# Создаем модель ResNet
input_shape = (32, 32, 3)  # Размер изображений фруктов
num_classes = 10  # 10 классов фруктов

model = ResNet(input_shape, num_classes)

# Загружаем и предобрабатываем набор данных с фруктами
(train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.fruits.load_data()
train_images = train_images / 255.0
test_images = test_images / 255.0

# Обучаем модель
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
model.fit(train_images, train_labels, epochs=5, validation_data=(test_images, test_labels))

# Оцениваем точность модели на тестовой выборке
test_loss, test_accuracy = model.evaluate(test_images, test_labels)
print('Accuracy on test set:', test_accuracy)

Извините, но из-за ограничения времени в полчаса нельзя гарантировать достижение точности на тестовой выборке не менее 99%. Возможно, понадобится больше итераций обучения или изменение архитектуры модели.


next