import keras
import numpy as np
import matplotlib.pyplot as plt
from skimage import transform
from sklearn.metrics import accuracy_score
from keras import backend as K
from collections import namedtuple # named tuples for better readability
Будем работать с датасетом FashionMNIST.
from keras.datasets import fashion_mnist
(X_train, y_train), (X_test, y_test) = fashion_mnist.load_data()
del y_train, y_test
plt.imshow(X_train[9].reshape([28,28]))
<matplotlib.image.AxesImage at 0x7f4766e207f0>
plt.imshow(transform.rotate(X_train[9].reshape([28,28]), 45))
<matplotlib.image.AxesImage at 0x7f47641180f0>
Ваша задача - определить, при каком минимальном угле поворота нейронная сеть фиксированной архитектуры перестает различать обычное и повертнутое изображение. Говоря формально, решаем задачу классификации, исходные изображения принадлежат классу 0
, повернутые - классу 1
. Оцените точность классификации по метрике accuracy
и ее дисперсию в зависимости от угла поворота изображения и отобразите данную зависимость на графике.
Функция rotate_dataset
поворачивает поданный датасет на заданный угол. Функция reset_weights
сбрасывает параметры модели.
Обращаем ваше внимание, что для качественной оценки данных зависимостей эксперименты для каждого размера выборки стоит повторять многократно на различных случайных подвыборках.
Для начала определим необходимые функции по вращению датасета, получению новых пар объект-ответ, сброса параметров модели.
def rotate_dataset(dataset, angle):
return np.array(list(map(lambda x: transform.rotate(x, angle), dataset)))
def get_X_and_y(base_dataset, angle):
rotated_datased = rotate_dataset(base_dataset, angle)
whole_dataset = np.vstack((base_dataset, rotated_datased)).reshape(-1, 784)
shuffled_indices = np.arange(len(whole_dataset))
_labels = np.zeros(2*base_dataset.shape[0], dtype=bool)
_labels[base_dataset.shape[0]:] = True
_labels = _labels[:, None]
whole_labels = np.array(np.hstack((_labels, ~_labels)), dtype=int)
np.random.shuffle(shuffled_indices)
whole_dataset = whole_dataset[shuffled_indices]
whole_labels = whole_labels[shuffled_indices]
return whole_dataset, whole_labels
def reset_weights(model):
session = K.get_session()
for layer in model.layers:
if hasattr(layer, 'kernel_initializer'):
layer.kernel.initializer.run(session=session)
return
с помощью фреймворка Keras и бэк-энда Tensorflow. Поскольку функция reset_weights
показала себя несколько неправильным образом, пришлось сделать такой костыль.
def reinit_model():
model = keras.models.Sequential()
model.add(keras.layers.InputLayer([784]))
model.add(keras.layers.Dense(64))
model.add(keras.layers.Activation('relu'))
model.add(keras.layers.Dropout(0.5))
model.add(keras.layers.Dense(2))
model.add(keras.layers.Activation('softmax'))
model.compile('adam', 'categorical_crossentropy', metrics=['accuracy'])
return model
Для каждого угла angle
делаем n_runs
подвыборок из датасета размером set_size
, на которых обучим модель и протестируем качество на тестах, аккумулируем данные и усредняем качество.
# Для сохранения результатов
import pickle
# Создадим кортежи для сохранения результатов
AngleTuple = namedtuple('AngleTuple', ['angle', 'mean', 'std'])
# Инициализируем гиперпараметры
n_runs = 7
n_epochs = 40
batch_size = 128
angle_step = 15
set_sizes = [500, 2000, 10000]
# Инициализируем хранилище результатов
total_scores = list()
for subset_size in set_sizes:
subset_scores = list()
for angle in range(0, 361, angle_step):
# Получим тестовый датасет для конкретного угла
X_test_whole, y_test_whole = get_X_and_y(X_test, angle)
# Локальные результаты для конкретного угла
angle_scores = list()
for n_run in range(n_runs):
print('Subset size: {:>5} | angle: {:>3} | run {}/{}'.format(
subset_size, angle, n_run + 1, n_runs), end='')
# Получим случайную подвыборку из обучающей для конкретного угла.
# Делаем каждый раз новую случайную выборку, ибо рекомендация в
# задании (для качественной оценки модели)
base_indices = np.random.choice(
np.arange(X_train.shape[0]), size=subset_size, replace=False)
base_dataset = X_train[base_indices]
X, y = get_X_and_y(base_dataset, angle)
# Реинициализируем модель и заново обучим её
model = reinit_model()
model.fit(X, y, batch_size=batch_size, epochs=n_epochs, verbose=0)
# С помощью обученной модели сделаем предсказания на всей тестовой
# выборке для данного угла
y_test_predicted_whole = model.predict_classes(X_test_whole)
run_acc = accuracy_score(y_test_whole[:, 1], y_test_predicted_whole)
angle_scores.append(run_acc)
print(' | acc: {}'.format(run_acc))
# Результаты сохраняем
subset_scores.append([angle, np.mean(angle_scores), np.std(angle_scores)])
# Для надёжности, сохраним результаты для каждого размера
# подвыборки в файлы
with open('subset_{}_scores'.format(subset_size), 'wb') as f:
pickle.dump(subset_scores, f)
total_scores.append([subset_size, subset_scores])
Subset size: 500 | angle: 0 | run 1/7 | acc: 0.98815 Subset size: 500 | angle: 0 | run 2/7 | acc: 0.5 Subset size: 500 | angle: 0 | run 3/7 | acc: 0.5 Subset size: 500 | angle: 0 | run 4/7 | acc: 0.9989 Subset size: 500 | angle: 0 | run 5/7 | acc: 0.99285 Subset size: 500 | angle: 0 | run 6/7 | acc: 0.99925 Subset size: 500 | angle: 0 | run 7/7 | acc: 0.5 Subset size: 500 | angle: 15 | run 1/7 | acc: 0.9779 Subset size: 500 | angle: 15 | run 2/7 | acc: 0.997 Subset size: 500 | angle: 15 | run 3/7 | acc: 0.97215 Subset size: 500 | angle: 15 | run 4/7 | acc: 0.9986 Subset size: 500 | angle: 15 | run 5/7 | acc: 0.74335 Subset size: 500 | angle: 15 | run 6/7 | acc: 0.99855 Subset size: 500 | angle: 15 | run 7/7 | acc: 0.5 Subset size: 500 | angle: 30 | run 1/7 | acc: 0.58615 Subset size: 500 | angle: 30 | run 2/7 | acc: 0.9714 Subset size: 500 | angle: 30 | run 3/7 | acc: 0.94965 Subset size: 500 | angle: 30 | run 4/7 | acc: 0.9643 Subset size: 500 | angle: 30 | run 5/7 | acc: 0.9159 Subset size: 500 | angle: 30 | run 6/7 | acc: 0.999 Subset size: 500 | angle: 30 | run 7/7 | acc: 0.82745 Subset size: 500 | angle: 45 | run 1/7 | acc: 0.9266 Subset size: 500 | angle: 45 | run 2/7 | acc: 0.9812 Subset size: 500 | angle: 45 | run 3/7 | acc: 0.94615 Subset size: 500 | angle: 45 | run 4/7 | acc: 0.5 Subset size: 500 | angle: 45 | run 5/7 | acc: 0.94915 Subset size: 500 | angle: 45 | run 6/7 | acc: 0.7702 Subset size: 500 | angle: 45 | run 7/7 | acc: 0.8098 Subset size: 500 | angle: 60 | run 1/7 | acc: 0.9565 Subset size: 500 | angle: 60 | run 2/7 | acc: 0.97425 Subset size: 500 | angle: 60 | run 3/7 | acc: 0.9561 Subset size: 500 | angle: 60 | run 4/7 | acc: 0.5 Subset size: 500 | angle: 60 | run 5/7 | acc: 0.9662 Subset size: 500 | angle: 60 | run 6/7 | acc: 0.9423 Subset size: 500 | angle: 60 | run 7/7 | acc: 0.9567 Subset size: 500 | angle: 75 | run 1/7 | acc: 0.9475 Subset size: 500 | angle: 75 | run 2/7 | acc: 0.9544 Subset size: 500 | angle: 75 | run 3/7 | acc: 0.94065 Subset size: 500 | angle: 75 | run 4/7 | acc: 0.94365 Subset size: 500 | angle: 75 | run 5/7 | acc: 0.9591 Subset size: 500 | angle: 75 | run 6/7 | acc: 0.9475 Subset size: 500 | angle: 75 | run 7/7 | acc: 0.8191 Subset size: 500 | angle: 90 | run 1/7 | acc: 0.9546 Subset size: 500 | angle: 90 | run 2/7 | acc: 0.9391 Subset size: 500 | angle: 90 | run 3/7 | acc: 0.90275 Subset size: 500 | angle: 90 | run 4/7 | acc: 0.95535 Subset size: 500 | angle: 90 | run 5/7 | acc: 0.94225 Subset size: 500 | angle: 90 | run 6/7 | acc: 0.94285 Subset size: 500 | angle: 90 | run 7/7 | acc: 0.5 Subset size: 500 | angle: 105 | run 1/7 | acc: 0.9343 Subset size: 500 | angle: 105 | run 2/7 | acc: 0.9634 Subset size: 500 | angle: 105 | run 3/7 | acc: 0.9603 Subset size: 500 | angle: 105 | run 4/7 | acc: 0.88435 Subset size: 500 | angle: 105 | run 5/7 | acc: 0.9177 Subset size: 500 | angle: 105 | run 6/7 | acc: 0.9467 Subset size: 500 | angle: 105 | run 7/7 | acc: 0.951 Subset size: 500 | angle: 120 | run 1/7 | acc: 0.5 Subset size: 500 | angle: 120 | run 2/7 | acc: 0.93495 Subset size: 500 | angle: 120 | run 3/7 | acc: 0.5 Subset size: 500 | angle: 120 | run 4/7 | acc: 0.9672 Subset size: 500 | angle: 120 | run 5/7 | acc: 0.97255 Subset size: 500 | angle: 120 | run 6/7 | acc: 0.9736 Subset size: 500 | angle: 120 | run 7/7 | acc: 0.9624 Subset size: 500 | angle: 135 | run 1/7 | acc: 0.86585 Subset size: 500 | angle: 135 | run 2/7 | acc: 0.9701 Subset size: 500 | angle: 135 | run 3/7 | acc: 0.8244 Subset size: 500 | angle: 135 | run 4/7 | acc: 0.97125 Subset size: 500 | angle: 135 | run 5/7 | acc: 0.96295 Subset size: 500 | angle: 135 | run 6/7 | acc: 0.9874 Subset size: 500 | angle: 135 | run 7/7 | acc: 0.9877 Subset size: 500 | angle: 150 | run 1/7 | acc: 0.9793 Subset size: 500 | angle: 150 | run 2/7 | acc: 0.9845 Subset size: 500 | angle: 150 | run 3/7 | acc: 0.5 Subset size: 500 | angle: 150 | run 4/7 | acc: 0.96855 Subset size: 500 | angle: 150 | run 5/7 | acc: 0.70465 Subset size: 500 | angle: 150 | run 6/7 | acc: 0.9847 Subset size: 500 | angle: 150 | run 7/7 | acc: 0.9724 Subset size: 500 | angle: 165 | run 1/7 | acc: 0.98935 Subset size: 500 | angle: 165 | run 2/7 | acc: 0.95005 Subset size: 500 | angle: 165 | run 3/7 | acc: 0.9324 Subset size: 500 | angle: 165 | run 4/7 | acc: 0.9645 Subset size: 500 | angle: 165 | run 5/7 | acc: 0.95665 Subset size: 500 | angle: 165 | run 6/7 | acc: 0.957 Subset size: 500 | angle: 165 | run 7/7 | acc: 0.9777 Subset size: 500 | angle: 180 | run 1/7 | acc: 0.95245 Subset size: 500 | angle: 180 | run 2/7 | acc: 0.98495 Subset size: 500 | angle: 180 | run 3/7 | acc: 0.9003 Subset size: 500 | angle: 180 | run 4/7 | acc: 0.9162 Subset size: 500 | angle: 180 | run 5/7 | acc: 0.9124 Subset size: 500 | angle: 180 | run 6/7 | acc: 0.8998 Subset size: 500 | angle: 180 | run 7/7 | acc: 0.96915 Subset size: 500 | angle: 195 | run 1/7 | acc: 0.9541 Subset size: 500 | angle: 195 | run 2/7 | acc: 0.97645 Subset size: 500 | angle: 195 | run 3/7 | acc: 0.5 Subset size: 500 | angle: 195 | run 4/7 | acc: 0.9659 Subset size: 500 | angle: 195 | run 5/7 | acc: 0.91725 Subset size: 500 | angle: 195 | run 6/7 | acc: 0.95725 Subset size: 500 | angle: 195 | run 7/7 | acc: 0.9748 Subset size: 500 | angle: 210 | run 1/7 | acc: 0.5 Subset size: 500 | angle: 210 | run 2/7 | acc: 0.96485 Subset size: 500 | angle: 210 | run 3/7 | acc: 0.9765 Subset size: 500 | angle: 210 | run 4/7 | acc: 0.98435 Subset size: 500 | angle: 210 | run 5/7 | acc: 0.94235 Subset size: 500 | angle: 210 | run 6/7 | acc: 0.9821 Subset size: 500 | angle: 210 | run 7/7 | acc: 0.9775 Subset size: 500 | angle: 225 | run 1/7 | acc: 0.96135 Subset size: 500 | angle: 225 | run 2/7 | acc: 0.9849 Subset size: 500 | angle: 225 | run 3/7 | acc: 0.9801 Subset size: 500 | angle: 225 | run 4/7 | acc: 0.9917 Subset size: 500 | angle: 225 | run 5/7 | acc: 0.59995 Subset size: 500 | angle: 225 | run 6/7 | acc: 0.5 Subset size: 500 | angle: 225 | run 7/7 | acc: 0.84575 Subset size: 500 | angle: 240 | run 1/7 | acc: 0.5 Subset size: 500 | angle: 240 | run 2/7 | acc: 0.95795 Subset size: 500 | angle: 240 | run 3/7 | acc: 0.5 Subset size: 500 | angle: 240 | run 4/7 | acc: 0.98255 Subset size: 500 | angle: 240 | run 5/7 | acc: 0.97245 Subset size: 500 | angle: 240 | run 6/7 | acc: 0.95005 Subset size: 500 | angle: 240 | run 7/7 | acc: 0.97495 Subset size: 500 | angle: 255 | run 1/7 | acc: 0.9221 Subset size: 500 | angle: 255 | run 2/7 | acc: 0.93055 Subset size: 500 | angle: 255 | run 3/7 | acc: 0.9666 Subset size: 500 | angle: 255 | run 4/7 | acc: 0.8675 Subset size: 500 | angle: 255 | run 5/7 | acc: 0.95 Subset size: 500 | angle: 255 | run 6/7 | acc: 0.9217 Subset size: 500 | angle: 255 | run 7/7 | acc: 0.5 Subset size: 500 | angle: 270 | run 1/7 | acc: 0.96025 Subset size: 500 | angle: 270 | run 2/7 | acc: 0.5 Subset size: 500 | angle: 270 | run 3/7 | acc: 0.95895 Subset size: 500 | angle: 270 | run 4/7 | acc: 0.96435 Subset size: 500 | angle: 270 | run 5/7 | acc: 0.95165 Subset size: 500 | angle: 270 | run 6/7 | acc: 0.5 Subset size: 500 | angle: 270 | run 7/7 | acc: 0.96985 Subset size: 500 | angle: 285 | run 1/7 | acc: 0.96955 Subset size: 500 | angle: 285 | run 2/7 | acc: 0.9647 Subset size: 500 | angle: 285 | run 3/7 | acc: 0.9589 Subset size: 500 | angle: 285 | run 4/7 | acc: 0.94805 Subset size: 500 | angle: 285 | run 5/7 | acc: 0.95415 Subset size: 500 | angle: 285 | run 6/7 | acc: 0.9715 Subset size: 500 | angle: 285 | run 7/7 | acc: 0.5 Subset size: 500 | angle: 300 | run 1/7 | acc: 0.95805 Subset size: 500 | angle: 300 | run 2/7 | acc: 0.96395 Subset size: 500 | angle: 300 | run 3/7 | acc: 0.5 Subset size: 500 | angle: 300 | run 4/7 | acc: 0.98245 Subset size: 500 | angle: 300 | run 5/7 | acc: 0.5 Subset size: 500 | angle: 300 | run 6/7 | acc: 0.98875 Subset size: 500 | angle: 300 | run 7/7 | acc: 0.93635 Subset size: 500 | angle: 315 | run 1/7 | acc: 0.9753 Subset size: 500 | angle: 315 | run 2/7 | acc: 0.9764 Subset size: 500 | angle: 315 | run 3/7 | acc: 0.9405 Subset size: 500 | angle: 315 | run 4/7 | acc: 0.5 Subset size: 500 | angle: 315 | run 5/7 | acc: 0.75545 Subset size: 500 | angle: 315 | run 6/7 | acc: 0.9362 Subset size: 500 | angle: 315 | run 7/7 | acc: 0.5 Subset size: 500 | angle: 330 | run 1/7 | acc: 0.9969 Subset size: 500 | angle: 330 | run 2/7 | acc: 0.99835 Subset size: 500 | angle: 330 | run 3/7 | acc: 0.97655 Subset size: 500 | angle: 330 | run 4/7 | acc: 0.9866 Subset size: 500 | angle: 330 | run 5/7 | acc: 0.9863 Subset size: 500 | angle: 330 | run 6/7 | acc: 0.9911 Subset size: 500 | angle: 330 | run 7/7 | acc: 0.93005 Subset size: 500 | angle: 345 | run 1/7 | acc: 0.99955 Subset size: 500 | angle: 345 | run 2/7 | acc: 0.9975 Subset size: 500 | angle: 345 | run 3/7 | acc: 0.5 Subset size: 500 | angle: 345 | run 4/7 | acc: 0.9961 Subset size: 500 | angle: 345 | run 5/7 | acc: 0.99735 Subset size: 500 | angle: 345 | run 6/7 | acc: 0.99495 Subset size: 500 | angle: 345 | run 7/7 | acc: 0.59685 Subset size: 500 | angle: 360 | run 1/7 | acc: 0.98215 Subset size: 500 | angle: 360 | run 2/7 | acc: 0.9985 Subset size: 500 | angle: 360 | run 3/7 | acc: 0.9971 Subset size: 500 | angle: 360 | run 4/7 | acc: 0.9978 Subset size: 500 | angle: 360 | run 5/7 | acc: 0.9227 Subset size: 500 | angle: 360 | run 6/7 | acc: 0.972 Subset size: 500 | angle: 360 | run 7/7 | acc: 0.99675 Subset size: 2000 | angle: 0 | run 1/7 | acc: 0.99985 Subset size: 2000 | angle: 0 | run 2/7 | acc: 0.9996 Subset size: 2000 | angle: 0 | run 3/7 | acc: 0.99965 Subset size: 2000 | angle: 0 | run 4/7 | acc: 0.9998 Subset size: 2000 | angle: 0 | run 5/7 | acc: 0.9999 Subset size: 2000 | angle: 0 | run 6/7 | acc: 0.9997 Subset size: 2000 | angle: 0 | run 7/7 | acc: 0.99955 Subset size: 2000 | angle: 15 | run 1/7 | acc: 0.5 Subset size: 2000 | angle: 15 | run 2/7 | acc: 0.5 Subset size: 2000 | angle: 15 | run 3/7 | acc: 0.99995 Subset size: 2000 | angle: 15 | run 4/7 | acc: 0.98825 Subset size: 2000 | angle: 15 | run 5/7 | acc: 1.0 Subset size: 2000 | angle: 15 | run 6/7 | acc: 0.9991 Subset size: 2000 | angle: 15 | run 7/7 | acc: 0.99965 Subset size: 2000 | angle: 30 | run 1/7 | acc: 0.9998 Subset size: 2000 | angle: 30 | run 2/7 | acc: 0.9985 Subset size: 2000 | angle: 30 | run 3/7 | acc: 0.5 Subset size: 2000 | angle: 30 | run 4/7 | acc: 0.9996 Subset size: 2000 | angle: 30 | run 5/7 | acc: 0.99885 Subset size: 2000 | angle: 30 | run 6/7 | acc: 0.99875 Subset size: 2000 | angle: 30 | run 7/7 | acc: 0.99775 Subset size: 2000 | angle: 45 | run 1/7 | acc: 0.9974 Subset size: 2000 | angle: 45 | run 2/7 | acc: 0.99805 Subset size: 2000 | angle: 45 | run 3/7 | acc: 0.99865 Subset size: 2000 | angle: 45 | run 4/7 | acc: 0.9978 Subset size: 2000 | angle: 45 | run 5/7 | acc: 0.998 Subset size: 2000 | angle: 45 | run 6/7 | acc: 0.9998 Subset size: 2000 | angle: 45 | run 7/7 | acc: 0.5 Subset size: 2000 | angle: 60 | run 1/7 | acc: 0.99835 Subset size: 2000 | angle: 60 | run 2/7 | acc: 0.99595 Subset size: 2000 | angle: 60 | run 3/7 | acc: 0.5 Subset size: 2000 | angle: 60 | run 4/7 | acc: 0.9963 Subset size: 2000 | angle: 60 | run 5/7 | acc: 0.9969 Subset size: 2000 | angle: 60 | run 6/7 | acc: 0.98685 Subset size: 2000 | angle: 60 | run 7/7 | acc: 0.9989 Subset size: 2000 | angle: 75 | run 1/7 | acc: 0.99625 Subset size: 2000 | angle: 75 | run 2/7 | acc: 0.9962 Subset size: 2000 | angle: 75 | run 3/7 | acc: 0.98825 Subset size: 2000 | angle: 75 | run 4/7 | acc: 0.98795 Subset size: 2000 | angle: 75 | run 5/7 | acc: 0.9833 Subset size: 2000 | angle: 75 | run 6/7 | acc: 0.99415 Subset size: 2000 | angle: 75 | run 7/7 | acc: 0.91145 Subset size: 2000 | angle: 90 | run 1/7 | acc: 0.99855 Subset size: 2000 | angle: 90 | run 2/7 | acc: 0.9218 Subset size: 2000 | angle: 90 | run 3/7 | acc: 0.99385 Subset size: 2000 | angle: 90 | run 4/7 | acc: 0.99105 Subset size: 2000 | angle: 90 | run 5/7 | acc: 0.9841 Subset size: 2000 | angle: 90 | run 6/7 | acc: 0.98755 Subset size: 2000 | angle: 90 | run 7/7 | acc: 0.97835 Subset size: 2000 | angle: 105 | run 1/7 | acc: 0.99365 Subset size: 2000 | angle: 105 | run 2/7 | acc: 0.98935 Subset size: 2000 | angle: 105 | run 3/7 | acc: 0.9695 Subset size: 2000 | angle: 105 | run 4/7 | acc: 0.99445 Subset size: 2000 | angle: 105 | run 5/7 | acc: 0.96985 Subset size: 2000 | angle: 105 | run 6/7 | acc: 0.997 Subset size: 2000 | angle: 105 | run 7/7 | acc: 0.9818 Subset size: 2000 | angle: 120 | run 1/7 | acc: 0.9917 Subset size: 2000 | angle: 120 | run 2/7 | acc: 0.9798 Subset size: 2000 | angle: 120 | run 3/7 | acc: 0.99485 Subset size: 2000 | angle: 120 | run 4/7 | acc: 0.99895 Subset size: 2000 | angle: 120 | run 5/7 | acc: 0.5 Subset size: 2000 | angle: 120 | run 6/7 | acc: 0.99855 Subset size: 2000 | angle: 120 | run 7/7 | acc: 0.99725 Subset size: 2000 | angle: 135 | run 1/7 | acc: 0.9993 Subset size: 2000 | angle: 135 | run 2/7 | acc: 0.99575 Subset size: 2000 | angle: 135 | run 3/7 | acc: 0.9967 Subset size: 2000 | angle: 135 | run 4/7 | acc: 0.99855 Subset size: 2000 | angle: 135 | run 5/7 | acc: 0.9713 Subset size: 2000 | angle: 135 | run 6/7 | acc: 0.9974 Subset size: 2000 | angle: 135 | run 7/7 | acc: 0.5 Subset size: 2000 | angle: 150 | run 1/7 | acc: 0.9954 Subset size: 2000 | angle: 150 | run 2/7 | acc: 0.9983 Subset size: 2000 | angle: 150 | run 3/7 | acc: 0.9962 Subset size: 2000 | angle: 150 | run 4/7 | acc: 0.99735 Subset size: 2000 | angle: 150 | run 5/7 | acc: 0.9895 Subset size: 2000 | angle: 150 | run 6/7 | acc: 0.96895 Subset size: 2000 | angle: 150 | run 7/7 | acc: 0.99815 Subset size: 2000 | angle: 165 | run 1/7 | acc: 0.9976 Subset size: 2000 | angle: 165 | run 2/7 | acc: 0.5 Subset size: 2000 | angle: 165 | run 3/7 | acc: 0.6753 Subset size: 2000 | angle: 165 | run 4/7 | acc: 0.99955 Subset size: 2000 | angle: 165 | run 5/7 | acc: 0.99805 Subset size: 2000 | angle: 165 | run 6/7 | acc: 0.9971 Subset size: 2000 | angle: 165 | run 7/7 | acc: 0.99575 Subset size: 2000 | angle: 180 | run 1/7 | acc: 0.99405 Subset size: 2000 | angle: 180 | run 2/7 | acc: 0.99755 Subset size: 2000 | angle: 180 | run 3/7 | acc: 0.9898 Subset size: 2000 | angle: 180 | run 4/7 | acc: 0.9887 Subset size: 2000 | angle: 180 | run 5/7 | acc: 0.9944 Subset size: 2000 | angle: 180 | run 6/7 | acc: 0.9797 Subset size: 2000 | angle: 180 | run 7/7 | acc: 0.99535 Subset size: 2000 | angle: 195 | run 1/7 | acc: 0.9759 Subset size: 2000 | angle: 195 | run 2/7 | acc: 0.99335 Subset size: 2000 | angle: 195 | run 3/7 | acc: 0.99155 Subset size: 2000 | angle: 195 | run 4/7 | acc: 0.9977 Subset size: 2000 | angle: 195 | run 5/7 | acc: 0.99445 Subset size: 2000 | angle: 195 | run 6/7 | acc: 0.9549 Subset size: 2000 | angle: 195 | run 7/7 | acc: 0.9925 Subset size: 2000 | angle: 210 | run 1/7 | acc: 0.98465 Subset size: 2000 | angle: 210 | run 2/7 | acc: 0.9912 Subset size: 2000 | angle: 210 | run 3/7 | acc: 0.9777 Subset size: 2000 | angle: 210 | run 4/7 | acc: 0.9966 Subset size: 2000 | angle: 210 | run 5/7 | acc: 0.9957 Subset size: 2000 | angle: 210 | run 6/7 | acc: 0.95845 Subset size: 2000 | angle: 210 | run 7/7 | acc: 0.98715 Subset size: 2000 | angle: 225 | run 1/7 | acc: 0.9926 Subset size: 2000 | angle: 225 | run 2/7 | acc: 0.99725 Subset size: 2000 | angle: 225 | run 3/7 | acc: 0.99065 Subset size: 2000 | angle: 225 | run 4/7 | acc: 0.5 Subset size: 2000 | angle: 225 | run 5/7 | acc: 0.99635 Subset size: 2000 | angle: 225 | run 6/7 | acc: 0.9984 Subset size: 2000 | angle: 225 | run 7/7 | acc: 0.99555 Subset size: 2000 | angle: 240 | run 1/7 | acc: 0.5 Subset size: 2000 | angle: 240 | run 2/7 | acc: 0.98615 Subset size: 2000 | angle: 240 | run 3/7 | acc: 0.99495 Subset size: 2000 | angle: 240 | run 4/7 | acc: 0.9989 Subset size: 2000 | angle: 240 | run 5/7 | acc: 0.9971 Subset size: 2000 | angle: 240 | run 6/7 | acc: 0.9885 Subset size: 2000 | angle: 240 | run 7/7 | acc: 0.99915 Subset size: 2000 | angle: 255 | run 1/7 | acc: 0.98855 Subset size: 2000 | angle: 255 | run 2/7 | acc: 0.9668 Subset size: 2000 | angle: 255 | run 3/7 | acc: 0.9972 Subset size: 2000 | angle: 255 | run 4/7 | acc: 0.99105 Subset size: 2000 | angle: 255 | run 5/7 | acc: 0.9846 Subset size: 2000 | angle: 255 | run 6/7 | acc: 0.9947 Subset size: 2000 | angle: 255 | run 7/7 | acc: 0.5 Subset size: 2000 | angle: 270 | run 1/7 | acc: 0.9925 Subset size: 2000 | angle: 270 | run 2/7 | acc: 0.5 Subset size: 2000 | angle: 270 | run 3/7 | acc: 0.9954 Subset size: 2000 | angle: 270 | run 4/7 | acc: 0.9949 Subset size: 2000 | angle: 270 | run 5/7 | acc: 0.99265 Subset size: 2000 | angle: 270 | run 6/7 | acc: 0.99735 Subset size: 2000 | angle: 270 | run 7/7 | acc: 0.9926 Subset size: 2000 | angle: 285 | run 1/7 | acc: 0.9952 Subset size: 2000 | angle: 285 | run 2/7 | acc: 0.9985 Subset size: 2000 | angle: 285 | run 3/7 | acc: 0.99675 Subset size: 2000 | angle: 285 | run 4/7 | acc: 0.5 Subset size: 2000 | angle: 285 | run 5/7 | acc: 0.9994 Subset size: 2000 | angle: 285 | run 6/7 | acc: 0.5 Subset size: 2000 | angle: 285 | run 7/7 | acc: 0.98855 Subset size: 2000 | angle: 300 | run 1/7 | acc: 0.5 Subset size: 2000 | angle: 300 | run 2/7 | acc: 0.98935 Subset size: 2000 | angle: 300 | run 3/7 | acc: 0.9946 Subset size: 2000 | angle: 300 | run 4/7 | acc: 0.99145 Subset size: 2000 | angle: 300 | run 5/7 | acc: 0.9951 Subset size: 2000 | angle: 300 | run 6/7 | acc: 0.5 Subset size: 2000 | angle: 300 | run 7/7 | acc: 0.99795 Subset size: 2000 | angle: 315 | run 1/7 | acc: 0.9461 Subset size: 2000 | angle: 315 | run 2/7 | acc: 0.5 Subset size: 2000 | angle: 315 | run 3/7 | acc: 0.99945 Subset size: 2000 | angle: 315 | run 4/7 | acc: 0.5 Subset size: 2000 | angle: 315 | run 5/7 | acc: 0.99515 Subset size: 2000 | angle: 315 | run 6/7 | acc: 0.6406 Subset size: 2000 | angle: 315 | run 7/7 | acc: 0.5 Subset size: 2000 | angle: 330 | run 1/7 | acc: 0.9983 Subset size: 2000 | angle: 330 | run 2/7 | acc: 0.99615 Subset size: 2000 | angle: 330 | run 3/7 | acc: 0.5 Subset size: 2000 | angle: 330 | run 4/7 | acc: 0.9993 Subset size: 2000 | angle: 330 | run 5/7 | acc: 0.98585 Subset size: 2000 | angle: 330 | run 6/7 | acc: 0.99845 Subset size: 2000 | angle: 330 | run 7/7 | acc: 0.99955 Subset size: 2000 | angle: 345 | run 1/7 | acc: 0.9998 Subset size: 2000 | angle: 345 | run 2/7 | acc: 0.9999 Subset size: 2000 | angle: 345 | run 3/7 | acc: 0.745 Subset size: 2000 | angle: 345 | run 4/7 | acc: 0.99985 Subset size: 2000 | angle: 345 | run 5/7 | acc: 0.9998 Subset size: 2000 | angle: 345 | run 6/7 | acc: 0.99985 Subset size: 2000 | angle: 345 | run 7/7 | acc: 0.5 Subset size: 2000 | angle: 360 | run 1/7 | acc: 0.9997 Subset size: 2000 | angle: 360 | run 2/7 | acc: 0.9999 Subset size: 2000 | angle: 360 | run 3/7 | acc: 0.99975 Subset size: 2000 | angle: 360 | run 4/7 | acc: 0.99975 Subset size: 2000 | angle: 360 | run 5/7 | acc: 0.5 Subset size: 2000 | angle: 360 | run 6/7 | acc: 0.9998 Subset size: 2000 | angle: 360 | run 7/7 | acc: 0.816 Subset size: 10000 | angle: 0 | run 1/7 | acc: 0.99995 Subset size: 10000 | angle: 0 | run 2/7 | acc: 0.99995 Subset size: 10000 | angle: 0 | run 3/7 | acc: 0.99995 Subset size: 10000 | angle: 0 | run 4/7 | acc: 1.0 Subset size: 10000 | angle: 0 | run 5/7 | acc: 1.0 Subset size: 10000 | angle: 0 | run 6/7 | acc: 1.0 Subset size: 10000 | angle: 0 | run 7/7 | acc: 1.0 Subset size: 10000 | angle: 15 | run 1/7 | acc: 1.0 Subset size: 10000 | angle: 15 | run 2/7 | acc: 0.5 Subset size: 10000 | angle: 15 | run 3/7 | acc: 1.0 Subset size: 10000 | angle: 15 | run 4/7 | acc: 0.5 Subset size: 10000 | angle: 15 | run 5/7 | acc: 0.5 Subset size: 10000 | angle: 15 | run 6/7 | acc: 0.99995 Subset size: 10000 | angle: 15 | run 7/7 | acc: 0.99995 Subset size: 10000 | angle: 30 | run 1/7 | acc: 1.0 Subset size: 10000 | angle: 30 | run 2/7 | acc: 0.5 Subset size: 10000 | angle: 30 | run 3/7 | acc: 1.0 Subset size: 10000 | angle: 30 | run 4/7 | acc: 1.0 Subset size: 10000 | angle: 30 | run 5/7 | acc: 0.99995 Subset size: 10000 | angle: 30 | run 6/7 | acc: 1.0 Subset size: 10000 | angle: 30 | run 7/7 | acc: 1.0 Subset size: 10000 | angle: 45 | run 1/7 | acc: 0.9999 Subset size: 10000 | angle: 45 | run 2/7 | acc: 1.0 Subset size: 10000 | angle: 45 | run 3/7 | acc: 1.0 Subset size: 10000 | angle: 45 | run 4/7 | acc: 1.0 Subset size: 10000 | angle: 45 | run 5/7 | acc: 0.99995 Subset size: 10000 | angle: 45 | run 6/7 | acc: 1.0 Subset size: 10000 | angle: 45 | run 7/7 | acc: 1.0 Subset size: 10000 | angle: 60 | run 1/7 | acc: 0.5 Subset size: 10000 | angle: 60 | run 2/7 | acc: 1.0 Subset size: 10000 | angle: 60 | run 3/7 | acc: 0.99995 Subset size: 10000 | angle: 60 | run 4/7 | acc: 1.0 Subset size: 10000 | angle: 60 | run 5/7 | acc: 1.0 Subset size: 10000 | angle: 60 | run 6/7 | acc: 0.9975 Subset size: 10000 | angle: 60 | run 7/7 | acc: 0.99995 Subset size: 10000 | angle: 75 | run 1/7 | acc: 1.0 Subset size: 10000 | angle: 75 | run 2/7 | acc: 0.5 Subset size: 10000 | angle: 75 | run 3/7 | acc: 0.9998 Subset size: 10000 | angle: 75 | run 4/7 | acc: 0.99985 Subset size: 10000 | angle: 75 | run 5/7 | acc: 0.5 Subset size: 10000 | angle: 75 | run 6/7 | acc: 0.9999 Subset size: 10000 | angle: 75 | run 7/7 | acc: 0.99825 Subset size: 10000 | angle: 90 | run 1/7 | acc: 0.5 Subset size: 10000 | angle: 90 | run 2/7 | acc: 0.99995 Subset size: 10000 | angle: 90 | run 3/7 | acc: 0.5 Subset size: 10000 | angle: 90 | run 4/7 | acc: 0.9998 Subset size: 10000 | angle: 90 | run 5/7 | acc: 0.99995 Subset size: 10000 | angle: 90 | run 6/7 | acc: 0.99985 Subset size: 10000 | angle: 90 | run 7/7 | acc: 0.9999 Subset size: 10000 | angle: 105 | run 1/7 | acc: 0.99995 Subset size: 10000 | angle: 105 | run 2/7 | acc: 1.0 Subset size: 10000 | angle: 105 | run 3/7 | acc: 1.0 Subset size: 10000 | angle: 105 | run 4/7 | acc: 0.9999 Subset size: 10000 | angle: 105 | run 5/7 | acc: 0.9999 Subset size: 10000 | angle: 105 | run 6/7 | acc: 0.5 Subset size: 10000 | angle: 105 | run 7/7 | acc: 0.9999 Subset size: 10000 | angle: 120 | run 1/7 | acc: 1.0 Subset size: 10000 | angle: 120 | run 2/7 | acc: 1.0 Subset size: 10000 | angle: 120 | run 3/7 | acc: 0.99995 Subset size: 10000 | angle: 120 | run 4/7 | acc: 0.99995 Subset size: 10000 | angle: 120 | run 5/7 | acc: 1.0 Subset size: 10000 | angle: 120 | run 6/7 | acc: 1.0 Subset size: 10000 | angle: 120 | run 7/7 | acc: 1.0 Subset size: 10000 | angle: 135 | run 1/7 | acc: 0.9999 Subset size: 10000 | angle: 135 | run 2/7 | acc: 0.99985 Subset size: 10000 | angle: 135 | run 3/7 | acc: 0.99995 Subset size: 10000 | angle: 135 | run 4/7 | acc: 0.9995 Subset size: 10000 | angle: 135 | run 5/7 | acc: 0.9999 Subset size: 10000 | angle: 135 | run 6/7 | acc: 1.0 Subset size: 10000 | angle: 135 | run 7/7 | acc: 0.99995 Subset size: 10000 | angle: 150 | run 1/7 | acc: 0.9999 Subset size: 10000 | angle: 150 | run 2/7 | acc: 0.99985 Subset size: 10000 | angle: 150 | run 3/7 | acc: 1.0 Subset size: 10000 | angle: 150 | run 4/7 | acc: 0.99985 Subset size: 10000 | angle: 150 | run 5/7 | acc: 0.5 Subset size: 10000 | angle: 150 | run 6/7 | acc: 0.99995 Subset size: 10000 | angle: 150 | run 7/7 | acc: 0.99985 Subset size: 10000 | angle: 165 | run 1/7 | acc: 0.99995 Subset size: 10000 | angle: 165 | run 2/7 | acc: 0.9999 Subset size: 10000 | angle: 165 | run 3/7 | acc: 0.5 Subset size: 10000 | angle: 165 | run 4/7 | acc: 1.0 Subset size: 10000 | angle: 165 | run 5/7 | acc: 0.9999 Subset size: 10000 | angle: 165 | run 6/7 | acc: 0.9999 Subset size: 10000 | angle: 165 | run 7/7 | acc: 0.99995 Subset size: 10000 | angle: 180 | run 1/7 | acc: 0.99985 Subset size: 10000 | angle: 180 | run 2/7 | acc: 0.9999 Subset size: 10000 | angle: 180 | run 3/7 | acc: 0.99995 Subset size: 10000 | angle: 180 | run 4/7 | acc: 1.0 Subset size: 10000 | angle: 180 | run 5/7 | acc: 0.9999 Subset size: 10000 | angle: 180 | run 6/7 | acc: 0.9999 Subset size: 10000 | angle: 180 | run 7/7 | acc: 0.99995 Subset size: 10000 | angle: 195 | run 1/7 | acc: 0.99995 Subset size: 10000 | angle: 195 | run 2/7 | acc: 0.9999 Subset size: 10000 | angle: 195 | run 3/7 | acc: 0.5 Subset size: 10000 | angle: 195 | run 4/7 | acc: 1.0 Subset size: 10000 | angle: 195 | run 5/7 | acc: 0.9999 Subset size: 10000 | angle: 195 | run 6/7 | acc: 0.99975 Subset size: 10000 | angle: 195 | run 7/7 | acc: 0.9999 Subset size: 10000 | angle: 210 | run 1/7 | acc: 0.9999 Subset size: 10000 | angle: 210 | run 2/7 | acc: 0.99925 Subset size: 10000 | angle: 210 | run 3/7 | acc: 1.0 Subset size: 10000 | angle: 210 | run 4/7 | acc: 0.5 Subset size: 10000 | angle: 210 | run 5/7 | acc: 0.5 Subset size: 10000 | angle: 210 | run 6/7 | acc: 0.5 Subset size: 10000 | angle: 210 | run 7/7 | acc: 0.99995 Subset size: 10000 | angle: 225 | run 1/7 | acc: 0.9999 Subset size: 10000 | angle: 225 | run 2/7 | acc: 1.0 Subset size: 10000 | angle: 225 | run 3/7 | acc: 0.99995 Subset size: 10000 | angle: 225 | run 4/7 | acc: 1.0 Subset size: 10000 | angle: 225 | run 5/7 | acc: 0.99985 Subset size: 10000 | angle: 225 | run 6/7 | acc: 0.5 Subset size: 10000 | angle: 225 | run 7/7 | acc: 0.5 Subset size: 10000 | angle: 240 | run 1/7 | acc: 0.99995 Subset size: 10000 | angle: 240 | run 2/7 | acc: 0.99995 Subset size: 10000 | angle: 240 | run 3/7 | acc: 0.99995 Subset size: 10000 | angle: 240 | run 4/7 | acc: 1.0 Subset size: 10000 | angle: 240 | run 5/7 | acc: 0.5 Subset size: 10000 | angle: 240 | run 6/7 | acc: 0.9998 Subset size: 10000 | angle: 240 | run 7/7 | acc: 0.99985 Subset size: 10000 | angle: 255 | run 1/7 | acc: 0.99985 Subset size: 10000 | angle: 255 | run 2/7 | acc: 0.5 Subset size: 10000 | angle: 255 | run 3/7 | acc: 0.99995 Subset size: 10000 | angle: 255 | run 4/7 | acc: 0.99995 Subset size: 10000 | angle: 255 | run 5/7 | acc: 0.9999 Subset size: 10000 | angle: 255 | run 6/7 | acc: 0.5 Subset size: 10000 | angle: 255 | run 7/7 | acc: 0.99995 Subset size: 10000 | angle: 270 | run 1/7 | acc: 0.9998 Subset size: 10000 | angle: 270 | run 2/7 | acc: 0.99995 Subset size: 10000 | angle: 270 | run 3/7 | acc: 0.5 Subset size: 10000 | angle: 270 | run 4/7 | acc: 0.9999 Subset size: 10000 | angle: 270 | run 5/7 | acc: 0.99985 Subset size: 10000 | angle: 270 | run 6/7 | acc: 0.99995 Subset size: 10000 | angle: 270 | run 7/7 | acc: 0.99995 Subset size: 10000 | angle: 285 | run 1/7 | acc: 0.99995 Subset size: 10000 | angle: 285 | run 2/7 | acc: 0.5 Subset size: 10000 | angle: 285 | run 3/7 | acc: 1.0 Subset size: 10000 | angle: 285 | run 4/7 | acc: 0.9999 Subset size: 10000 | angle: 285 | run 5/7 | acc: 0.9999 Subset size: 10000 | angle: 285 | run 6/7 | acc: 0.99995 Subset size: 10000 | angle: 285 | run 7/7 | acc: 0.99985 Subset size: 10000 | angle: 300 | run 1/7 | acc: 0.99995 Subset size: 10000 | angle: 300 | run 2/7 | acc: 0.99985 Subset size: 10000 | angle: 300 | run 3/7 | acc: 0.5 Subset size: 10000 | angle: 300 | run 4/7 | acc: 1.0 Subset size: 10000 | angle: 300 | run 5/7 | acc: 0.99995 Subset size: 10000 | angle: 300 | run 6/7 | acc: 1.0 Subset size: 10000 | angle: 300 | run 7/7 | acc: 0.99995 Subset size: 10000 | angle: 315 | run 1/7 | acc: 1.0 Subset size: 10000 | angle: 315 | run 2/7 | acc: 1.0 Subset size: 10000 | angle: 315 | run 3/7 | acc: 0.99985 Subset size: 10000 | angle: 315 | run 4/7 | acc: 0.99995 Subset size: 10000 | angle: 315 | run 5/7 | acc: 1.0 Subset size: 10000 | angle: 315 | run 6/7 | acc: 0.99995 Subset size: 10000 | angle: 315 | run 7/7 | acc: 1.0 Subset size: 10000 | angle: 330 | run 1/7 | acc: 1.0 Subset size: 10000 | angle: 330 | run 2/7 | acc: 0.99995 Subset size: 10000 | angle: 330 | run 3/7 | acc: 0.99995 Subset size: 10000 | angle: 330 | run 4/7 | acc: 1.0 Subset size: 10000 | angle: 330 | run 5/7 | acc: 1.0 Subset size: 10000 | angle: 330 | run 6/7 | acc: 1.0 Subset size: 10000 | angle: 330 | run 7/7 | acc: 0.99995 Subset size: 10000 | angle: 345 | run 1/7 | acc: 0.99995 Subset size: 10000 | angle: 345 | run 2/7 | acc: 1.0 Subset size: 10000 | angle: 345 | run 3/7 | acc: 1.0 Subset size: 10000 | angle: 345 | run 4/7 | acc: 1.0 Subset size: 10000 | angle: 345 | run 5/7 | acc: 0.99995 Subset size: 10000 | angle: 345 | run 6/7 | acc: 0.5 Subset size: 10000 | angle: 345 | run 7/7 | acc: 0.99995 Subset size: 10000 | angle: 360 | run 1/7 | acc: 0.99995 Subset size: 10000 | angle: 360 | run 2/7 | acc: 0.5 Subset size: 10000 | angle: 360 | run 3/7 | acc: 1.0 Subset size: 10000 | angle: 360 | run 4/7 | acc: 0.5 Subset size: 10000 | angle: 360 | run 5/7 | acc: 1.0 Subset size: 10000 | angle: 360 | run 6/7 | acc: 1.0 Subset size: 10000 | angle: 360 | run 7/7 | acc: 0.9999
# На случай проблем с соединением с Collaboratory, сохраним результаты на диск
with open('total_scores.pickle', 'wb') as f:
pickle.dump(total_scores, f)
from google.colab import files
files.download('total_scores.pickle')
for subset_size in set_sizes:
files.download('subset_{}_scores'.format(subset_size))
Во время обучения заметил, что на некоторых подвыборках модель показала себя слишком плохо - вероятность правильного предсказания падала до 0.5. Но для большей наглядности, стоит построить графики и увидеть поведение оценочной функции вживую.
# Загружаем результаты из сохраненного файла
# with open('total_scores.pickle', 'rb') as f:
# total_scores = pickle.load(f)
# Настраиваем параметры дизайна графика
plt.rcParams['image.cmap'] = 'viridis'
plt.rcParams['axes.grid'] = False
plt.rcParams['figure.figsize'] = (7, 4)
plt.rcParams['lines.linewidth'] = 1.4
plt.rcParams['lines.markersize'] = 8
plt.rcParams['xtick.labelsize'] = 16
plt.rcParams['ytick.labelsize'] = 16
plt.rcParams['legend.fontsize'] = 16
plt.rcParams['axes.titlesize'] = 22
plt.rcParams['axes.labelsize'] = 16
plt.rcParams['mathtext.fontset'] = 'stix'
plt.rcParams['font.family'] = 'STIXGeneral'
# Строим сам график
fig, ax = plt.subplots(1, 1)
ax.set_title('Зависимость точности от угла поворота')
ax.set_xlabel(r'Угол поворота, $\theta$')
ax.set_ylabel(r'Точность классификации, $\frac{correct}{total}$')
for N, scores in total_scores:
scores = np.array(scores)
ax.scatter(scores[:, 0], scores[:, 1], label=f'N = {N}')
ax.errorbar(scores[:, 0], scores[:, 1], yerr=scores[:, 2],
capsize=5, barsabove=True)
ax.set_xticks(np.arange(0, 361, 30))
ax.set_ylim(0, 1)
ax.grid()
ax.legend()
plt.show()
# Сохранение изображения
plt.savefig('accuracy.png')
<matplotlib.figure.Figure at 0x7f4627200128>
По этому графику может быть понятно, что в целом поворот мало на что влияет. Посмотрим, на каких углах были наибольшие ошибки для всех выборок в среднем.
fig, ax = plt.subplots(1, 1)
ax.set_title('Зависимость точности от угла поворота (все выборки)')
ax.set_xlabel(r'Угол поворота, $\theta$')
ax.set_ylabel(r'Точность классификации, $\frac{correct}{total}$')
just_scores = list()
for N in total_scores:
just_scores.append(N[1][:])
means = np.mean(just_scores, axis=0)
angles = means[:, 0]
accuracies = means[:, 1]
errors = means[:, 2]
ax.scatter(angles, accuracies, label='mean accuracies')
ax.errorbar(angles, accuracies, yerr=errors,
capsize=5, barsabove=True)
ax.set_xticks(np.arange(0, 361, 30))
ax.set_ylim(0, 1)
ax.grid()
ax.legend()
plt.show()
# Сохранение изображения
plt.savefig('mean_accuracy.png')
print(f'Min accuracy: {np.min(accuracies)} on angle {angles[np.argmin(accuracies)]}')
print(f'Max std error: {np.max(errors)} on angle {angles[np.argmax(errors)]}')
Min accuracy: 0.8411857142857143 on angle 315.0 Max std error: 0.21686010744018314 on angle 15.0
<matplotlib.figure.Figure at 0x7f46270f6048>
Видим, что минимальная точность была в среднем достигнута на повороте на угол в 315º. Минимальное среднеквадратичное отклонение было достигнуто при повороте на угол 15º.
Построим график зависимости среднеквадратичной ошибки в зависимости от размера выборки.
fig, ax = plt.subplots(1, 1)
ax.set_title('Зависимость средневкадратичной ошибки от размера выборки')
ax.set_xlabel(r'Размер выборки для обучения и контроля')
ax.set_ylabel(r'Среднеквадратичное отклонение')
Ns = list()
STDs = list()
STDerrs = list()
for N, scores in total_scores:
Ns.append(N)
std_arr = list()
for angle in scores:
std_arr.append(angle[2])
STDs.append(np.mean(std_arr))
STDerrs.append(np.std(std_arr))
ax.scatter(Ns, STDs, label='mean STDs')
ax.errorbar(Ns, STDs, yerr=STDerrs,
capsize=5, barsabove=True)
ax.set_xticks(Ns)
# ax.set_ylim(0, 1)
ax.grid()
ax.legend()
plt.show()
# Сохранение изображения
plt.savefig('std_from_set_size.png')
print(f'Min STD: {np.min(STDs)} on subset_size {set_sizes[np.argmin(STDs)]}')
print(f'Max STD error: {np.max(STDerrs)} on subset_size {set_sizes[np.argmax(STDerrs)]}')
Min STD: 0.13134553290672166 on subset_size 2000 Max STD error: 0.09171753187903268 on subset_size 10000
<matplotlib.figure.Figure at 0x7f4627027780>
Видим, что минимальное среднеквадратичное отклоненение достигнуто на размере выборки 2000. Наибольшая ошибка при определении среднеквадратичного отклонения достигнута на наибольшем размере выборки.
По результатам исследования установлено, что поворот изображения незначительно влияет на ухудшение предсказаний. Для обучения сети рекомендуется использовать средние размеры выборок (2000), поскольку на таких размерах сеть показывает наилучшие результаты с наименьшим среднеквадратичным отклонением. Было также выявлено, что поворот изображения незначительно влияет на качество предсказаний, наихудший результат в среднем достигается при повороте на угол в 315º.
# Скачиваем результаты на компьютер
from google.colab import files
!ls
accuracy.png std_from_set_size.png subset_500_scores mean_accuracy.png subset_10000_scores total_scores.pickle sample_data subset_2000_scores
files.download('total_scores.pickle')
files.download('accuracy.png')
files.download('mean_accuracy.png')
files.download('std_from_set_size.png')