Изучение функций
Развитие возможностей или извлечение функций — именно процесс извлечения полезных шаблонов из входных данных поможет модели прогнозирования лучше понять реальную природу проблемы. Хорошая функция обучения будет выявлять шаблоны таким образом, что это значительно повысит точность и производительность применяемых алгоритмов машинного обучения, что было бы невозможно или слишком дорого для самого машинного обучения. Алгоритмы обучения функций находят общие закономерности, важные для различения требуемых классов, и автоматически извлекают их. После этого процесса они готовы к использованию в задачах классификации или регрессии.
Давайте рассмотрим популярную задачу классификации изображений, классификацию изображений лиц и безликих лиц. На заре компьютерного зрения ученые пытались решить эту проблему с помощью алгоритмов ручного кодирования, чтобы обнаружить возможные черты человеческого лица, такие как форма, глаза, нос, губы и т. д. Этот подход обычно давал плохие результаты, потому что лицо может выглядеть как и многие сорта. что невозможно было объяснить даже значительную часть признаков. Простое изменение освещения или ориентации может изменить изображение таким образом, что алгоритмы перестанут распознавать лица.
В 1998 году Ян Лекун представил концепцию сверточных нейронных сетей, которые способны классифицировать изображения рукописных символов с точностью около 99 %. Большим преимуществом сверточных нейронных сетей является то, что они необычайно хорошо обнаруживают особенности в изображениях, которые увеличиваются после каждого уровня, что приводит к высокоуровневым характеристикам. Последние слои (может быть один или несколько) используют все эти сгенерированные функции для классификации или регрессии.
свертка
свертка — это операция, которая выполняется над изображением для извлечения из него элементов, применяя меньший тензор, называемый ядром, подобно скользящему окну над изображением. В зависимости от значений в сверточном ядре мы можем выделить из изображения определенные шаблоны. В следующем примере мы покажем, как определить горизонтальные и вертикальные края изображения с помощью соответствующих ядер.
import
numpy as np
import
matplotlib.pyplot as plt
# пусть img1 будет ничем не примечательным image
img1
=
нп. массив ([np.array ([
200
,
200
]), np.array ([
200
,
200
])])
img2
=
np.array ([np.array ( [
200
,
200
]), np.array([
0
,
0
])])
img3
=
np.array ([np.array ([
200
,
0
]), np.array([
200
,
0
])])
kernel_horizontal
=
np .array([np.array([
2
,
2
]), np.array ([
-
2
,
-
2
])])
print
(kernel_horizontal,
`является ядром для обнаружения горизонтальных ребер `
)
kernel_vertical
=
np.array ([np.array ([
2
,
-
2
]), np.array ([
2
,
-
2
])])
print
(kernel_vertical ,
`является ядром для обнаружения вертикальных границ`
)
# Мы применим ядра к изображениям
# поэлементное умножение с последующим сложением
def
apply_kernel (img, ядро):
return
np.
sum
(np.multiply (img, kernel))
# Отрисовка Img1
plt.imshow (img1)
plt.axis (
`off`
)
plt.title (
` img1`
)
plt.show ()
# Проверка горизонтальных и вертикальных объектов в image1
print
(
`Надежность горизонтального края оценка:`
, apply_kernel (img1,
kernel_horizontal))
print
(
`Показатель достоверности вертикального края:`
, apply_kernel (img1,
kernel_vertical))
# Отрисовка Img2
plt.imshow (img2)
plt.axis (
`off`
)
plt.title (
`img2`
)
plt.show ()
# Проверка горизонтальных и вертикальных объектов в изображении2
print
(
`Показатель достоверности горизонтального края:`
, apply_kernel (img2,
kernel_horizontal ))
print
(
`Показатель достоверности вертикального края:`
, apply_kernel (img2,
kernel_vertical))
# Рендеринг Img3
plt.imshow (img3)
plt.axis (
`off`
)
plt.title (
` img3 `
)
plt.show ()
< br> # Проверка горизонтальных и вертикальных объектов на изображении3
print
(
`Показатель достоверности горизонтального края:`
, apply_kernel (img3,
kernel_horizontal))
print
`Показатель достоверности вертикального края:`
, apply_kernel (img3,
kernel_vertical))
Выход:
[[ 2 2]
[-2 -2]] — это ядро для обнаружения горизонтальных границ
[[2 -2]
[2 -2]] — это ядро для обнаружения вертикальных границ
Показатель достоверности горизонтального края: 0
Показатель достоверности вертикального края: 0
Показатель достоверности горизонтального края: 800
Показатель достоверности вертикального края: 0
Показатель достоверности горизонтального края: 0
Показатель достоверности вертикального края: 800