Постройте и обучите архитектуру 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