Фото сюжет: Как при помощи фотографии рассказать историю: 8 полезных советов

Содержание

Как при помощи фотографии рассказать историю: 8 полезных советов

10 апреля 2021Фото

Вместе с Canon рассказываем, как найти цепляющий сюжет для фотографии и сделать кадр, который все запомнят.

Поделиться

0

Подготовьтесь

Чутьё на сюжеты приходит с опытом. Если его пока нет, тренируйте насмотренность, изучая работы других фотографов. Это могут быть именитые профессионалы: репортажные фотографы — Юрий Козырев, Алекс Уэбб; портретисты — Стив МакКарри, Энни Лейбовиц, Марио Тестино; уличные фотографы — Эрик Ким, Мацей Дакович. Или менее известные авторы из Instagram*, чьи работы кажутся вам особенно интересными. Копировать чужие снимки не стоит, но можно поискать в них вдохновение и найти идеи для крутых ракурсов или сюжетов.</p>

Если вы собираетесь делать фотографии в известном месте, например на Красной площади в Москве или Марсовом поле в Париже, поищите его фотографии в Сети. Так вы сможете избежать повторений и сделать более нестандартные снимки.

Перед фотоохотой можно занести идеи будущих кадров в блокнот. Описывать их подробно не стоит, просто подумайте, что вы хотите запечатлеть и какие планы для этого нужно использовать.

Обращайте внимание на детали

Изображение: pernsanitfoto / Shutterstock

Чтобы зрителю хотелось рассматривать кадр, нужно добавить в него жизни и загадки. Если вы фотографируете на улице, осмотритесь и найдите в толпе интересных людей. Они могут выделяться оригинальным внешним видом или находиться в необычной ситуации, например спать на скамейке.

Если речь идёт о портретном фото, приглядитесь к герою и найдите деталь в облике, которая поможет рассказать его историю. Это могут быть внешние особенности, например выразительные глаза (вспомните фотографиюThe Afghan Girl: Steve McCurry’s Enduring Portrait of Sharbat Gula «Афганской девочки», сделанную фотожурналистом Стивом МакКарри для National Geographic), или предметы, которые ему дороги или необходимы (удочка или снасти, если речь о заядлом рыбаке). На деталях можно устроить основной акцент или же сделать их частью большого сюжета.

Правильно подобранные детали помогут рассказать историю, даже если вы снимаете натюрморт. Соберите в кадре элементы, которые создадут общий сюжет и не будут конфликтовать друг с другом. Например, положите рядом портфель, открытки из городов мира, фотокамеру и авиабилет — и вот перед вами визуальная история о путешественнике без человека в кадре.

Делать крутые кадры с историей легко с камерой Canon EOS M200. Благодаря широкой линейке сменных объективов вы сможете удивить всех качественной макросъёмкой или захватывающей дух широкоформатной фотографией. Функции автофокусировки и ручной фокусировки помогут выделить важные детали.

Специально для начинающих фотографов в Canon EOS M200 есть функция «Творческий помощник»: она подскажет, какие настройки выбрать для конкретного кадра. Снимок можно обработать прямо в камере с помощью готовых пресетов. В настройках камеры есть сюжетные программы (портрет, пейзаж или крупный план) и творческие фильтры («Рыбий глаз», «Акварель», чёрно-белый кадр). Чтобы отправить готовое фото на смартфон или ноутбук, не нужны провода: камеру к другим устройствам можно подключить через Bluetooth или Wi-Fi.

Хочу рассказать историю

Контролируйте весь кадр, а не только центральный объект

Детали могут сыграть и против вас, если они находятся не к месту. Шанс вырезать нелепый, выбивающийся из композиции элемент с помощью кадрирования или фоторедактора будет не всегда.</p>

Внимательно посмотрите, что попадает в объектив. Заметите ненужное — двигайте камеру в сторону, вперёд и назад, или сместитесь сами. Ещё можно попробовать уменьшить масштаб фотографии или по возможности убрать препятствие из кадра вручную.

Делайте серию фотографий

1 / 0

Изображение: kasakphoto / Shutterstock

2 / 0

Изображение: kasakphoto / Shutterstock

3 / 0

Изображение: kasakphoto / Shutterstock

Снимите хотя бы 5–10 кадров на одном месте, используя разные планы, ракурсы, жанры и настройки камеры. Например, сделайте несколько фото улицы целиком, затем пару снимков конкретного человека, потом заметные детали — допустим, переполненный бумагами портфель или наспех застёгнутый пиджак.

Из получившегося набора фотографий можно выбрать самую говорящую или использовать их все вместе, сделав коллаж или галерею.

Фиксируйте эмоции

Изображение: De Visu / Shutterstock

Хороший кадр должен заставлять зрителя сопереживать герою снимка, независимо от того, что на нём изображено: человек, животное или предмет. Кадр должен вызвать эмоцию: позитивную или негативную. Для этого нужно эту самую эмоцию зафиксировать.

Иногда поймать её легко (к примеру, на репортажных фотографиях с места событий), иногда сложно (при портретной съёмке). Во втором случае нужно наладить контакт с героем и помочь ему расслабиться. Проведите немного времени вместе и поболтайте о чём-нибудь. Когда заметите, что человек перестал стесняться и чувствует себя комфортно, приступайте к съёмкам.

Чтобы снять эмоциональный пейзаж, понаблюдайте за местом съёмки. Подумайте, какие чувства оно у вас вызывает, и постарайтесь поймать их в объектив. Здесь снова помогут детали: сломанное дерево, цветок, животное или насекомое.

Следите за композицией и светом

Изображение: Punnawit Suwattananun / Shutterstock

Красиво падающая тень и правильное размещение акцентов в кадре помогут сделать хороший кадр. А ещё при их помощи также можно внести в снимок сюжет. Если вы хотите привлечь внимание к конкретной детали фотографии:

  • Используйте правило третей. Мысленно поделите снимок двумя вертикальными и двумя горизонтальными линиями — получатся четыре точки пересечения. Разместите центральный элемент снимка в одной из них.
  • Найдите рамки или указатели. Например, мост, арка, кроны деревьев, аллея, дверной проём. С их помощью можно выделить нужный объект на фото и, наоборот, скрыть что-то, создав загадку.
  • Создайте глубину. Разместите детали на переднем, среднем и заднем плане. Тогда картинка будет восприниматься более объёмно.

На глубину может повлиять и свет: для этого разместите его источник позади объекта съёмки. Вот ещё несколько способов, как использовать свет и тень для сторителлинга:

  • Поставьте источник света сбоку. Это поможет сделать главного героя кадра неплоским, добавит ему теней и подчеркнёт детали.
  • Используйте шторы, тюль или другие преграды для света. Однотонные шторы смягчат резкий солнечный свет. Если на них есть прорези или текстура (например, кружевной тюль) — добавят тени форму.
  • Сделайте свет цветным. Возьмите яркие воздушные шары, зонтик или другой полупрозрачный предмет и разместите его так, чтобы он закрывал солнце или другой источник света.

Не бойтесь экспериментировать

Изображение: Laurent CHEVALLIER / Shutterstock

Иногда для создания кадра с историей привычных ракурсов будет недостаточно. Найти выигрышный угол съёмки помогут нестандартные позы: попробуйте лечь или сесть на землю, забраться повыше на лестницу. Пример удачного необычного ракурса — фотографияBritain’s Queen Elizabeth II arrives to attend a national service of thanksgiving for the Queen’s 90th birthday at St Paul’s Cathedral in London Елизаветы II, сделанная Тоби Мелвиллом в 2019 году. Фотограф снял королеву сверху, в то время как она шла по собору Святого Павла в Лондоне. Пол здания похож на шахматную доску: получилось, что королева делает ход как одноимённая фигура в настольной игре.

И не стесняйтесь пользоваться камерой в окружении людей. Получить живую фотографию с историей на улице проще, чем в других условиях: посмотрите, как эффектно смотрятся работы стрит-фотографов, например Зуна ЛиInstagram* @zunleephoto или Лукаса ВашакаInstagram* @lwaszak.

Экспериментировать с Canon EOS M200 проще простого. У камеры есть оптический стабилизатор изображения, который позволяет делать чёткие кадры даже в движении. Благодаря откидному сенсорному экрану можно делать селфи или быстро снимать интересные сюжеты, которые происходят позади вас. Кроме того, камера Canon EOS M200 справится с работой в непростых погодных условиях: она выдерживает температуру до 40 градусов тепла и влажность до 85%.

Узнать больше

Продумайте постобработку

Изображение: OlegRi / Shutterstock

На создание истории и передачу эмоций влияет не только композиция кадра, но и его оформление. Попробуйте поиграть со снимком в фоторедакторе: меняйте контраст, теплоту, экспозицию, баланс белого. И добавьте цветовые фильтры — преобладающие оттенки помогут скорректировать общее настроение снимка. К примеру:

  • красный добавляет экспрессии — силы, страсти, злости;
  • оранжевый помогает передать уверенность;
  • жёлтый придаёт кадру энергии и ощущения счастья;
  • зелёный передаёт ощущение спокойствия и умиротворения;
  • тёмно-синий передаёт грусть или даже страх.

Ещё один способ изменить настроение снимка — сделать его чёрно-белым. Такой приём поможет привлечь большее внимание к деталям, эмоциям героев и сюжету.

*Деятельность Meta Platforms Inc. и принадлежащих ей социальных сетей Facebook и Instagram запрещена на территории РФ.

Ищем сюжет для документальной фотографии

Что такое документальная фотография? Когда-то, лет 30-40 назад, под этим термином подразумевалась фотокарточка 6х7 см. для паспорта или 3х4 см. на пропуск для того, чтобы проходить на фабрику или на завод. Некоторые и сейчас так считают. Но это неправильно. Документальная фотография —  это фотография, ставшая документом. То есть такой снимок, который показывает зрителю один из моментов какого-либо важного события, рассказывает какую-нибудь историю. Эта история или это событие могут быть и трагическими, и трогательными, и смешными… Главная задача фотографа-документалиста – выхватить из происходящего перед его объективом самое важное, самое значимое. И показать это зрителю. Причем так показать, чтобы у зрителя появились те или иные эмоции. Чтобы зритель улыбнулся, чтобы стал переживать… А возможно, ему даже станет страшно от того, что он увидит на снимке. Короче, документальная фотография —  это отражение реальной жизни. Всего того, что происходит вокруг нас. Те снимки, которые публикуются на страницах газет, на новостных сайтах в интернете, те фотографии, которые оседают в архивах.

Основная задача документальной фотографии – не только проинформировать человека о каком-то событии, но и заставить задуматься о своей собственной жизни, о жизни других людей, живущих рядом, а, возможно, даже и сделать что-то, чтобы изменить окружающий нас мир, сделать его чище, лучше, уютнее.

Попробовать свои собственные силы в фотодокументалистике может каждый, даже начинающий фотолюбитель. Даже тот, кто только вчера взял в руки фотоаппарат. Что вам мешает попробовать посредством фотографии рассказать всем-всем-всем о том, что происходит около вас: в вашей стране, в вашем городе, на вашей улице, в конце концов? Покажите другим людям то, что не видят, не замечают они.

А может быть, просто не хотят замечать. Например, откройте им глаза на какую-нибудь волнующую вас проблему…

В нашей сегодняшней статье мы постараемся дать ответы на несколько вопросов, касающихся документальной фотографии.

Что снимать? Где искать сюжеты?

Глубоко ошибается тот, кто считает, что для того чтобы сделать запоминающуюся документальную фотографию, фотографу  обязательно нужно  находиться на каком-то значимом мероприятии, быть в гуще событий. Ну, хотя бы на многотысячном митинге, на месте крупного пожара, на важном совещании у министра… Конечно, и в этом случае сделать хороший документальный снимок можно (кстати, далеко не каждый фотограф, оказавшийся в самом центре значимого события, сможет передать в своих снимках весь их драматизм, весь накал страстей). Но гораздо сложнее, а поэтому и интереснее искать сюжеты для документальной фотографии  где-то в другом месте. Просто на городских улицах, например. Или за городом, в заброшенной деревне.

В конце концов, просто по пути с работы. Фотографу нужно учиться быть наблюдательным, видеть немного больше, чем видят другие. Один известный фотограф-газетчик по этому поводу любит говорить шутя: «Я ношу очки, и значит, вижу хуже, чем другие. Но зато я вижу больше чем другие.

Должна ли документальная фотография быть художественной?

Конечно же, должна! И документальная фотография, точно так же как и видовая (пейзаж, например), как портрет и как натюрморт должна быть произведением искусства. Ну, по крайней мере, к этому нужно хотя бы стремиться. Почему зритель обращает внимание на документальный снимок? Только ли потому, что фотограф запечатлел на нем какой-то интересный момент? Конечно, момент важен. Но важен не только момент. То есть, не только  то, что показано на фотографии, но и то, как это показано. Цвет, свет, композиция —  про всё это нельзя забывать и в фотодокументалистике. Всё это помогает фотографу донести до зрителя самое важное: эмоциональную составляющую происходящего, еще острее обратить внимание зрителя на те или иные детали и моменты.

Хоть раз вы обращали внимание на то, что достаточно часто документальные фотографии бывают не цветными, а черно-белыми?  Как вы думаете, почему? Ответ тут очень прост. Потому, что отсутствие цвета акцентирует внимание зрителя на том самом важном, что хотел донести до него автор снимка. Цвет отвлекает. А черно-белое изображение концентрирует внимание, еще сильнее подчеркивает драматизм события, показанного на снимке.

Иногда для концентрирования внимания зрителя на самом важном, некоторые фотографы в процессе постобработки снимка на компьютере в графических редакторах,  применяют эффект виньетирования. Этот прием придает изображению некоторую остроту.

Большое значение в документальной фотографии, точно так же как и в других видах этого искусства, имеет точка съемки и ракурс. Если точка съемки фотографом выбрана правильно, то снимок может стать намного более эффектным и эмоциональным,  чем нежели он был бы сделан с обычной точки, с уровня глаз снимающего. Не стесняйтесь, снимайте сверху, снизу, под неожиданным и непривычным углом. Всё это усилит эмоциональность вашего снимка.

Как вести себя при съемке фоторепортажа?

Вести себя нужно очень и очень осторожно. Причин этому несколько. Первая – это то, что далеко не каждому человеку, имеющему шанс попасть в поле зрения вашего фотоаппарата, хочется быть сфотографированным. А во время волнительных событий реакция любого человека может быть неадекватной. С этим следует считаться. Тем более, что в этом случае и закон на его стороне. Особенно осторожным в этом плане нужно быть при съемке трагедий, стихийных бедствие, других подобных происшествий. Не переступайте в своей работе этические, моральные  границы того. Умейте иногда сказать себе «нет» или «Стоп. Вот это показывать уже нельзя». Вторая причина для того, чтобы быть осторожным – это опасность пострадать самому. Упасть, провалиться куда-то и так далее. При неосторожном поведении при съемке фоторепортажа можно, например, угодить под автомобиль, на вас может упасть что-то с высоты… Третья причина – не мешайте работать коллегам и другим специалистам.

Умение не лезть в кадр другим фотографам и видеооператорам – это очень важное умение для фотогрфафа-репортажника. Тому, кто занимается такой съемкой, нужно учиться «видеть спиной», работать в команде. Согласитесь, если в самый ответственный момент происходящего, когда вы уже нашли точку съемки и готовы нажать на спусковую кнопку затвора, в вашем видоискателе появляется могучая спина коллеги,  вы будете, по меньшей мере, немного раздражены его поведением. Вот поэтому – не раздражайте других, не лезьте сами им в кадр. Короче, учитесь правильно веси себя на съемочной площадке. Это, по меньшей мере, обезопасит вас. Не мешайте работать и другим специалистам, выполняющим свою работу. Ну, например, охранникам или спасателям. Не вставайте у них на пути, не путайтесь под их ногами. Порой малейшая задержка в действиях этих людей может стоить кому-то не только здоровья, но и жизни. А это, согласитесь, куда важнее эффектного кадра.

А надежным помощником вам в такого рода съемке станет хороший длиннофокусный объектив, который позволит вам снимать с достаточно удаленного расстояния и при этом никому не мешать.

Ну, и разрешение матрицы вашей фотокамеры тоже, естественно, должно быть хорошим, чтобы при возможной выкадровке не очень сильно страдало качество снимка.

Как правильно настроить фотоаппарат для документальной съемки?

Главная задача для фотографа-репортажника, для фотографа-документалиста  — это зафиксировать самый важный момент происходящего события, тот момент, который уже не повторится больше никогда. И где и в какую минуту это произойдет —  не знает никто. Вот поэтому фотохроникеру нужно уметь находится в постоянной «боевой готовности». То есть иметь великолепную реакцию на происходящее, умение в любую секунду нажать на спусковую кнопку фотокамеры. Но, увы, в таком случае очень часто у вас просто может не оказаться достаточно времени для того, чтобы  правильно  настроить фотоаппарат. Вот поэтому дадим вам такую рекомендацию: снимайте в режиме приоритета выдержки. При этом выдержка должна быть достаточно короткой, около 1/250 секунды.

Это нужно для того, чтобы кадр не получился смазанным. Ведь события, происходящие перед вашими глазами, обычно развиваются очень стремительно, люди и другие объекты находятся в постоянном движении. Будь это хоть  пожарный, спасающий человека, хоть оратор, стоящий на трибуне митинга и при этом активно жестикулирующий. В режиме приоритета выдержки диафрагму и все остальные параметры автоматика подберет самостоятельно, без вашего вмешательства. А это поможет сэкономить вам значительное количество времени.  

Metz — каждый сюжет со счастливым финалом.

В современный камкордерах, цифровых зеркальных камерах и системных камерах всё чаще и чаще встречается режим видеосъёмки качества Full-HD. Это даёт видеографам-любителям множество новых возможностей использования их оборудования. Однако, это также подразумевает повышение требований, выставляемых к освещению. Выбирая рациональные продукты из линейки светодиодных осветительных приборов Metz mecalight, теперь вы сможете получить идеальное освещение любого сюжета.

Будь-то видеоролик, снятый во время отпуска, или запланированные видео постановки – с осветительными приборами Metz для видеосъёмки, счастливый финал уже прописывается в сценарии.

“Беспроводной” режим.

Осветительные светодиодные приборы для видеосъёмки Metz mecalight LED-960 DL и 960 BC video оснащены встроенной беспроводной функцией. Она обеспечивает возможность настройки и регулировки яркости и/ или цветовой температуры * без проводов – от одного осветительного прибора к другому.

Можно настроить вплоть до 15 независимых каналов, благодаря чему вы получаете невероятный простор для создания креативного освещения. Если изменить параметры одного конкретного осветительного прибора, он автоматически становится передатчиком и отправляет сигнал изменения настроек на остальные осветительные приборы, которые автоматически становятся приёмниками. На практике это означает гибкость и практичность использования осветительных приборов.

Гибкое расширение.

Если вам требуется более высокая выходная мощность света, осветительный прибор для видео съёмки Metz mecalight даёт возможность гибкого расширения — а именно: приборы из одной и той же линейки можно модульно подключать друг к другу и устанавливать на крепежные рельсы, предлагаемые в качестве дополнительного, не входящего в базовый комплект аксессуара.

Гибкость установки.

Кронштейн mecalight Flex Arm FH-100 особенно хорошо подходит для использования при видео съёмке, когда требуется творческий подход к управлению освещением. FH-100 можно сгибать, что позволяет добиться оптимального положения осветительных светодиодных приборов mecalight. Он также идеально подойдёт для макросъёмки, т.к. с его помощью можно превосходно осветить объект съёмки под различными углами.

Для каждого сюжета света более чем достаточно.

Даже при слабом окружающем освещении осветительные светодиодные приборы Metz mecalight обеспечат идеальную подсветку для объекта вашей съёмки. Это также относится и к съемке, когда объект освещён сзади, съёмке внутри помещений или вечером.


 С использованием mecalight                                  Без использования mecalight

*Регулировка цветовой температуры возможна только на светодиодных осветительных приборах mecalight LED-960 BC.


                           mecalight LED-960 BC                            mecalight LED-960 DL

144 мощных светодиода с высоким индексом цветопередачи для идеального освещения в любой ситуации.

Высокая интенсивность — умная регулировка.
 
Высокие технологии для оптимального освещения.

Освещайте вашу съемочную площадку, как профессионалы: новые осветительные приборы mecalight для видео съёмки оснащены 144 светодиодами с плавно регулируемой яркостью и с высоким индексом цветопередачи, гарантируя лучшее освещение любого объекта съемки. Осветительный прибор mecalight LED-960 DL обеспечивает освещение мощностью до 960 лк. При необходимости осветительные приборы LED-960 могут устанавливаться модульно, повышая, таким образом, эффект освещённости в соответствии с вашими требованиями.

Осветительный прибор mecalight LED-960 BC, ( двухцветный), обеспечивает освещение мощностью до 840лк , а также даёт возможность плавной регулировки цветовой температуры для достижения наилучших результатов в зависимости от дневного или искусственного света.

Еще одно технологическое преимущество приборов серии 960 — это встроенная функция беспроводной работы, благодаря которой настройка и регулировка яркости и цветовой температуры всех осветительных приборов проходят быстро и легко.  

На mecalight LED-960 BC можно плавно регулировать яркость и цветовую температуру.

*Регулировка цветовой температуры возможна только на светодиодных осветительных приборах mecalight LED-960 BC.

Характеристики
mecalight LED-960 mecalight LED-960 DL 
Светодиодные осветительные приборы  144 светодиода с высоким индексом цветопередачи  144 светодиода с высоким индексом цветопередачи 
Индекс цветопередачи  > 90  > 90 
Угол падения луча  65°  65° 
Подключение к электросети  да  да 
Освещённость  840 лк  960 лк 
Питание  6 батареек / аккумуляторов размера AA / или аккумуляторы Sony NPF 6 батареек / аккумуляторов размера AA / или аккумуляторы Sony NPF   6 батареек / аккумуляторов размера AA / или аккумуляторы Sony NPF 6 батареек / аккумуляторов размера AA / или аккумуляторы Sony NPF
Рабочее напряжение  4,8 — 9,0 В  4,8 — 9,0 В 
Цветовая температура  3200 — 5600 K  5600 K 
Рассеивающий фильтр  да  да 
Фильтр искусственного света 3200K  да  да 
Гнездо для штатива  А ¼”  А ¼” 
Габариты  140 x 96 x 55 мм  140 x 96 x 55 мм 
Вес  320 г  310 г 
Плавная регулировка  0 — 100 %  0 — 100 % 
Возможность вертикального и горизонтального поворота  да  да 

 
Встроенная функция беспроводной работы предусматривает около 15 каналов.


 
Достаточно мощности для всей съёмки: осветительные приборы питаются от батареек/ аккумуляторов размера AA, аккумуляторов Sony NPF или от электросети, как вы пожелаете.

Светодиодные осветительные приборы предназначены для освещения во время фото- или видеосъёмки. Они не подходят для использовании яв качестве бытовых осветительных приборов.

Сюжет, как основа фотографии

Тема: Сюжет, как основа фотографии


«Сюжет есть во всем. В каждом сюжете есть ритм. В чувстве такого ритма и заключается смысл. Фотография – это фиксация такого смысла, который существует сам по себе»

Андре Кертеш

Раскрытие темы предполагает 3 занятия.

Цель: развить навык видеть, формулировать сюжет, и передавать его при создании собственных работ.

Задачи:


  • сформировать у учащихся представление об особенностях искусства фотографии,

  • познакомить с выразительными средствами фотографии,

  • развить навык анализа содержания фотографического произведения,

  • развивать творческое мышление и эстетические чувства у учащихся,

  • воспитывать любознательное отношение к миру фотоискусства,

  • способствовать применению полученных навыков и знаний при создании собственных фоторабот.

Участники: учащиеся 5 классов

Для изучения темы используется многоканальный метод.


  • Репродукции картин и фотографий

  • Фильм «Золушка» (отрывок)

  • Письменные и Интернет источники

  • Фотографии учащихся

Урок 1


Учитель:

— Ребята, сегодня мы поговорим о таком важном явлении в фотографии, как сюжет. Что же это такое?

Фотография это индивидуальное искусство. Фотограф через фотографии передаёт своё понимание мира природы, вещей, человека. Каждый из вас, если возьмёт фотоаппарат, по-своему увидит окружающий мир, отобразит мгновение. 

Например, вы увидели после дождя яркую, сочную радугу. Сколько эмоций, ощущений вы испытываете при этом! Вам хочется поделиться ими,. и у вас рождается идея запечатлеть ее в фотографии, так, чтобы передать через нее ваши эмоции. А если вы добавите в кадр немного недосказанности, то зритель, которому вы ее потом покажете, наверняка начнет фантазировать и додумывать вашу историю. Это и есть сюжет — ваши мысли и ощущения, которые вы смогли передать при помощи фотографии, и история, которую увидел ваш зритель.

Наличие сюжета является самым важным в фотографии и влияет на «интересность» фотографии.

Для грамотного построения кадра не обязательно быть виртуозом, достаточно спросить себя:


  • О чем будет эта фотография?

  • Кто или что играет главную роль в сюжете?

  • Какое тут должно быть настроение?

  • Что увидит, подумает, почувствует зритель?

Давайте обратимся к работам художников и фотографов, узнаем о чем говорит автор и постараемся рассмотреть сюжет произведения.

Учитель предлагает учащимся для рассмотрения репродукции картин и фотографий.

Учащиеся изучают раздаточный материал, высказываются о том, что они видят, чувствуют, как выстроен сюжет (идея) художника, и что хотел передать автор.

I.

Поиск сюжета. От картины до фотографии.
Фотография многое вобрала в себя из многовекового опыта развития изобразительного искусства. В качестве иллюстрации этого учитель предлагает рассмотреть:

  • Репродукции картин художников

  • Репродукции фотографий Карла Буллы и Андре Кертеша

Мстислав Добужинский. Николай  Ге. Портрет Л.Н. Толстого 1884 г


Фото К. Буллы. 1900-е



Картина Конки. М. В.  Добужинский. 1909 г

.

Конка у здания Фондовой биржи на стрелке

Васильевского острова. Фотография К. Буллы. 1906 г.

Фёдор Шаляпин поёт с листа на репетиции Улица. К. Булла

в зале народного дома. Фото К. Буллы. 1913 г.

Фотографии Андре Кертеша

Урок 2

II. Кинематограф

  1. Вступление учителя

Учитель:

-Также как книга для писателя, музыка для музыканта или картина для художника, кино для режиссёра – это способ выражения собственных мыслей, чувств и желаний. Подчеркнем для себя – «мыслей и чувств».

Кино выросло из фотографии.

В 1895 Люмьер изобрёл киноаппарат для съёмки и проекции «движущихся фотографий», пригодный для коммерческого использования. Первые кинофильмы состояли из одного плана, редко превышавшего одну минуту по продолжительности. Это действительно были «движущиеся фотографии».

Технологические истоки указывают на две принципиальные составляющие кинематографа: фотография (фиксация световых лучей) и движение (динамика визуальных образов). Фотографический принцип связывает кино с изобразительной традицией, идущей от живописи, то есть связывает кино с идеей искусства.

Учитель:

— Не будем останавливаться на истории кинематографа, это не наша цель. Важно другое. Кино и фотографии требуют обязательного соучастия зрителя в их восприятии. Фотография — это видение мира глазами фотографа. Точно так же происходит и в кино, которое отражает взгляд и позицию режиссера.

— Для фотографа, как и для режиссера важное значение имеет сюжет. Давайте посмотрим отрывки из фильма «Золушка». Фильм возможно не так динамичен, как современное кино, но мы можем увидеть насколько хорошо в его сценах передается настроение героев, их чувства и переживания.

  1. Просмотр отрывков из кинофильма «Золушка».

Учитель показывает учащимся отрывки из фильма.
  1. Обсуждение просмотренных сюжетов.

Предложенные учителем сцены из фильма обсуждаются с учениками с точки зрения того, как передан сюжет.

III. Самостоятельная работа. Источники.


К следующему занятию учащиеся знакомятся с источниками, предложенными учителем:

  • Санкт-Петербург. 1903 год в фотографиях Карла Буллы. Каталог. Под ред. А. Китаева. 2003г.

  • http://www.si-foto.com/klassiki-fotografii-andre-kertesh/

  • http://nik191-1.ucoz.ru/blog/dorevoljucionnaja_rossija_na_fotografijakh_fotograf_karl_bulla_sankt_peterburg/2013-02-09-174

  • http://ria. ru/Tsarist_Russia/20130903/960267443.html#ixzz3112eDKj9

Также учащиеся приносят свои фотографии с видами города, близких людей, памятных событий.

Урок 4. Итоговое занятие.

  1. Коллективный просмотр и обсуждение фотографий учащихся.

При обсуждении не должна выноситься оценка работ. Это не является целью обсуждения. Учащиеся должны быть предупреждены об этом.

Учащиеся анализируют работы друг друга, рассматривают как и насколько удачно раскрыт сюжет на их фотографиях.

Во время анализа работ, учащиеся отвечают на вопросы:


  • О чем эта фотография?

  • Кто или что играет главную роль в сюжете?

  • Какое тут настроение?

  • Что, по их мнению, хотел сказать автор?

  • Что увидел, почувствовал зритель?

В коллективном просмотре важно акцентировать внимание на том, что увидели другие, в сравнении с тем, что хотел сказать автор.
  1. Анализ фотографий Карла Буллы и Андре Кертеша.

Анализируя фотографии метров, учащиеся учатся у мастеров технике передачи сюжета. Анализируют, пересказывают свое видение того, что хотел сказать автор. Какие методы, какие способы передачи своих идей, чувств, настроений использовал фотограф.
  1. Заключение.

Учитель подводит итоги работы на занятиях по данной теме.

Занятия по данной теме позволили учащимся узнать, что такое сюжет и его важность в изобразительном искусстве, фотографии и в кино. Учащиеся получили навык анализа сюжета фотографий. В результате работы узнали методы и способы раскрытия сюжета, которые использовали знаменитые фотографы. В дальнейшем это поможет учащимся в совершенствовании мастерства в области фотографии.

Источники:


  • Никитин В. А. Рассказы о фотографах и фотографиях. Л.: Лениздат, 1991. 220 с.

  • http://www. si-foto.com/klassiki-fotografii-andre-kertesh/

  • http://nik191-1.ucoz.ru/blog/dorevoljucionnaja_rossija_na_fotografijakh_fotograf_karl_bulla_sankt_peterburg/2013-02-09-174

  • http://ria.ru/Tsarist_Russia/20130903/960267443.html#ixzz3112eDKj9

  • http://www.fotokomok.ru/karl-bulla-fotograf-imperatorskogo-dvora/

  • http://www.hellopiter.ru/Charles_bulla.html

  • Китаев Алексей Империя Карла Буллы: История глазами фотографа http://www.elitarium.ru/2003/12/19/imperija_karla_bully_istorija_glazami_fotografa.html

  • http://fotopiloto.ru/yroki_fotografii/prostymi-slovami-pro-syuzhet-kompozitsiyu-lineinauyu-i-vozdushnuyu-perspektivu

  • http://www.referat.ru/referat/izobretenie-fotografii-i-kinematografa-19322
План: Введение Культурные традиции бурятского народа как основа здорового…
При этом достижения современной официальной медицины не привели к полному вытеснению традиционной медицинской культуры и, соответственно,. ..
Межрегиональный конкурс творческих проектов учащихся, студентов и…
Пешком, в суровые январские морозы прабабушка прошла 160 км. Мимолетная встреча на вокзале и снова разлука. Как подросли девочки…
Положение об открытом фестивале фотографии
Первый открытый фестиваль фотографии в Сергиевом Посаде (далее – Фотофестиваль) проводится в рамках празднования 12 июня государственного…
Методические рекомендации для педагогов
Воспитание любви к родному краю как основа патриотического воспитания дошкольников
Обновление сайта Leites net (май 2015)
Трансформаторы и электрические реакторы, Генеалогия, Разное, Фотографии, Новости, Контактная информация и очередностью 9-ти кнопок…
«Старинные танцы как жанровая основа инструментального цикла»
Клавирные сюиты и партиты: соотношение традиционного и новаторского в их трактовке. 5
Классный час в 6а классе «Книга памяти Михневской средней школы» (75летию школы посвящается)
Она является одной из особо значимой экспозиции школьного музея. Здесь данные о выпускниках школы (фотографии, письма выпускников,…
Система учебников Алгоритмы успеха
Программа: «Системно-деятельностный подход при обучении химии как основа реализации стандартов нового поколения»
Проектная деятельность как основа работы с одаренными детьми
Гбоу средняя школа 368 с углубленным изучением английского языка Фрунзенского района Петербурга
Методика применения игровых технологий на уроках русского языка как…
Трактовка термина «технология» (в психолого – педагогической литературе)

13 фото, сюжет которых заставляет задуматься апрель 2019 | ngs42.ru

Все новости

17 погибших, 11 из них — дети: всё, что известно о нападении на школу в Ижевске

Как долго продлится частичная мобилизация? Главные новости СВО за 26 сентября

В Адыгее повестку вручили ветерану МВД на инвалидной коляске, но затем извинились

Всё, что известно о трагедии в школе в Ижевске к этому часу: видеорепортаж

Можно ли военнообязанным покидать Россию? А выезжать в другой город или регион? Разбор с экспертами

По всей России люди выстраиваются в очереди к нотариусам, чтобы оформить доверенность на близких

На границе с Казахстаном останавливают подлежащих мобилизации и вручают повестки

В закрывающейся Финляндии нашествие россиян. Некоторые идут лесами

Кто будет платить алименты, если отца призвали по мобилизации? Отвечает юрист

В России объявили мобилизацию. Как узнать, попадаю ли я под призыв?

Меня мобилизовали ошибочно. Куда обращаться?

Стрельба в военкомате. Что известно про 25-летнего задержанного и в каком состоянии военком — видео

Детки из будущего: 20 красивых детских имен, которые будут популярны в 2023 году

От комиссариата до учебки: власти Кузбасса будут сопровождать мобилизованных из региона

Теплый октябрь, холодный февраль: синоптики дали прогноз погоды в Кузбассе на ближайшие полгода

В Кремле прокомментировали возможное закрытие границ

Кто резервист, а кто запасник? Объясняем различия

До -7 и с мокрым снегом: в Кузбасс пришло похолодание

Закулисье ЛДК: показываем, как готовят площадку к международному форуму в Кемерове

Дневник сибиряка, который уволился, оставил квартиру и пересек границу с Казахстаном — 15 часов из его жизни

Совладелец «Зимней вишни» останется в СИЗО еще на несколько месяцев

В ижевской школе во время стрельбы погибли дети

Все призывники по мобилизации досрочно отправятся на пенсию

К школе несут цветы, лампадки и мягкие игрушки. Всё о стрельбе в Ижевске

Будут ли призывать ограниченно годных на военные сборы и что делать категории В? Отвечают эксперты

Неизвестный устроил стрельбу в ижевской школе

«Евраз полыхает огнем»: что на самом деле случилось на металлургическом комбинате в Новокузнецке

Мобилизованным пообещали льготы на налоги и коммуналку

В Иркутской области молодой человек выстрелил в военкома

Зараженных всё меньше: публикуем последние данные по COVID-19 в Кузбассе

Двое погибли, четверо пострадали: в ГИБДД рассказали подробности жуткой аварии на трассе в Кузбассе

Минспорт сообщил, какие сотрудники нужны в «Кузбасс-Арену». Публикуем список должностей с зарплатами

Авто Без «Тойот», но с новым «Чери»: что происходит на российском авторынке

В Кузбассе из-за ДТП перекрывали участок федеральной трассы. Узнали подробности

Уходя, гасите свет: умеете ли вы экономить на коммуналке

«Страшно за своего ребенка»: отцы из Кемерова и Курска придумали устройство от выпадения детей из окон. Их история

Отсрочка для студентов и очереди к нотариусам. Главные новости СВО за 25 сентября

Какие документы и доверенности стоит оформить, если вы мобилизованы. Инструкция юриста

Там просто бесконечный поток: на границе Волгоградской области и Казахстана образовались гигантские очереди

Все новости

Поделиться

Глядя на эти фотографии, можно придумать целый сюжет для фэнтезийного фильма или книги, причем у каждого зрителя будет своя версия развития событий, только дайте волю воображению. Среди культа «фото для Instagram» подобные снимки притягивают взгляд и доставляют эстетическое удовольствие отсутствием одинаковых кадров девушек в одних и тех же позировках. Корреспондент НГС.АФИША собрала несколько интересных фотографий с сюжетом и поговорила с авторами работ — они снимают целые саги и полносюжетные истории. Ради идеального кадра им приходится долго трудиться, и порой реализовать задуманную идею кажется невозможным, но они стараются — посмотрите, что из этого выходит.  

Идея снять историю любви о рыбаке и спасенной им девушке, которая тонула в море, увлекла Юлию Шипилову. Это серия была задумана в рамках воркшопа, съемку решено было провести на улице. 

«Несмотря на мрачность истории, всё прошло довольно весело и позитивно. Единственное, что смущало, — было очень холодно. Осень, съемка у воды, ветрено. Тяжелее всего пришлось модели, она «тонула» несколько раз», — рассказывает Юлия. Фотографией девушка занимается уже три года. 

Поделиться

Серия снимков называется «Левиафан». 

Поделиться

По сюжету рыбак спас из моря девушку, они влюбились друг в друга.

Поделиться

Какое-то время жили счастливо, у них родились дети, а потом море вновь отняло у рыбака любимую.

Поделиться

С приближением выхода финального сезона сериала «Игра престолов» только ленивый не снимает девушек в образе Дейнерис Таргариен. Но сделать это максимально похоже и не вульгарно получается далеко не у всех.

Поделиться

«Многими любимая «Игра престолов» вдохновила нас на эту съёмку. Модель на роль Дейнерис нашли быстро — девочка с белыми волосами. Дальше дело за нами — взяли в прокат платье, продумали макияж и причёску. Для съемок выбрали заснеженное место на берегу Оби. Было холодно, но модель оказалась стойкая и морозоустойчивая», — рассказывает Елена Захарченко про свою недавнюю фотосессию. 

Поделиться

Для антуража команда хотела взять в аренду лошадь, но в последний момент все передумали и решили, что драконы будут смотреться эффектнее. Правда, пришлось изрядно потрудиться в фотошопе. 

Поделиться

У Елены есть команда, они реализуют самые разные проекты и тематические съемки. 

«Этот проект называется «7 грехов». В течение месяца мы искали подходящих под каждый образ моделей, тщательно продумывали все детали и то, как интереснее преподнести каждую грешницу. Нужно было раскрыть те детали, которые бы подчеркивали образ. Для гордыни нашли корону, для обжорства — эклеры, для зависти — арендовали змею, для гнева — красные линзы и огненные волосы, алчность — деньги, похоть — роза с шипами, лень — спутанные волосы».  

Александр работает под псевдонимом Шиша Бродский. Фотограф снимает саги, и для каждой фотосессии у него есть сценарий. 

Поделиться

«В 2009 году мне в руки попал зеркальный фотоаппарат, дали на время, просто попробовать, что получится. Я сделал несколько кадров и понял, что это моё. Первые сценарии делал с друзьями, потом понемногу стали появляться новые знакомые, которые хотели принять участие в моих фотопроектах».

Поделиться

Сейчас в команде у Александра около 30 человек, они лазят по болотам, заброшенным местам, лесам, снимают самые разные сцены.

Поделиться

В прошлом году НГС уже писал о необычной съемке Бродского — с рогатыми демонами и вырванным сердцем.

Екатерину Плотникову тоже больше привлекают продуманные истории. Чаще всего девушка берет идеи для съемок из фольклора или придумывает сама. 

Поделиться

Эта съёмка называется «Похищенная драконом». И изначально Екатерине казалось, что воплотить эту идею в жизнь невозможно.  

«Я несколько дней бродила по строительным магазинам, высматривая подходящие материалы для хвоста. Снимали на Алтае, нужна была горная местность. На сборку хвоста у нас ушло около трех часов — собирали прям около трассы, где остановились. Самое сложное было затащить тушку дракона на гору», — делится Екатерина.

Поделиться

Эта съёмка у Екатерины проходила в Хакасии. 

«На просторах интернета я наткнулась на интересное местечко с названием «Тортуга», где стоит настоящий пиратский корабль. Проехать мимо него мы не могли, поэтому вопрос со съёмкой был сразу решен, оставалось лишь сшить подходящее платье для модели и добраться до локации». 

Поделиться

А здесь модель прилегла в самое настоящее болото — чего не сделаешь ради красивого кадра. 

«Я давно мечтала о съемке в болоте, но найти модель, которая согласилась бы на подобную съёмку? К счастью, такие сумасшедшие есть. Болото нашли недалеко от Новосибирска. Холодное утро, рассвет, болото плохо пахло, вокруг плавали бутылки и фантики из-под кальмаров. Мы расчистили небольшой кусочек пространства, в которой предстояло окунуться модели. Это были стремительные и быстрые кадры». 

Алёна Золотухина 
Фото Юлии Шипиловой (1–4), Елены Захарченко (5–7), Шиши Бродского (8–10), Екатерины Плотниковой (11–13)

Алёна Золотухина

Журналист НГС

Апрель-2019ИсторияСибирякиСъемкаСюжетФотоФотография

  • ЛАЙК0
  • СМЕХ0
  • УДИВЛЕНИЕ0
  • ГНЕВ0
  • ПЕЧАЛЬ0

Увидели опечатку? Выделите фрагмент и нажмите Ctrl+Enter

КОММЕНТАРИИ0

Добавить комментарий

Новости СМИ2

Новости СМИ2

Сюжет в стрит фотографии — должен ли он быть в уличной фотографии

Продолжаем наш разговор об уличной фотографии. Сегодня хотелось бы поговорить о сюжете в стрит фотографии. Вы скажите, что это странная тема для разговора – ну какой может быть сюжет у уличного фото. Кстати, то что в уличной фотографии отсутствует сюжет, очень распространенное мнение.

Обычно сторонники того, что уличная фотография может не иметь сюжета, говорят, что уличная фотография — это просто фиксация не событий, а обычной жизни города вообще. А какой сюжет может быть в обычной жизни? Люди просто идут или стоят.

На остановкеНа остановке

Смысл в таких рассуждениях есть. Если вы вышли из дома и, идя по улице, делаете снимки раз в 10 минут (можно и чаще), то сюжет в этой серии снимков будет очевиден только для вас – маршрут моей прогулки. И если вы опубликуете один из таких снимков без названия, без описания и пояснений, то стороннему зрителю может показаться, что сюжет в этой фотографии отсутствует. Особенно если на ней нет ничего такого, чтобы притягивало взгляд.  Но, тем не менее, даже у такой фотографии сюжет имеется. Во всяком случае, для ее автора.

У этой фотографии может быть несколько сюжетных линий: Лето; Девушки Саратова, Проспект Кирова в Саратове летом

Ситуация, описанная мной, встречается сплошь и рядом. Загляните на фото сайты и вы увидите сотни фотографий, которые выкладываются ежеминутно, снятых непонятно где и непонятно о чем.   Эта безликая масса изображений не вызывает никаких эмоций – просто какие-то картинки.  Люди просто фотографируют все подряд – что вижу, то и снимаю.  Иногда получаются отличные кадры, но большинство снимков не интересны даже их автору.

Это плохо – спросите вы. Нет, это нормально, особенно для начинающего уличного фотографа. Иногда уличного фотографа можно сравнить с золотоискателем, старателем времен Золотой лихорадки. Сотни тонн породы промыто, а на выходе всего пара грамм драгоценного металла. Ну да, как-то так получается, если не предпринять никаких мер по повышению эффективности съемки. А давайте подумаем вот над чем – для чего мы снимаем и вообще занимаемся уличной фотографией? Ради чего – для признания, лайков или просто мы таким образом снимаем стресс?

Что я там наснимал?

Цель уличной фотографии

В чем цель уличной фотографии и есть ли в ней смысл? Уличный фотограф – для чего он снимает, зачем часами бродит по улицам? У вас есть ответы? А у меня, есть что ответить. Еще несколько лет назад я для себя ответил на эти вопросы.

Главная цель уличной фотографии, на мой взгляд – это летопись жизни в фотографиях. Ну да, звучит довольно пафосно, но это именно так. Уличный фотограф годами снимает улицы и людей. За 10 – 50 лет (кому как повезет) накапливается целый архив. И если разглядывать эти снимки, то можно увидеть, как менялся город и люди, в нем живущие. Это очень увлекательно. Вы помните историю Вивьен Майер и обнаруженных совершенно случайно ее фотографий? Они потрясли Америку. Это была хроника американской жизни почти за 50 лет. Просто потрясающая летопись американской жизни. Найдите время и посмотрите эти снимки — vivianmaier.com. Женщина годами фотографировала и бережно сохраняла снимки. О ней никто не знал, пока, к сожалению, уже после ее смерти, негативы и отпечатки не были куплены на распродаже.

Совет: Начиная заниматься уличной фотографией, позаботьтесь о том, чтобы каталогизировать свои снимки. Из собственного опыта – до сих пор жалею, что удалил снимки за несколько лет, когда поменял компьютер. Осталось что-то в аккаунтах социальных сетей, но многое пропало – жаль. Поэтому, советую сохранять снимки. Возможно, не все, но фиксируйте дату и храните хотя бы часть из каждой серии. Стоит озаботиться покупкой дополнительных жестких дисков или сохраняйте на виртуальных дисках в Google, Yandex или на других сервисах.

Мы определилась с основной целью фотографией. Теперь перейдем к целям поменьше и к сюжету.

Сюжет или тема в стрит фотографии

Выходя на прогулку с фотоаппаратом, стоит подумать о том, что я сегодня буду снимать. Улицы, людей, голубей, котиков? Да, это мы обычно и снимаем. Но можно и немного уточнить. Например, сегодня я буду снимать туристов, а завтра сниму ребят на роликах и скейтах, а может сконцентрирую свое внимание на пенсионерах или молодых родителях. Мы выбираем сюжет съемки.

Туристы в МосквеТуристы в Москве

Почему это лучше, чем простая съёмка всего подряд? Я сейчас выскажу собственное мнение по этому поводу, а вы уж сами судите –так это или нет.

На мой взгляд, если мы выбираем более узкое направление съемки, то становимся внимательней и замечаем то, что при простой прогулке пропустили бы и не заметили. Больше уделяем внимание деталям. От этого выигрывают и наши снимки.

По сути, выбирая тему для снимков, мы уже не просто ходим по улицам с камерой, а делаем репортаж. Надо сказать, что репортажная съемка пересекается с уличной фотографией в 90% случаев.

Праздник еды в саду Эрмитаж или просто Перкус в парке

Что такое репортаж? Это серия снимков с какого-то события или серия снимков о чем-то – о городе, об улице, о людях. Ведь репортаж – это необязательно известные личности или светский раут.

Репортаж – это серия снимков.  Если мы возьмем и опубликуем только одну фотографию из репортажа, то такой снимок будет именно уличным, если репортаж сделан на улицах города.

Еще раз, выбирая сюжет фотографий для съемки, мы делаем репортаж и если выкладывать серию фотографий, то именно так эти снимки и будут восприниматься. Если же выкладывать фотографии по одной, то это будет обычная уличная фотография.

9 мая — Ветеран или фотография из репортажа с акции Бессмертный Полк

На самом деле, довольно часто отличия уличной съемки от репортажной заключаются в том, кто делал серию – профессионал или любитель и где снимки были опубликованы.

Хотелось бы обратить ваше внимание еще на одном моменте – название снимка. Мы прогулялись, сделали во время прогулки серию снимков и сбросили все снятое на компьютер. Пока они хранятся у нас и не опубликованы – это просто снимки. Но в тот момент, когда мы их решили опубликовать, возникает проблема – давать им название или нет. Если мы выкладываем снимки на всеобщее обозрение без названий, то можно сказать, что сюжет этих фотографий не очевиден. Как только мы даем название, то у наших фотографий автоматически сюжет появляется. Мы его придумываем или уточняем. Задумайтесь над этим. Может стоит продумать названия заранее. Кто-то скажет, а как же свобода творчества. Ну да, ну да. Тогда задам вам вопрос – как художник рисует свои картины? Фотография – это и есть картина, только сделанная не кистью и красками, а сложной техникой.

фото сюжетов

фото сюжетов

Руководство по установлению точек и фотографированию


для мониторинга проектов управления водосборными бассейнами
Совет по улучшению водораздела губернатора
158 12-я улица NE
Салем, Орегон

Октябрь 1993 г.


Фото Участки
КАКОЕ ОБОРУДОВАНИЕ МНЕ ПОТРЕБУЕТСЯ?
ОК! СДЕЛАЕМ ФОТОГРАФИИ
КРУПНЫМ ПЛАНОМ
ОБЩИЙ ВИД ФОТОГРАФИИ
КАК Я МОГУ НАЙТИ ТАКОЙ ЖЕ ФОТОСЮЖЕТ В СЛЕДУЮЩЕМ ГОДУ?
КАК ДЕЛАТЬ ПОСЛЕДУЮЩИЕ ФОТОГРАФИИ?
ЧТО ЕСЛИ МНЕ НУЖНА ПОМОЩЬ?
Таблица 1. Мониторинг общих практик для обеспечения эффективности
Рис. 1. Постоянная фотография крупным планом Местоположение
Рис. 2. Идентификационная этикетка с фотографией
Рис. 3. Общий вид фотоэпюр

Фото Участки

Простой способ мониторинга проектов управления водоразделом

Мониторинг является эффективным способом выяснить, соответствует ли проект управления водоразделом поставленным целям и задачам. Мониторинг может показать, насколько хорошо или плохо работает система управления. Это может помочь определить необходимые изменения в управлении и может показать другим, как улучшить водоразделы и прибрежные районы.

Многие виды систем мониторинга используются для документирования результатов проектов по улучшению водосборных бассейнов. Некоторые системы, такие как проведение измерений и запись научных данных, могут быть требовательными и довольно сложными. На разработку и анализ данных может уйти много лет.

Другие системы довольно просты. Фотосъемка является одним из основных методов мониторинга. Хотя фотографии не могут рассказать всю историю проекта, много информации можно собрать из фотографий, сделанных в одном и том же месте в течение нескольких лет.

Фотографии часто показывают изменения, которые не замечают измерения. Они служат напоминанием о том, как далеко вы продвинулись в создании здорово функционирующей территории с природными ресурсами. Фотографии — это простой способ рассказать другим о преимуществах надлежащей практики управления земельными ресурсами.

Эта брошюра может помочь вам установить контрольные точки или фотопланы, с которых можно делать снимки для отслеживания изменений, происходящих в результате проекта управления ресурсами.

КАКОЕ ОБОРУДОВАНИЕ МНЕ ПОТРЕБУЕТСЯ?

Вам понадобится всего несколько расходных материалов для фотомониторинга вашего проекта.

Вам понадобится фотоаппарат, конечно, желательно 35 мм, и пленка. Подойдет как печатный, так и слайдовый формат, хотя большинство менеджеров по природным ресурсам предпочитают слайды. Хотя на самом деле это не является жизненной необходимостью, вы также можете захотеть иметь штатив для камеры, чтобы получать устойчивые и четкие снимки.

Для фотографий крупным планом вам понадобятся четыре куска углового железа или арматуры длиной около 16 дюймов (или любой высоты, которую вы можете легко увидеть), а также молоток или отбойный молоток в зависимости от состояния грунта. для фотографий общего вида вам понадобятся две стойки высотой от 3 до 4 футов. Яркая аэрозольная краска для кольев поможет вам найти их позже.

Также необходимы деревянная или стальная измерительная рулетка, фотоидентификационные этикетки, карта соответствующего масштаба, например, квадратный лист Геологической службы США, и черный фломастер.

ОК! СДЕЛАЕМ ФОТОГРАФИИ

В таблице 1 показано, какие фотографии следует делать для мониторинга определенных методов управления. В зависимости от типа вашего проекта есть два типа фотографий, которые вы, возможно, захотите сделать: крупный план и общий вид.

ФОТОГРАФИИ КРУПНЫМ ПЛАНОМ

На фотографиях крупным планом показаны конкретные характеристики территории, такие как поверхность почвы или площадь поверхности земли, покрытая растительностью и органическим мусором. Периодически делаются снимки крупным планом с постоянно расположенных фототочек.

Обычно площадь 3 фута x 3 фута используется для фотосъемки крупным планом. Чтобы отметить углы квадрата, вбейте в землю уголки из железа или арматуры во всех четырех углах (рис. 1). Покрасьте колышки ярким цветом, например, желтым или оранжевым, чтобы вам было легче перемещать их во время последующей фотосъемки. Возможно, вам придется перекрашивать их время от времени, если они выцветают.

Если у вас есть камера со сменными объективами, вы должны планировать использовать тот же объектив на вашей камере во время последующей фотосъемки, что и при установке исходной точки съемки и при съемке первых снимков.

Вы и ваша камера должны стоять на северной стороне участка. Стоя с северной стороны, можно делать фотографии в любое время дня, не отбрасывая тень на участок.

Перед фотографированием положите заполненную идентификационную этикетку с фотографией (см. рис. 2) на землю рядом с фотоплощадкой.

Поместите стальную или деревянную измерительную ленту поперек южной стороны участка. Лента должна быть открыта на 36 дюймов, при этом лента должна читаться слева направо.

Лента придаст фотографии некоторый относительный масштаб. Встаньте примерно в шести-восьми футах от центра участка. Убедитесь, что вы видите метку в видоискателе камеры.

Сделав снимок, отметьте на карте расположение фотоучастка вместе со стрелкой, указывающей направление, в котором вы сделали снимок.

Если вы отправляете фотографии наблюдения кому-то еще, например, в качестве приложения к отчету, обязательно сохраните копию фотографий и карту для себя. Копии помогут вам найти то же самое место и выровнять ориентиры для последующих фотографий. Они также помогут вам увидеть изменения, которые произошли с тех пор, как были сделаны последние снимки.

ФОТОГРАФИИ ОБЩЕГО ВИДА

Фотографии общего вида можно разделить на две категории: особенности и пейзажи.

Художественные фотографии документируют изменения на крупных объектах или вокруг них, таких как каменные дамбы, берега ручьев или профили ручьев. Снимки могут быть сделаны с видами поперек, вверх по течению и / или вниз по течению (показывая, например, изменения в профиле реки), или поперек или вверх и вниз по линии забора, чтобы показать контраст между различными действиями по управлению земельными ресурсами.

Художественные фотографии обычно делаются с противоположных концов воображаемой линии. Например, вы можете настроить фотографик для наблюдения за изменениями на противоположных сторонах ручья. Для этого по обеим сторонам ручья вбейте в землю кол или столб. Две точки должны находиться на расстоянии 30 или 40 футов друг от друга. Поместите идентификационную этикетку с фотографией в вертикальное положение так, чтобы она находилась на переднем плане фотографии. Удерживая камеру над одним стержнем, отцентрируйте другой стержень посередине фотографии. Для следующей фотографии повторите процедуру в обратном порядке. Не забудьте включить метку фотографии и, если возможно, немного неба на фотографии, чтобы помочь установить масштаб фотографируемых объектов.

Пейзажные фотографии представляют собой обзор области, показывающий объект и его связь с окружающей территорией. Пейзажная фотография может быть сделана с близлежащего холма, показывая издалека тот же участок ручья, где была сделана тематическая фотография.

На рис. 3 приведены некоторые примеры фотографиков общего вида.

КАК Я МОГУ НАЙТИ ТАКОЙ ЖЕ ФОТОСЮЖЕТ В СЛЕДУЮЩЕМ ГОДУ?

Оставив ярко окрашенные колышки на месте, вы отметите точное местонахождение участка фото. Однако из-за роста растительности и других изменений фотоучасток может быть плохо виден в последующие годы. Фотография местности вокруг участка, сделанная с ближайшей дороги в момент закладки участка, может облегчить определение общего местоположения.

Опять же, не забудьте сохранить копии всех фотографий для себя!

КАК ДЕЛАТЬ ПОСЛЕДУЮЩИЕ ФОТОГРАФИИ?

Когда вы делаете последующие фотографии, следуйте тому же процессу, что и при съемке первоначальных. Включите те же ставки и новую метку на фотографии крупным планом. Совместите те же ориентиры и вехи на последующих фотографиях общего вида. Не забудьте сделать новую этикетку.

Чтобы придать достоверность вашим фотографиям и действительно показать результаты, лучше всего делать последующие фотографии примерно в то же время года, что и оригиналы.

ЧТО ЕСЛИ МНЕ НУЖНА ПОМОЩЬ?

Если вам нужна дополнительная информация о том, как настроить фотопечать или сделать последующие фотографии, свяжитесь с GWEB по телефону 503-378-3589. Мы направим ваш запрос соответствующему лицу в вашем районе.

Таблица 1

Мониторинг общих практик для повышения эффективности

Упражняться

Улучшает водоразделы (качество и количество воды) за счет …

Отслеживайте, делая (до, во время, после) фотографии …

Контрольный можжевельник на возвышенностях

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

… места, где можжевельник был убит или удален

Управление выпасом домашнего скота с помощью новых схем севооборота, ограждений или гидротехнических сооружений

… увеличение травяного покрова и рост травы на возвышенностях для перехвата осадков, препятствия и фильтрации сухопутного стока, а также уменьшения эрозии и заиления. Уменьшение уплотнения в прибрежных районах, чтобы уменьшить обрушения берегов, эрозию и заиливание ручьев

… репрезентативные районы на возвышенностях и береговые профили в прибрежных районах

Установите стабилизирующую градиент каплевидную конструкцию , чтобы частично перекрыть поток и сформировать бассейн.

… снижение скорости потока, улавливание наносов, уменьшение эрозии берегов ручья и прорезания русел, а также содействие восстановлению растительности на берегах рек

. .. профили репрезентативных берегов. Измерьте глубину ила за конструкциями

Строительные причалы в руслах рек для частичного перекрытия речного стока и формирования лужи

… снижение скорости течения, позволяющее оседать наносам и защищающее русло ниже по течению от прорези, обрушения берегов и эрозии

… вниз по течению от причалов с расстояния около 30 футов

Травянистые насаждения на возвышенностях

… увеличение травяного покрова, чтобы перехватывать осадки, препятствовать стоку, уменьшать эрозию, увеличивать инфильтрацию и фильтровать поверхностный сток

… репрезентативные пейзажи

Посадка растительности на тугайных участках

… закрепление прибрежной почвы, уменьшение обрушения берегов ручья, эрозии и прорезания русел; содействие восстановлению растительности на берегах рек и восстановление профиля русла; улавливание мусора, фильтрация ручья, обеспечение тени и снижение температуры ручья

. .. репрезентативные профили берегов ручья (с горизонтом на верхнем краю фотографии)

Установите каменную наброску из спиленных деревьев , чтобы берега ручья

… препятствующие течению и скорости потока вдоль берегов; уменьшение эрозии, прорезания каналов и обрушения берегов; уменьшение заиления, содействие восстановлению растительности на берегах рек для дальнейшего улавливания отложений; уменьшение уплотнения и вытаптывания скотом в прибрежных районах

… сечения берегах ручьев, уделяя особое внимание местам типичных установок

Установить устройства управления рубкой

… прекращение прорезания русла, содействие заживлению русла, помощь в восстановлении профиля русла и содействие накоплению воды в прибрежных районах

… зоны обработки, обеспечивающие косой обзор проблемных участков

Рисунок 1

КРУПНЫЙ ПЛАН ПОСТОЯННЫЙ
МЕСТОПОЛОЖЕНИЕ ФОТОГРАФИИ
(3 фута x 3 фута. Контур участка)

  • Покрасьте столбы яркой перманентной аэрозольной краской (желтой или оранжевой), чтобы облегчить перемещение. Перекрасьте эти ставки, когда будут сделаны последующие фотографии.

Рисунок 2

ЭТИКЕТКА С ФОТО

  • Создайте этикетку с этой информацией. Этикетка должна быть достаточно крупной, чтобы ее можно было прочитать на фотографии.

Рисунок 3

ОБЩИЙ ВИД ФОТО УЧАСТКОВ


Для просмотра и печати документов, представленных в виде файлов PDF, требуется Adobe(R) Acrobat(R) Reader (бесплатно).

Четверг, 06 августа 1998 г. , 20:32:25 PDT

One Hour Photo (2002) – Краткое изложение сюжета

Править

Фото за час (2002)

Прыгать на:

  • Резюме (4)
  • Резюме (1)
Резюме
  • Психически неуравновешенный фотопроявитель нацелился на семью из высшего среднего класса после того, как его одержимость ими стала более болезненной и тревожной, чем кто-либо из них мог себе представить.

  • Сай Пэрриш средних лет работает техником в часовой фотолаборатории, расположенной в магазине SavMart в пригородном торговом центре. Сай — одинокий человек, у него никогда не было друзей. Он многое знает о своих клиентах благодаря фотографиям, которые они разработали. Но он знает о семье Йоркин больше, чем кто-либо другой, особенно о Нине Йоркин и ее сыне-подростке Джейке Йоркине, о двух членах семьи, которые привозят и забирают семейные фотообработки, о семье, которой он одержим. Муж Нины, Уилл Йоркин, не связан с его одержимостью, поскольку Сай видела его только на фотографиях. Одержимость Сая включает в себя фантазии о том, чтобы стать их любимым «дядей Саем». Он даже делал для себя дополнительный набор отпечатков всех их фотографий с тех пор, как Джейк был новорожденным. После инцидента на работе и после того, как Сай узнает больше о семье с помощью набора фотографий, он решает исправить несправедливость, которую он видит, единственным известным ему способом. Его действия демонстрируют его истинное психическое состояние.

    —Хьюго

  • Сеймур ‘SY’ Пэрриш занимается фотопроявкой уже 20 лет. Он обладает обширными знаниями в области современной фотографии и зарабатывает на жизнь проявкой фотографий в местном универмаге. Но SY живет грустной и одинокой жизнью и начинает шпионить за семьей Йоркиных, его самыми большими клиентами, у которых, кажется, есть все на свете. SY начинает чувствовать, что хочет быть в жизни йоркинов, но когда он обнаруживает, что йоркины не так совершенны, как кажутся, он становится человеком, выполняющим миссию по разоблачению несовершенства семьи йоркинов, которые могут разлучить их.

    — Джеффри А. Миддлтон

  • Фото-клерк универмага, Сеймур «Сай» Пэрриш, исключительно хорошо разбирается в фотографии и занимается проявкой фотографий для семьи Йоркин с тех пор, как их сын был младенцем. Тем не менее, Сай также живет очень одинокой и одинокой жизнью — без жены, подруги или семьи на картинке. У Сая начинает развиваться тревожная одержимость Йоркинами и тем, что у них есть, и когда его увольняют за кражу, он перебарщивает. Раскрыв тревожную тайну о мистере Йоркине, он леденящим душу гневом мстит…

    — Дерек О’Кейн


Спойлеры

Синопсис ниже может выдать важные моменты сюжета.

Сводка
  • Сеймур «Сай» Пэрриш (Робин Уильямс), фототехник в мини-лаборатории одночасовой фотопроявочной клиники SavMart в пригороде Лос-Анджелеса, ведет депрессивную уединенную жизнь за пределами «небесной» гиперреалистичной атмосферы универмаг. Каждый день он трудится над тем, чтобы его клиенты получали фотографии самого высокого качества; его жизнь — это действительно его работа, так как ему не к кому и не к чему вернуться домой в конце каждого дня. Каждый рабочий день подходит к концу, и Сай погружается в неотвратимую рутину, проводя вечера в одиночестве в своей пустынной гостиной перед телевизором. Единственное, что есть у Сая в безупречной квартире, это хомяк, запертый в его спальне. Он чрезвычайно организованный, аккуратный и дотошный человек, который носит всю бежевую одежду. Чувствуя себя неуместным в мире, где, кажется, никто не понимает драгоценного дара друзей и семьи, Сай стремится погрузиться в свои собственные фантазии, чтобы избежать боли своего существования.

    Его любимые клиенты — семья Йоркинов, состоящая из мужа Уилла (Майкл Вартан), жены Нины (Конни Нильсен) и их сына Джейка (Дилан Смит). Он много лет делал их фотографии и со временем увлекся семьей; он боготворит их счастье и изобилие, запоминает все личные подробности о них, которые он может узнать, и, наконец, начинает преследовать их. Сай тайно делает свои собственные копии фотографий Йоркиных с негативов, а затем прикрепляет их к стене в своей квартире, создавая массивный коллаж, который насчитывает более 600 штук. Больше всего он мечтает о том, чтобы стать членом их семьи и разделить любовь, которую, по его мнению, они должны испытывать. Однако он болезненно застенчив, и его неуклюжие попытки сблизиться с семьей мягко отвергаются.

    Сю в конце концов удается установить связь с Ниной, когда он притворяется, что интересуется романом, который, как он заметил, она читала в определенный день в магазине. Впервые Нина задает Сая личные вопросы о его жизни, понимая, что он действительно одинокий человек, на что раньше с сочувствием обращал внимание только Джейк. Однако эта связь недолговечна, поскольку босс Сая, мистер Оуэнс, на следующий день увольняет его за кражу отпечатков. Просматривая свои фотографии в последний раз, Сай обнаруживает, что у Уилла роман, и его идиллическое представление о Йоркинах как об «идеальной» семье рушится. Он начинает ненавидеть и завидовать Уиллу, у которого есть все, о чем мечтает Сай, но, похоже, ему все равно.

    Потеряв работу, Сай выслеживает и фотографирует маленькую дочь Оуэнса, что приводит к полицейскому расследованию против него. Пока детективы Ван Дер Зи и Аутербридж (Эрик Ла Саль и Кларк Грегг) обнаруживают одержимость Сая, Сай противостоит Уиллу и его любовнице Майе (Эрин Дэниэлс) во время свидания в их гостиничном номере. С помощью ножа и фотоаппарата Сай заставляет влюбленных позировать обнаженными, пока он фотографирует. На протяжении всего испытания Майя паникует, а Сай агрессивно реагирует, но не причиняет вреда ни одному из них. После противостояния, когда Сай просто сидит на кровати в своем гостиничном номере, он обнаруживает, что в отель прибыла полиция, и пытается сбежать. Звучит сигнал тревоги, и Ван Дер Зи преследует его, в то время как Аутербридж обнаруживает Уилла Йоркина и его любовницу, невредимых, но травмированных. После погони полиция наконец задерживает Сая в гараже, когда он пытается убежать от своей машины. При аресте. Сай утверждает: «Я просто фотографировал».

    Финальная сцена происходит в комнате для допросов в полиции, где Ван Дер Зи спрашивает Сая, почему он терроризировал Йорков, на что Сай косвенно сообщает, что его отец заставлял его делать «больные, отвратительные вещи, которые ни один ребенок никогда не должен делать». . Подтекст, подтвержденный Романеком, состоит в том, что отец Сая эксплуатировал его для детской порнографии. Романек также подтвердил, что Сай использовал камеру как средство наказания Уилла и противостояния его прошлому, поскольку его отец говорил ему, что «это все просто притворство», оскорбляя его. Сай не может понять, почему Уилл, будучи идеальным отцом, был полон решимости разрушить свою семью и, таким образом, навсегда покончил с фантазией, которой он придерживался почти 10 лет.

    Когда детектив начинает понимать его и готовится принять его признание, Сай просит фотографии, которые он сделал в отеле, которые детектив назвал «доказательством». Судя по всему, это всего лишь снимки предметов домашнего обихода и предметов интерьера, которые он сделал после инцидента в отеле. Это означает, что Сай никогда не фотографировала Уилла и Майю, а только делала вид. Однако в более ранней режиссерской версии мы видим дополнительные удаленные сцены, в которых полиция анализирует настоящие фотографии Уилла и Майи с места преступления, сделанные Сай.

    Фильм завершается фотографией семьи Йоркин с Си. Романек утверждает в комментарии к DVD, что изображение призвано символизировать открытый финал; Зрителю остается решить, существует ли картина только в сознании Сая или он когда-нибудь снова увидит семью Йоркиных.

См. также

Слоганы | Синопсис | Ключевые слова сюжета | Руководство для родителей

Начало работы | Зона авторов »

Внести вклад в эту страницу


исследовать закономерности в больших коллекциях изображений


Что такое ImagePlot?
Исследуйте изображения и видео по-новому.


Как это работает?
Создавайте визуализацию и анимацию в высоком разрешении и настраивайте все под себя.


Будет ли он работать с моими вещами?
Работает с любыми носителями, на любой платформе (почти).


Что такое ImagePlot?

ImagePlot — это бесплатный программный инструмент, который визуализирует коллекции изображений и видео любого размера. Он реализован в виде макроса, который работает с программой обработки изображений с открытым исходным кодом ImageJ.

ImagePlot был разработан Инициативой по изучению программного обеспечения при поддержке Национального фонда гуманитарных наук (NEH), Калифорнийского института телекоммуникаций и информационных технологий (Calit2) и Центра исследований в области вычислительной техники и искусства (CRCA).

Просматривайте всю свою коллекцию изображений в одной визуализации.

Существующие средства визуализации отображают данные в виде точек, линий и полос. Визуализации ImagePlot показывают фактические изображения в вашей коллекции. Изображения можно масштабировать до любого размера и упорядочивать в любом порядке — в соответствии с их датой, содержанием, визуальными характеристиками и т. д. Поскольку цифровое видео — это всего лишь набор отдельных неподвижных изображений, вы также можете использовать ImagePlot для изучения шаблонов в фильмах, анимации. , видеоигры и любые другие данные движущихся изображений.

Лучше разбираться в медиа-коллекциях и делать новые открытия.

Визуализируйте коллекции изображений в виде временных шкал и диаграмм рассеивания, которые отображают все изображения в коллекции. Найдите изображения, которые являются выбросами. Откройте для себя кластеры — наборы изображений, схожих по содержанию или визуальным свойствам. Визуализируйте несколько наборов изображений, чтобы лучше понять их сходства и различия. Изучите закономерности в существующих метаданных (т. е. даты, имена и т. д.), добавленные аннотации и ключевые слова или визуальные характеристики (т. е. яркость, насыщенность, оттенок, формы и т. д.)

Визуализируйте изменения.

Мы включили макросы, которые автоматически измеряют различные визуальные свойства каждого изображения в коллекции (или каждого кадра в видео). Эти измерения могут быть визуализированы в виде линейных графиков, диаграмм рассеяния и графиков изображений. Это позволяет увидеть закономерности изменения визуальных характеристик изображений с течением времени. Вы также можете сравнить несколько наборов изображений с точки зрения их визуальных характеристик.

Визуализируйте коллекции изображений любого размера.

От нескольких десятков до миллионов изображений. Теоретически нет ограничений на количество изображений, которые могут быть включены в одну визуализацию. Несколько десятков изображений можно визуализировать за секунду, несколько тысяч — за несколько минут. Самое большое число, которое мы пробовали до сих пор, составляло миллион изображений (да, это заняло некоторое время, но это сработало!). Если ваша коллекция действительно большая, запустите визуализацию и просто вернитесь, когда она будет закончена.

Как это работает?

От точек к изображениям.

Начните с точечных и линейных графиков, которые позволят вам быстро изучить набор изображений. Как только вы найдете интересный шаблон, повторно визуализируйте график, чтобы показать изображения. Перемещайтесь между этими вариантами так часто, как вам нравится.

Рендеринг и сохранение визуализаций в высоком разрешении.

Вы можете визуализировать и сохранять черно-белые и полноцветные визуализации любого размера (при условии, что они не превышают 2,5 ГБ). Например, мы создали визуализацию в оттенках серого 44 000 x 44 000, показывающую один миллион страниц манги, 137 530 x 13 800 визуализация, показывающая все кадры часового фильма, полноцветная визуализация 16 000 x 12 000, показывающая 776 картин Ван Гога. (Все изображения были обработаны на Mac Book Pro с 4 ГБ ОЗУ).

Превратите любую визуализацию в анимацию.

Выберите опцию сохранения визуализации после добавления к ней каждого нового изображения. В результате получается последовательность файлов, которую можно легко превратить в видео (используйте QuickTime или любое приложение для редактирования видео).

Все настроить.

Настройте внешний вид точек данных и линий, фона, осевых линий, меток данных, меток изображений, размера изображений, прозрачности изображения и почти всего остального, что только можно придумать. Мы написали ImagePlot для поддержки как быстрого просмотра наборов изображений, так и создания визуализаций высокого разрешения для публикаций и выставок. Поэтому мы добавили параметры для управления всеми возможными аспектами внешнего вида визуализации. Визуализации, созданные с помощью ImagePlot, демонстрировались в научных центрах, музеях искусства и дизайна и художественных галереях, включая Музей графического дизайна (Бреда), Биеннале дизайна в Кванджу (Корея) и Музей современного искусства Сан-Диего.

Используйте с инструментами анализа цифровых изображений.

Измеряйте различные визуальные свойства изображений в коллекции (яркость, насыщенность, оттенки, формы) с помощью предоставляемых нами макросов или любых других инструментов обработки цифровых изображений. Изучите закономерности этих свойств во всей коллекции с помощью визуализаций ImagePlot.

Будет ли он работать с моими вещами?

Работа с изображениями во всех популярных форматах.

Цветные изображения или изображения в оттенках серого? JPEG или TIFF? Нет проблем, ImagePlot справится со всеми ними. Если изображения имеют разные размеры, ImagePlot также может автоматически масштабировать их до одинакового размера. Если ваши изображения расположены в нескольких каталогах на вашем компьютере, мы также предусмотрели эту возможность.

Кроссплатформенность.

Запустите ImagePlot в Windows, Mac OS или Unix.

Кодирование не требуется.

ImagePlot имеет графический интерфейс пользователя, поэтому вам не нужно ничего программировать или создавать сценарии.

Использовать данные, созданные в других приложениях.

ImagePlot работает с наиболее распространенными форматами данных: набор файлов изображений и данные об этих изображениях, сохраненные в текстовом файле с разделителями табуляцией (.txt). Это делает ImagePlot совместимым со многими другими приложениями для каталогизации мультимедиа, анализа данных и визуализации информации. Вы можете подготовить и отредактировать данные с помощью любого приложения для работы с электронными таблицами или текстового процессора. Файл данных может содержать любое количество строк и столбцов. (Например, наш файл данных для одного миллиона страниц манги содержал один миллион строк и 60 столбцов.)

Загрузите и запустите ImagePlot за считанные минуты.

ImagePlot — это макрос, который выполняется в кросс-платформенной программе обработки изображений с открытым исходным кодом ImageJ. Вместе эти файлы занимают менее 5 МБ. Полная загрузка объемом ~ 100 МБ поставляется с несколькими большими наборами образцов данных, которые полезны для начала работы, но не требуются для работы программного обеспечения.



Код ImagePlot на GitHub

Просмотрите последние коммиты и журнал изменений на нашей странице GitHub .



Загрузить ImagePlot 1.1

Аппаратные требования: 2 ГБ ОЗУ (рекомендуется 4 ГБ или более для визуализации изображений с высоким разрешением).

Требования к программному обеспечению: Чтобы использовать макрос ImagePlot, сначала необходимо установить приложение ImageJ. ImageJ будет работать на Mac, Windows или Linux. Файлы приложений для всех трех операционных систем включены в загружаемый файл ImagePlot.zip.

ImagePlot_v1.1.zip 110 МБ
Макрос ImagePlot, приложение ImageJ (Windows/Mac/Linux), примеры наборов данных, статьи по теории и методологии.

ImagePlot_v1.1-program-only.zip 3 МБ
Макрос ImagePlot, приложение ImageJ (Windows/Mac/Linux).

Предыдущая версия

ImagePlot_v0.9.zip 110 MB

ImagePlot_v0. 9-Program-Only.zip 3 MB



Что нового в версии 1.1

9003


. Что нового в версии 1.1

. имя файла. Он включает в себя имена файлов данных и столбцы данных, используемые для осей x и y.

Возможность автоматического сохранения визуализации после ее визуализации (появляется в первом диалоговом окне приложения).

Параметр для визуализации визуализации с использованием лучшего алгоритма изменения размера (работает медленнее, но создает более качественные изображения; этот параметр отображается в диалоговом окне «Параметры изображения»).

Проверка ошибки открытия файла: если ImagePlot не может найти определенное изображение, имя файла печатается в окне журнала, но рендеринг продолжается.

Как разработать CNN с нуля для CIFAR-10 Photo Classification

Джейсон Браунли on 13 мая 2019 г. в Deep Learning for Computer Vision

Последнее обновление: 28 августа 2020 г.

Узнайте, как с нуля разработать модель глубокой сверточной нейронной сети для набора данных классификации объектов CIFAR-10.

Задача классификации небольших фотографий CIFAR-10 представляет собой стандартный набор данных, используемый в компьютерном зрении и глубоком обучении.

Несмотря на то, что набор данных эффективно решен, его можно использовать в качестве основы для обучения и практики разработки, оценки и использования сверточных нейронных сетей глубокого обучения для классификации изображений с нуля.

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

В этом руководстве вы узнаете, как с нуля разработать модель сверточной нейронной сети для классификации фотографий объектов.

После завершения этого урока вы будете знать:

  • Как разработать набор тестов для надежной оценки модели и установить базовый уровень производительности для задачи классификации.
  • Как исследовать расширения базовой модели, чтобы улучшить возможности обучения и модели.
  • Как разработать окончательную модель, оценить производительность окончательной модели и использовать ее для прогнозирования новых изображений.

Начните свой проект с моей новой книги Deep Learning for Computer Vision, включающей пошаговых руководств и файлы с исходным кодом Python для всех примеров.

Давайте начнем.

  • Обновлено в октябре 2019 г. : обновлено для Keras 2.3 и TensorFlow 2.0.

Как разработать с нуля сверточную нейронную сеть для классификации фотографий CIFAR-10
Фото Роуз Длхопольски, некоторые права защищены.

Обзор учебника

Этот учебник разделен на шесть частей; они:

  1. Набор данных классификации фотографий CIFAR-10
  2. Тестовый жгут для оценки модели
  3. Как разработать базовую модель
  4. Как разработать улучшенную модель
  5. Как разработать дополнительные улучшения
  6. Как доработать модель и сделать прогнозы

Хотите получить результаты с помощью глубокого обучения для компьютерного зрения?

Пройдите мой бесплатный 7-дневный экспресс-курс по электронной почте прямо сейчас (с примером кода).

Нажмите, чтобы зарегистрироваться, а также получить бесплатную электронную версию курса в формате PDF.

Набор данных классификации фотографий CIFAR-10

CIFAR — это аббревиатура, обозначающая Канадский институт перспективных исследований, и набор данных CIFAR-10 был разработан исследователями института CIFAR вместе с набором данных CIFAR-100.

Набор данных состоит из 60 000 цветных фотографий 32×32 пикселей объектов из 10 классов, таких как лягушки, птицы, кошки, корабли и т. д. Метки классов и связанные с ними стандартные целочисленные значения перечислены ниже.

  • 0: самолет
  • 1: автомобиль
  • 2: птица
  • 3: кошка
  • 4: олень
  • 5: собака
  • 6: лягушка
  • 7: лошадь
  • 8: корабль
  • 9: грузовик

Это очень маленькие изображения, намного меньше обычной фотографии, и набор данных предназначался для исследования компьютерного зрения.

CIFAR-10 — это хорошо изученный набор данных, который широко используется для сравнительного анализа алгоритмов компьютерного зрения в области машинного обучения. Задача « решена ». Достичь точности классификации 80% относительно просто. Наивысшая производительность при решении задачи достигается за счет сверточных нейронных сетей глубокого обучения с точностью классификации выше 9.0% в тестовом наборе данных.

В приведенном ниже примере загружается набор данных CIFAR-10 с использованием API Keras и создается график первых девяти изображений в наборе обучающих данных.

# пример загрузки набора данных cifar10 из matplotlib импортировать pyplot из keras.datasets импортировать cifar10 # загрузить набор данных (trainX, обучаемый), (testX, тестируемый) = cifar10.load_data() # суммировать загруженный набор данных print(‘Поезд: X=%s, y=%s’ % (trainX.shape, trainy.shape)) print(‘Тест: X=%s, y=%s’ % (testX.shape, testy.shape)) # построить первые несколько изображений для я в диапазоне (9): # определить подсюжет pyplot. subplot (330 + 1 + я) # отображать необработанные пиксельные данные pyplot.imshow (поездX [я]) # покажи рисунок pyplot.show ()

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

# пример загрузки набора данных cifar10

из matplotlib import pyplot

из keras.datasets import cifar10

# загрузить набор данных

(trainX, trainy), (testX, testy) = cifar10.load_data()

# суммировать загруженный набор данных

900Train : X=%s, y=%s’ % (trainX.shape, trainy.shape))

print(‘Тест: X=%s, y=%s’ % (testX.shape, testy.shape))

# построить первые несколько изображений

для i в диапазоне (9):

# определить подграфик

pyplot.subplot(330 + 1 + i)

# вывести необработанные пиксельные данные

pyplot.imshow(trainX[i])

# показать фигуру

pyplot. show()

При выполнении примера загружается набор обучающих и тестовых данных CIFAR-10 и печатается их форма.

Мы видим, что в обучающем наборе данных 50 000 примеров, а в тестовом наборе данных 10 000, и что изображения действительно квадратные, с размером 32×32 пикселя и цветом, с тремя каналами.

Поезд: X=(50000, 32, 32, 3), y=(50000, 1) Тест: X=(10000, 32, 32, 3), y=(10000, 1)

Поезд: X=(50000, 32, 32, 3), y=(50000, 1)

Тест: X=(10000, 32, 32, 3), y=(10000, 1)

Также создается график первых девяти изображений в наборе данных. Понятно, что изображения действительно очень маленькие по сравнению с современными фотографиями; может быть сложно увидеть, что именно представлено на некоторых изображениях, учитывая чрезвычайно низкое разрешение.

Это низкое разрешение, вероятно, является причиной ограниченной производительности, которой могут достичь передовые алгоритмы в наборе данных.

График части изображений из набора данных CIFAR-10

Тестовый жгут для оценки модели

Набор данных CIFAR-10 может быть полезной отправной точкой для разработки и практического применения методологии решения задач классификации изображений с использованием сверточных нейронных сетей.

Вместо того, чтобы просматривать литературу по хорошо работающим моделям набора данных, мы можем разработать новую модель с нуля.

В наборе данных уже есть четко определенный набор данных для обучения и тестирования, который мы будем использовать. Альтернативой может быть выполнение k-кратной перекрестной проверки с k=5 или k=10. Это желательно при наличии достаточных ресурсов. В этом случае и в интересах обеспечения выполнения примеров в этом руководстве в разумные сроки мы не будем использовать перекрестную проверку в k-кратном порядке.

Тестовый жгут имеет модульную конструкцию, и мы можем разработать отдельную функцию для каждого элемента. Это позволяет модифицировать или заменять определенный аспект тестовой системы, если мы этого хотим, отдельно от остальных.

Мы можем разработать этот тестовый комплект из пяти ключевых элементов. Это загрузка набора данных, подготовка набора данных, определение модели, оценка модели и представление результатов.

Загрузить набор данных

Мы знаем кое-что о наборе данных.

Например, мы знаем, что все изображения предварительно сегментированы (например, каждое изображение содержит один объект), что все изображения имеют одинаковый квадратный размер 32×32 пикселя и что изображения являются цветными. Поэтому мы можем загрузить изображения и использовать их для моделирования практически сразу.

# загрузить набор данных (trainX, trainY), (testX, testY) = cifar10.load_data()

# загрузить набор данных

(trainX, trainY), (testX, testY) = cifar10.load_data()

Мы также знаем, что существует 10 классов и что классы представлены уникальными целыми числами.

Таким образом, мы можем использовать одно горячее кодирование для элемента класса каждой выборки, преобразуя целое число в двоичный вектор из 10 элементов с 1 в качестве индекса значения класса. Мы можем добиться этого с помощью служебной функции to_categorical() .

# одно горячее кодирование целевых значений trainY = to_categorical(trainY) testY = to_categorical(testY)

# одно целевое значение горячего кодирования

trainY = to_categorical(trainY)

testY = to_categorical(testY)

Функция load_dataset() реализует это поведение и может использоваться для загрузки набора данных.

# загрузить поезд и протестировать набор данных деф load_dataset(): # загрузить набор данных (trainX, trainY), (testX, testY) = cifar10.load_data() # одно горячее кодирование целевых значений trainY = to_categorical(trainY) testY = to_categorical (testY) вернуть trainX, trainY, testX, testY

1

2

3

4

5

6

7

8

# загрузить поезд и набор тестовых данных

def load_dataset():

# загрузить набор данных

(trainX, trainY), (testX, testY) = cifar10. load_data()

# одно горячее кодирование целевых значений

trainY = to_categorical(trainY)

testY = to_categorical(testY)

return trainX, trainY, testX, testY

Подготовка данных пикселей

Мы знаем, что значения пикселей для каждого изображения в наборе данных представляют собой целые числа без знака в диапазоне от бесцветного до полноцветного, или от 0 до 255.

Мы не знаем, как лучше всего масштабировать значения пикселей для моделирования, но мы знаем, что потребуется некоторое масштабирование.

Хорошей отправной точкой является нормализация значений пикселей, например. масштабируйте их в диапазоне [0,1]. Это включает в себя сначала преобразование типа данных из целых чисел без знака в числа с плавающей запятой, а затем деление значений пикселей на максимальное значение.

# преобразовать целые числа в числа с плавающей запятой train_norm = train.astype(‘float32’) test_norm = test.astype(‘float32’) # нормализовать до диапазона 0-1 поезд_норма = поезд_норма / 255,0 тест_норма = тест_норма / 255,0

1

2

3

4

5

6

# преобразование из целых чисел в числа с плавающей запятой

train_norm = train. astype(‘float32’)

test_norm = test.astype(‘float32’)

# нормализовать до диапазона 0-1

train_norm = train_norm / 255.0

test_norm = test_norm / 255.0

Приведенная ниже функция prep_pixels() реализует это поведение и предоставляет значения пикселей для наборов данных обучения и тестирования, которые необходимо масштабировать.

# масштаб пикселей def prep_pixels (поезд, тест): # преобразовать целые числа в числа с плавающей запятой train_norm = train.astype(‘float32’) test_norm = test.astype(‘float32’) # нормализовать до диапазона 0-1 поезд_норма = поезд_норма / 255,0 тестовая_норма = тестовая_норма / 255,0 # вернуть нормализованные изображения вернуть train_norm, test_norm

1

2

3

4

5

6

7

8

1 1 1

11

# масштаб пикселей

def prep_pixels(train, test):

# преобразование целых чисел в числа с плавающей запятой нормализовать до диапазона 0-1

train_norm = train_norm / 255,0

test_norm = test_norm / 255. 0

# вернуть нормализованные изображения

return train_norm, test_norm

Эта функция должна вызываться для подготовки значений пикселей перед любым моделированием.

Определить модель

Далее нам нужен путь к нейросетевой модели.

Приведенная ниже функция define_model() определяет и возвращает эту модель и может быть заполнена или заменена для заданной конфигурации модели, которую мы хотим оценить позже.

# определить модель cnn определить_модель(): модель = Последовательный() # … возвратная модель

# определить модель cnn

def define_model():

model = Sequential()

# …

вернуть модель

Оценить модель

После того, как модель определена, нам нужно ее подогнать и оценить.

Для подбора модели потребуется указать количество периодов обучения и размер партии. Сейчас мы будем использовать общие 100 обучающих эпох и скромный размер пакета 64.

Лучше использовать отдельный набор данных проверки, например. путем разделения набора данных поезда на наборы поезда и проверки. В этом случае мы не будем разделять данные, а вместо этого используем тестовый набор данных в качестве набора данных проверки, чтобы сделать пример простым.

Набор тестовых данных можно использовать как набор данных проверки и оценивать в конце каждой эпохи обучения. Это приведет к отслеживанию оценок оценки модели в наборе данных поезда и тестирования для каждой эпохи, которые можно будет нанести на график позже.

# подходящая модель history = model.fit(trainX, trainY, epochs=100, batch_size=64, validation_data=(testX, testY), verbose=0)

# подходящая модель

history = model.fit(trainX, trainY, epochs=100, batch_size=64, validation_data=(testX, testY), verbose=0)

Как только модель подходит, мы можем оценить ее непосредственно на тестовом наборе данных.

# оценить модель _, acc = model.evaluate(testX, testY, verbose=0)

# оценить модель

_, acc = model.evaluate(testX, testY, verbose=0)

Текущие результаты

После оценки модели мы можем представить результаты.

Необходимо представить два ключевых аспекта: диагностику поведения модели при обучении во время обучения и оценку производительности модели.

Во-первых, диагностика включает в себя создание линейного графика, показывающего производительность модели на поезде и тестовом наборе во время обучения. Эти графики полезны для получения представления о том, подходит ли модель для набора данных.

Мы создадим единую фигуру с двумя подграфиками, один для потерь и один для точности. Синие линии будут обозначать производительность модели в наборе данных для обучения, а оранжевые линии будут указывать производительность в наборе данных для проверки удержания. Приведенная ниже функция summ_diagnostics() создает и показывает этот график с учетом собранных историй обучения. График сохраняется в файл, а именно в файл с тем же именем, что и скрипт, но с расширением « png ».

# построение диагностических кривых обучения defsummary_diagnostics(история): # сюжетная потеря pyplot.subplot(211) pyplot.title(‘Перекрестная потеря энтропии’) pyplot.plot(history.history[‘потеря’], цвет=’синий’, метка=’поезд’) pyplot.plot(history.history[‘val_loss’], color=’orange’, label=’test’) # точность сюжета pyplot.subplot(212) pyplot.title(‘Точность классификации’) pyplot.plot(history.history[‘точность’], color=’blue’, label=’train’) pyplot.plot(history.history[‘val_accuracy’], color=’оранжевый’, label=’test’) # сохранить график в файл имя файла = sys.argv[0].split(‘/’)[-1] pyplot.savefig (имя файла + ‘_plot.png’) pyplot.close()

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

# построение диагностических кривых обучения

defsummum_diagnostics(history):

# построение графика потерь

pyplot. subplot(211)

pyplot.title(‘Cross Entropy Loss’)

pyplot.plot(history.history[‘убыток’], color=’синий’, label=’train’)

pyplot.plot(history.history[‘val_loss’], color=’orange’, label= ‘test’)

# точность графика

pyplot.subplot(212)

pyplot.title(‘Точность классификации’)

pyplot.plot(history.history[‘accuracy’], color=’blue’, label =’train’)

pyplot.plot(history.history[‘val_accuracy’], color=’orange’, label=’test’)

# сохранить график в файл

filename = sys.argv[0]. разделить(‘/’)[-1]

pyplot.savefig(имя файла + ‘_plot.png’)

pyplot.close()

Далее мы можем сообщить об окончательной производительности модели в тестовом наборе данных.

Это может быть достигнуто путем непосредственной печати точности классификации.

print(‘> %.3f’ % (акк * 100.0))

печать(‘> %.3f’ % (акк * 100.0))

Полный пример

Нам нужна функция, которая будет управлять тестовой обвязкой.

Это включает в себя вызов всех функций определения. Функция run_test_harness() ниже реализует это и может быть вызвана для запуска оценки данной модели.

# запустить тестовую обвязку для оценки модели защита run_test_harness(): # загрузить набор данных trainX, trainY, testX, testY = load_dataset() # подготовить пиксельные данные TrainX, testX = prep_pixels (trainX, testX) # определить модель модель = определить_модель() # подходящая модель history = model.fit(trainX, trainY, epochs=100, batch_size=64, validation_data=(testX, testY), verbose=0) # оценить модель _, acc = model.evaluate (testX, testY, подробный = 0) напечатать(‘> %.3f’ % (акк * 100.0)) # кривые обучения summary_diagnostics(история)

1

2

3

4

5

6

7

8

10

11

12

13

14

15

12

13

14

15

11111111111111111111111111111111111111111111111

# запустить тестовую систему для оценки модели

def run_test_harness():

# загрузить набор данных

trainX, trainY, testX, testY = load_dataset()

# подготовить данные пикселей

trainX, testX = prep_pixels(trainX, testX)

# определение модели

model = define_model()

# подгонка модели

history = model. fit(trainX, trainY, epochs=100, batch_size=64, validation_data =(testX, testY), verbose=0)

# оценить модель

_, acc = model.evaluate(testX, testY, verbose=0)

print(‘> %.3f’ % (acc * 100.0) )

# кривые обучения

summary_diagnostics(история)

Теперь у нас есть все, что нужно для тестового жгута.

Полный пример кода для тестовой программы для набора данных CIFAR-10 приведен ниже.

# тестовая программа для оценки моделей в наборе данных cifar10 импорт системы из matplotlib импортировать pyplot из keras.datasets импортировать cifar10 из keras.utils импортировать в_categorical из keras.models импорт последовательный из keras.layers импортировать Conv2D из keras.layers импортировать MaxPooling2D из keras.layers импорт плотный из keras.layers импортировать Flatten из keras.optimizers импорт SGD # загрузить поезд и протестировать набор данных деф load_dataset(): # загрузить набор данных (trainX, trainY), (testX, testY) = cifar10. load_data() # одно горячее кодирование целевых значений trainY = to_categorical(trainY) testY = to_categorical (testY) вернуть поезд X, поезд Y, тест X, тест Y # масштаб пикселей def prep_pixels (поезд, тест): # преобразовать целые числа в числа с плавающей запятой train_norm = train.astype(‘float32’) test_norm = test.astype(‘float32’) # нормализовать до диапазона 0-1 поезд_норма = поезд_норма / 255,0 тестовая_норма = тестовая_норма / 255,0 # вернуть нормализованные изображения вернуть train_norm, test_norm # определить модель cnn определить_модель(): модель = Последовательный() # … модель возврата # построение диагностических кривых обучения defsummary_diagnostics(история): # сюжетная потеря pyplot.subplot(211) pyplot.title(‘Перекрестная потеря энтропии’) pyplot.plot(history.history[‘потеря’], цвет=’синий’, метка=’поезд’) pyplot.plot(history.history[‘val_loss’], color=’orange’, label=’test’) # точность сюжета pyplot.subplot(212) pyplot.title(‘Точность классификации’) pyplot. plot(history.history[‘точность’], color=’blue’, label=’train’) pyplot.plot(history.history[‘val_accuracy’], color=’оранжевый’, label=’test’) # сохранить график в файл имя файла = sys.argv[0].split(‘/’)[-1] pyplot.savefig (имя файла + ‘_plot.png’) pyplot.close() # запустить тестовую обвязку для оценки модели защита run_test_harness(): # загрузить набор данных trainX, trainY, testX, testY = load_dataset() # подготовить пиксельные данные TrainX, testX = prep_pixels (trainX, testX) # определить модель модель = определить_модель() # подходящая модель history = model.fit(trainX, trainY, epochs=100, batch_size=64, validation_data=(testX, testY), verbose=0) # оценить модель _, acc = model.evaluate (testX, testY, подробный = 0) напечатать(‘> %.3f’ % (акк * 100.0)) # кривые обучения summary_diagnostics(история) # точка входа, запускаем тестовую обвязку run_test_harness()

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

0010 31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

.

. .layers импорт Conv2D

от Keras.layers Import MaxPooling2d

из Keras.layers Импорт День

от Keras.layers Импорт вытяжки

из кераса.

# загрузить набор данных

(trainX, trainY), (testX, testY) = cifar10.load_data()

# одно целевое значение горячего кодирования

trainY = to_categorical(trainY)

testY = to_categorical(testY)

return trainX, trainY, testX, testY

 

# масштаб пикселей

def prep_pixels(train, test):

# преобразование целых чисел в числа с плавающей запятой

train_norm = train.astype(‘float32’) 90mnorm = test.astype(‘float32’)

# нормализовать до диапазона 0-1

train_norm = train_norm / 255.0

test_norm = test_norm / 255.0

# вернуть нормализованные изображения0011

# DEFINE CNN MODEL

DEF DEFINE_MODEL ():

MODEL = Sequential ()

# …

ВОЗВРАЩАЯ МОДЕЛЯ

# Диагностические кривые. проигрыш графика

pyplot.subplot(211)

pyplot.title(‘Перекрестная потеря энтропии’)

pyplot.plot(history.history[‘потеря’], color=’blue’, label=’train’)

pyplot.plot(history.history[‘val_loss’], color=’orange’, label=’test’)

# точность графика

pyplot.subplot(212)

pyplot.title(‘Точность классификации’)

pyplot.plot(history.history[‘accuracy’], color=’blue’, label=’train’ )

pyplot.plot(history.history[‘val_accuracy’], color=’orange’, label=’test’)

# сохранить график в файл

filename = sys.argv[0].split(‘/ ‘)[-1]

pyplot.savefig(filename + ‘_plot.png’)

pyplot.close()

 

# запустить тестовую программу для оценки модели

def run_test_harness():

# загрузить набор данных

trainX, trainY, testX, testY = load_dataset()

# подготовить данные пикселей

trainX, testX = prep_pixels(trainX, testX)

1 # 1 определить модель model = define_model()

# подходящая модель

history = model. fit(trainX, trainY, epochs=100, batch_size=64, validation_data=(testX, testY), verbose=0)

# оценка модели

_ , acc = model.evaluate(testX, testY, verbose=0)

print(‘> %.3f’ % (acc * 100.0))

# кривые обучения

summary_diagnostics(history)

 

# точка входа, запуск тестовой системы

run_test_harness

()

Этот тестовый комплект может оценивать любые модели CNN, которые мы можем захотеть оценить в наборе данных CIFAR-10, и может работать на ЦП или ГП.

Примечание : как есть, модель не определена, поэтому этот полный пример запустить невозможно.

Далее давайте посмотрим, как мы можем определить и оценить базовую модель.

Как разработать базовую модель

Теперь мы можем исследовать базовую модель для набора данных CIFAR-10.

Базовая модель устанавливает минимальную производительность модели, с которой можно сравнить все наши другие модели, а также архитектуру модели, которую мы можем использовать в качестве основы для изучения и улучшения.

Хорошей отправной точкой являются общие архитектурные принципы моделей VGG. Это хорошая отправная точка, поскольку они достигли максимальной производительности в конкурсе ILSVRC 2014, а модульная структура архитектуры проста для понимания и реализации. Дополнительные сведения о модели VGG см. в статье 2015 года «Очень глубокие сверточные сети для крупномасштабного распознавания изображений».

Архитектура включает в себя наложение сверточных слоев с небольшими фильтрами 3 × 3, за которыми следует слой с максимальным объединением. Вместе эти слои образуют блок, и эти блоки могут повторяться, когда количество фильтров в каждом блоке увеличивается с глубиной сети, например, 32, 64, 128, 256 для первых четырех блоков модели. Заполнение используется в сверточных слоях, чтобы гарантировать, что высота и ширина выходных карт объектов соответствуют входным.

Мы можем изучить эту архитектуру на задаче CIFAR-10 и сравнить модель с этой архитектурой с 1, 2 и 3 блоками.

Каждый слой будет использовать функцию активации ReLU и инициализацию веса He, что обычно является передовой практикой. Например, 3-блочная архитектура в стиле VGG может быть определена в Keras следующим образом:

# пример архитектуры в стиле vgg из 3 блоков модель = Последовательный() model.add(Conv2D(32, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’, input_shape=(32, 32, 3))) model.add (Conv2D (32, (3, 3), активация = ‘relu’, kernel_initializer = ‘he_uniform’, padding = ‘то же’)) model.add(MaxPooling2D((2, 2))) model.add (Conv2D (64, (3, 3), активация = ‘relu’, kernel_initializer = ‘he_uniform’, padding = ‘то же’)) model.add (Conv2D (64, (3, 3), активация = ‘relu’, kernel_initializer = ‘he_uniform’, padding = ‘то же’)) model.add(MaxPooling2D((2, 2))) model.add (Conv2D (128, (3, 3), активация = ‘relu’, kernel_initializer = ‘he_uniform’, padding = ‘то же’)) model.add (Conv2D (128, (3, 3), активация = ‘relu’, kernel_initializer = ‘he_uniform’, padding = ‘то же’)) model.add(MaxPooling2D((2, 2))) …

1

2

3

4

5

6

7

8

10

11

12

# пример 3-блочной архитектуры в стиле vgg тот же’, input_shape=(32, 32, 3)))

model. add(Conv2D(32, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’тот же’))

model.add(MaxPooling2D((2, 2)))

model.add(Conv2D(64, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’))

model.add(Conv2D(64, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’))

model.add(MaxPooling2D((2, 2)))

model.add(Conv2D(128, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’))

model.add(Conv2D(128, (3, 3) , активация = ‘relu’, kernel_initializer = ‘he_uniform’, padding = ‘то же’))

модель.добавить(MaxPooling2D((2, 2)))

Определяет детекторную часть модели. Это должно быть связано с частью модели классификатора, которая интерпретирует функции и делает прогноз относительно того, к какому классу принадлежит данная фотография.

Это можно исправить для каждой исследуемой модели. Во-первых, карты объектов, выведенные из части модели, посвященной извлечению признаков, должны быть сглажены. Затем мы можем интерпретировать их с помощью одного или нескольких полносвязных слоев, а затем вывести прогноз. Выходной слой должен иметь 10 узлов для 10 классов и использовать функцию активации softmax.

# пример выходной части модели model.add(Свести()) model.add(Dense(128, активация=’relu’, kernel_initializer=’he_uniform’)) model.add (плотный (10, активация = ‘softmax’)) …

# пример выходной части модели

model.add(Flatten())

model.add(Dense(128, активация=’relu’, kernel_initializer=’he_uniform’))

model.add(Dense( 10, активация=’softmax’))

Модель будет оптимизирована с использованием стохастического градиентного спуска.

Мы будем использовать скромную скорость обучения 0,001 и большой импульс 0,9, оба из которых являются хорошими общими отправными точками. Модель оптимизирует категориальную функцию перекрестной энтропийной потери, необходимую для многоклассовой классификации, и будет контролировать точность классификации.

# скомпилировать модель opt = SGD (lr = 0,001, импульс = 0,9) model.compile(optimizer=opt, loss=’categorical_crossentropy’, metrics=[‘accuracy’])

# скомпилировать модель

opt = SGD(lr=0,001, импульс=0,9)

model.compile(optimizer=opt, loss=’categorical_crossentropy’, metrics=[‘accuracy’])

Теперь у нас достаточно элементов для определения наших базовых моделей в стиле VGG. Мы можем определить три разные архитектуры моделей с 1, 2 и 3 модулями VGG, что требует определения 3 отдельных версий функции define_model() , представленной ниже.

Для тестирования каждой модели необходимо создать новый сценарий (например, model_baseline1.py , model_baseline2.py , …) с использованием тестового набора, определенного в предыдущем разделе, и с новой версией define_model() функция определена ниже.

Давайте по очереди рассмотрим каждую функцию define_model() и оценку полученного тестового набора.

Базовый уровень: 1 блок VGG

Функция define_model() для одного блока VGG указана ниже.

# определить модель cnn определить_модель(): модель = Последовательный() model.add(Conv2D(32, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’, input_shape=(32, 32, 3))) model.add (Conv2D (32, (3, 3), активация = ‘relu’, kernel_initializer = ‘he_uniform’, padding = ‘то же’)) model.add(MaxPooling2D((2, 2))) model.add(Свести()) model.add(Dense(128, активация=’relu’, kernel_initializer=’he_uniform’)) model.add (плотный (10, активация = ‘softmax’)) # скомпилировать модель opt = SGD (lr = 0,001, импульс = 0,9) model.compile(optimizer=opt, loss=’categorical_crossentropy’, metrics=[‘accuracy’]) возвратная модель

1

2

3

4

5

6

7

8

10

11

12

13

11111

# определить модель cnn

def define_model():

model = Sequential()

model. add(Conv2D(32, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding= ‘то же самое’, input_shape=(32, 32, 3)))

model.add(Conv2D(32, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’))

model.add(MaxPooling2D((2, 2)))

model.add(Flatten())

model.add(Dense(128, активация=’relu’, kernel_initializer=’he_uniform’))

model.add(Dense(10, активация=’softmax’))

# скомпилировать модель

opt = SGD(lr=0,001, импульс=0,9)

model.compile(optimizer=opt, loss=’categorical_crossentropy’, metrics=[‘accuracy’])

возвратная модель

При запуске модели в тестовом наборе сначала печатается точность классификации в наборе тестовых данных.

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

В этом случае мы видим, что модель достигла точности классификации чуть менее 70%.

> 67.070

> 67.070

Рисунок создается и сохраняется в файл, показывающий кривые обучения модели во время обучения на наборе данных для обучения и тестирования, как в отношении потерь, так и в отношении точности.

В этом случае мы видим, что модель быстро превосходит набор тестовых данных. Это ясно, если мы посмотрим на график потерь (верхний график), мы увидим, что производительность модели в наборе обучающих данных (синий) продолжает улучшаться, тогда как производительность в тестовом наборе данных (оранжевый) улучшается, а затем начинает ухудшаться. около 15 эпох.

Линейные графики кривых обучения для базовой линии VGG 1 в наборе данных CIFAR-10

Базовый уровень: 2 блока VGG

Функция define_model() для двух блоков VGG указана ниже.

# определить модель cnn определить_модель(): модель = Последовательный() model. add(Conv2D(32, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’, input_shape=(32, 32, 3))) model.add (Conv2D (32, (3, 3), активация = ‘relu’, kernel_initializer = ‘he_uniform’, padding = ‘то же’)) model.add(MaxPooling2D((2, 2))) model.add (Conv2D (64, (3, 3), активация = ‘relu’, kernel_initializer = ‘he_uniform’, padding = ‘то же’)) model.add (Conv2D (64, (3, 3), активация = ‘relu’, kernel_initializer = ‘he_uniform’, padding = ‘то же’)) model.add(MaxPooling2D((2, 2))) model.add(Свести()) model.add(Dense(128, активация=’relu’, kernel_initializer=’he_uniform’)) model.add (плотный (10, активация = ‘softmax’)) # скомпилировать модель opt = SGD (lr = 0,001, импульс = 0,9) model.compile(optimizer=opt, loss=’categorical_crossentropy’, metrics=[‘accuracy’]) возвратная модель

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

# определить модель cnn

def define_model():

model = Sequential()

model. add(Conv2D(32, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’, input_shape=(32, 32, 3)))

model.add (Conv2D(32, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’))

model.add(MaxPooling2D((2, 2)))

model.add (Conv2D (64, (3, 3), активация = ‘relu’, kernel_initializer = ‘he_uniform’, padding = ‘то же’))

model.add (Conv2D (64, (3, 3), активация = ‘relu ‘, kernel_initializer=’he_uniform’, padding=’такой же’))

model.add(MaxPooling2D((2, 2)))

model.add(Flatten())

model.add(Dense(128, активация=’relu’, kernel_initializer=’he_uniform’))

model.add(Dense(10, активация=’softmax’))

# скомпилировать модель

opt = SGD(lr=0.001, импульс=0.9)

model.compile(optimizer=opt, loss=’categorical_crossentropy’, metrics=[‘accuracy’])

модель возврата

При запуске модели в тестовом наборе сначала печатается точность классификации в наборе тестовых данных.

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

В этом случае мы видим, что модель с двумя блоками работает лучше, чем модель с одним блоком: хороший знак.

> 71.080

> 71.080

Рисунок, показывающий кривые обучения, создан и сохранен в файл. В этом случае мы продолжаем наблюдать сильное переобучение.

Линейные графики кривых обучения для базовой линии VGG 2 в наборе данных CIFAR-10

Базовый уровень: 3 блока VGG

Функция define_model() для трех блоков VGG указана ниже.

# определить модель cnn определить_модель(): модель = Последовательный() model.add(Conv2D(32, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’, input_shape=(32, 32, 3))) model. add (Conv2D (32, (3, 3), активация = ‘relu’, kernel_initializer = ‘he_uniform’, padding = ‘то же’)) model.add(MaxPooling2D((2, 2))) model.add (Conv2D (64, (3, 3), активация = ‘relu’, kernel_initializer = ‘he_uniform’, padding = ‘то же’)) model.add (Conv2D (64, (3, 3), активация = ‘relu’, kernel_initializer = ‘he_uniform’, padding = ‘то же’)) model.add(MaxPooling2D((2, 2))) model.add (Conv2D (128, (3, 3), активация = ‘relu’, kernel_initializer = ‘he_uniform’, padding = ‘то же’)) model.add (Conv2D (128, (3, 3), активация = ‘relu’, kernel_initializer = ‘he_uniform’, padding = ‘то же’)) model.add(MaxPooling2D((2, 2))) model.add(Свести()) model.add(Dense(128, активация=’relu’, kernel_initializer=’he_uniform’)) model.add (плотный (10, активация = ‘softmax’)) # скомпилировать модель opt = SGD (lr = 0,001, импульс = 0,9) model.compile(optimizer=opt, loss=’categorical_crossentropy’, metrics=[‘accuracy’]) возвратная модель

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

# определить модель cnn

def define_model():

модель = Sequential()

model. add(Conv2D(32, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’, input_shape=(32, 32, 3) ))

model.add(Conv2D(32, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’))

model.add(MaxPooling2D((2, 2) ))

model.add(Conv2D(64, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’))

model.add(Conv2D(64, (3, 3), активация = ‘relu’, kernel_initializer = ‘he_uniform’, padding = ‘то же’))

model.add(MaxPooling2D((2, 2)))

model.add(Conv2D(128, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’))

model.add(Conv2D(128, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’))

model.add(MaxPooling2D((2, 2)))

model.add(Flatten())

model.add(Dense(128, активация=’relu’, kernel_initializer=’he_uniform’))

model.add(Dense(10, активация=’softmax’))

# скомпилировать модель

opt = SGD(lr=0,001, импульс=0,9)

model. compile(optimizer=opt, loss=’categorical_crossentropy’, metrics=[‘accuracy’])

модель возврата

При запуске модели в тестовом наборе сначала печатается точность классификации в наборе тестовых данных.

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

В этом случае наблюдается еще одно небольшое увеличение производительности по мере увеличения глубины модели.

> 73 500

> 73.500

Рассматривая рисунки, показывающие кривые обучения, мы снова видим резкое переоснащение в течение первых 20 периодов обучения.

Линейные графики кривых обучения для базовой линии VGG 3 в наборе данных CIFAR-10

Обсуждение

Мы рассмотрели три разные модели с архитектурой на основе VGG.

Результаты можно обобщить ниже, хотя мы должны допустить некоторые различия в этих результатах, учитывая стохастический характер алгоритма:

  • ВГГ 1 : 67,070%
  • ВГГ 2 : 71,080%
  • ВГГ 3 : 73,500%

Во всех случаях модель смогла обучить набор данных для обучения, показав улучшение набора данных для обучения, которое продолжалось как минимум до 40 эпох, а возможно, и больше. Это хороший знак, так как он показывает, что проблема поддается изучению и что все три модели обладают достаточными возможностями для изучения проблемы.

Результаты модели на тестовом наборе данных показали улучшение точности классификации с каждым увеличением глубины модели. Вполне возможно, что эта тенденция сохранится, если будут оцениваться модели с четырьмя и пятью слоями, и это могло бы стать интересным расширением. Тем не менее, все три модели показали одну и ту же картину резкого переобучения примерно на 15-20 эпохах.

Эти результаты показывают, что модель с тремя блоками VGG является хорошей отправной точкой или базовой моделью для нашего исследования.

Результаты также свидетельствуют о том, что модель нуждается в регуляризации для решения проблемы быстрого переобучения тестового набора данных. В более общем плане результаты показывают, что может быть полезно исследовать методы, которые замедляют сходимость (скорость обучения) модели. Это может включать в себя такие методы, как увеличение данных, а также графики скорости обучения, изменения размера пакета и, возможно, многое другое.

В следующем разделе мы рассмотрим некоторые из этих идей по улучшению производительности модели.

Как разработать улучшенную модель

Теперь, когда мы установили базовую модель, архитектуру VGG с тремя блоками, мы можем исследовать модификации модели и алгоритма обучения, направленные на повышение производительности.

Сначала мы рассмотрим две основные области, чтобы устранить наблюдаемую серьезную переобучение, а именно регуляризацию и увеличение данных.

Методы регуляризации

Есть много методов регуляризации, которые мы могли бы попробовать, хотя природа наблюдаемого переобучения предполагает, что, возможно, раннее прекращение нецелесообразно и что методы, замедляющие скорость сходимости, могут оказаться полезными.

Мы изучим эффект как отсева, так и регуляризации или снижения веса.

Регуляризация отсева

Dropout — это простой метод, при котором узлы случайным образом удаляются из сети. Это оказывает регулирующий эффект, поскольку оставшиеся узлы должны адаптироваться, чтобы компенсировать провисание удаленных узлов.

Подробнее об отсеве читайте в посте:

  • Нежное введение в Dropout для регуляризации глубоких нейронных сетей

Dropout можно добавить в модель путем добавления новых слоев Dropout, где в качестве параметра указывается количество удаляемых узлов. Существует множество шаблонов добавления Dropout в модель с точки зрения того, где в модели добавлять слои и сколько использовать Dropout.

В этом случае мы добавим слои отсева после каждого слоя с максимальным объединением и после слоя с полным подключением и используем фиксированную скорость отсева 20% (например, сохраняем 80% узлов).

Обновленная базовая модель VGG 3 с отсевом указана ниже.

# определить модель cnn определить_модель(): модель = Последовательный() model.add(Conv2D(32, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’, input_shape=(32, 32, 3))) model.add (Conv2D (32, (3, 3), активация = ‘relu’, kernel_initializer = ‘he_uniform’, padding = ‘то же’)) model.add(MaxPooling2D((2, 2))) model.add (Выпадение (0,2)) model.add (Conv2D (64, (3, 3), активация = ‘relu’, kernel_initializer = ‘he_uniform’, padding = ‘то же’)) model.add (Conv2D (64, (3, 3), активация = ‘relu’, kernel_initializer = ‘he_uniform’, padding = ‘то же’)) model.add(MaxPooling2D((2, 2))) model.add (Выпадение (0,2)) model.add (Conv2D (128, (3, 3), активация = ‘relu’, kernel_initializer = ‘he_uniform’, padding = ‘то же’)) model. add (Conv2D (128, (3, 3), активация = ‘relu’, kernel_initializer = ‘he_uniform’, padding = ‘то же’)) model.add(MaxPooling2D((2, 2))) model.add (Выпадение (0,2)) model.add(Свести()) model.add(Dense(128, активация=’relu’, kernel_initializer=’he_uniform’)) model.add (Выпадение (0,2)) model.add (плотный (10, активация = ‘softmax’)) # скомпилировать модель opt = SGD (lr = 0,001, импульс = 0,9) model.compile(optimizer=opt, loss=’categorical_crossentropy’, metrics=[‘accuracy’]) возвратная модель

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

# определить модель cnn

def define_model():

model = Sequential()

model.add(Conv2D(32, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding= ‘такой же’, input_shape=(32, 32, 3)))

model. add(Conv2D(32, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’тот же’))

model.add(MaxPooling2D((2, 2)))

model.add(Dropout(0.2))

model.add(Conv2D(64, (3, 3), активация=’relu’, kernel_initializer= ‘he_uniform’, padding=’такой же’))

model.add(Conv2D(64, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’))

model.add(MaxPooling2D((2, 2)))

model.add(Dropout(0.2))

model.add(Conv2D(128, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’))

модель. add(Conv2D(128, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’))

model.add(MaxPooling2D((2, 2)))

модель. добавить (выпадение (0,2))

model.add(Flatten())

model.add(Dense(128, активация=’relu’, kernel_initializer=’he_uniform’))

model.add(Dropout(0.2))

model.add(Dense (10, активация=’softmax’))

# скомпилировать модель

opt = SGD(lr=0. 001, импульс=0.9)

model.compile(optimizer=opt, loss=’categorical_crossentropy’, metrics=[‘accuracy ‘])

возвратная модель

Полный список кодов приведен ниже для полноты картины.

# базовая модель с отсевом в наборе данных cifar10 импорт системы из matplotlib импортировать pyplot из keras.datasets импортировать cifar10 из keras.utils импортировать в_categorical из keras.models импорт последовательный из keras.layers импортировать Conv2D из keras.layers импортировать MaxPooling2D из keras.layers импорт плотный из keras.layers импортировать Flatten из keras.layers импортировать Dropout из keras.optimizers импорт SGD # загрузить поезд и протестировать набор данных деф load_dataset(): # загрузить набор данных (trainX, trainY), (testX, testY) = cifar10.load_data() # одно горячее кодирование целевых значений trainY = to_categorical(trainY) testY = to_categorical (testY) вернуть поезд X, поезд Y, тест X, тест Y # масштаб пикселей def prep_pixels (поезд, тест): # преобразовать целые числа в числа с плавающей запятой train_norm = train. astype(‘float32’) test_norm = test.astype(‘float32′) # нормализовать до диапазона 0-1 поезд_норма = поезд_норма / 255,0 тестовая_норма = тестовая_норма / 255,0 # вернуть нормализованные изображения вернуть train_norm, test_norm # определить модель cnn определить_модель(): модель = Последовательный() model.add(Conv2D(32, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’, input_shape=(32, 32, 3))) model.add (Conv2D (32, (3, 3), активация = ‘relu’, kernel_initializer = ‘he_uniform’, padding = ‘то же’)) model.add(MaxPooling2D((2, 2))) model.add (Выпадение (0,2)) model.add (Conv2D (64, (3, 3), активация = ‘relu’, kernel_initializer = ‘he_uniform’, padding = ‘то же’)) model.add (Conv2D (64, (3, 3), активация = ‘relu’, kernel_initializer = ‘he_uniform’, padding = ‘то же’)) model.add(MaxPooling2D((2, 2))) model.add (Выпадение (0,2)) model.add (Conv2D (128, (3, 3), активация = ‘relu’, kernel_initializer = ‘he_uniform’, padding = ‘то же’)) model.add (Conv2D (128, (3, 3), активация = ‘relu’, kernel_initializer = ‘he_uniform’, padding = ‘то же’)) model. add(MaxPooling2D((2, 2))) model.add (Выпадение (0,2)) model.add(Свести()) model.add(Dense(128, активация=’relu’, kernel_initializer=’he_uniform’)) model.add (Выпадение (0,2)) model.add (плотный (10, активация = ‘softmax’)) # скомпилировать модель opt = SGD (lr = 0,001, импульс = 0,9) model.compile(optimizer=opt, loss=’categorical_crossentropy’, metrics=[‘accuracy’]) модель возврата # построение диагностических кривых обучения defsummary_diagnostics(история): # сюжетная потеря pyplot.subplot(211) pyplot.title(‘Перекрестная потеря энтропии’) pyplot.plot(history.history[‘потеря’], цвет=’синий’, метка=’поезд’) pyplot.plot(history.history[‘val_loss’], color=’orange’, label=’test’) # точность сюжета pyplot.subplot(212) pyplot.title(‘Точность классификации’) pyplot.plot(history.history[‘точность’], color=’blue’, label=’train’) pyplot.plot(history.history[‘val_accuracy’], color=’оранжевый’, label=’test’) # сохранить график в файл имя файла = sys.argv[0].split(‘/’)[-1] pyplot. savefig (имя файла + ‘_plot.png’) pyplot.close() # запустить тестовую обвязку для оценки модели защита run_test_harness(): # загрузить набор данных trainX, trainY, testX, testY = load_dataset() # подготовить пиксельные данные TrainX, testX = prep_pixels (trainX, testX) # определить модель модель = определить_модель() # подходящая модель history = model.fit(trainX, trainY, epochs=100, batch_size=64, validation_data=(testX, testY), verbose=0) # оценить модель _, acc = model.evaluate (testX, testY, подробный = 0) напечатать(‘> %.3f’ % (акк * 100.0)) # кривые обучения summary_diagnostics(история) # точка входа, запускаем тестовую обвязку run_test_harness()

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

0010 31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

# Базовая модель с выбросом на наборе данных CIFAR10

ИМПОРТА

От Matplotlib Import Pyplot

от Keras. Datasets Import Cifar10

из Keras.utils Importaint To_categorical

от Keras.Models. слои импортировать Conv2D

из keras.layers импортировать MaxPooling2D

из keras.layers импортировать Dense

из keras.layers импортировать Flatten

из keras.layers импортировать Dropout

from keras.optimizers import SGD

 

# загрузить поезд и набор тестовых данных

def load_dataset():

# загрузить набор данных

(trainX, trainY), (testX, testY) = cifar10.0_data

# одно целевое значение горячего кодирования

# преобразовать целые числа в числа с плавающей запятой

train_norm = train.astype(‘float32’)

test_norm = test.astype(‘float32’)

# нормализовать до диапазона 0-1

train_norm = train_norm / 255.01 test_norm = test_norm / 255.0

# вернуть нормализованные изображения

return train_norm, test_norm

 

# определить модель cnn

def define_model():

model = Sequential(dv()

2. model 90 , 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’, input_shape=(32, 32, 3)))

model.add(Conv2D(32, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’))

model.add(MaxPooling2D((2, 2)))

model.add(Dropout(0.2))

model.add(Conv2D(64, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’))

модель. add(Conv2D(64, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’))

model.add(MaxPooling2D((2, 2)))

модель. добавить (выпадение (0,2))

model.add(Conv2D(128, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’))

model.add(Conv2D(128, (3, 3), активация = ‘relu’, kernel_initializer = ‘he_uniform’, padding = ‘same’))

model.add (MaxPooling2D ((2, 2)))

model.add (Dropout (0.2))

model.add (Flatten())

model.add(Dense(128, активация=’relu’, kernel_initializer=’he_uniform’))

model. add(Dropout(0.2))

model.add(Dense(10, активация) =’софтмакс’))

# модель компиляции

opt = SGD(lr=0,001, импульс=0,9)

model.compile(optimizer=opt, loss=’categorical_crossentropy’, metrics=[‘accuracy’])

модель возврата

1    

# построение диагностических кривых обучения

def summum_diagnostics(history):

# построение графика потерь

pyplot.subplot(211)

pyplot.title(‘Cross Entropy Loss’)

pyplot.history[story[story.history потеря’], цвет=’синий’, метка=’поезд’)

pyplot.plot(history.history[‘val_loss’], color=’orange’, label=’test’)

# точность графика

pyplot.subplot(212)

pyplot.title(‘Точность классификации’)

pyplot.plot(history.history[‘accuracy’], color=’blue’, label=’train’)

pyplot.plot(history.history[‘val_accuracy’], color=’orange’, label= ‘test’)

# сохранить график в файл

filename = sys.argv[0].split(‘/’)[-1]

pyplot. savefig(filename + ‘_plot.png’)

pyplot.close()

 

# запустить тестовую программу для оценки модели

def run_test_harness():

# загрузить набор данных

trainX, trainY, testX, testY = load_dataset()

# подготовить данные пикселей

trainX, testX = prep_pixels(trainX, testX)

# определение модели

model = define_model()

# подгонка модели

history = model.fit(trainX, trainY, epochs=100, batch_size=64, validation_data =(тестX, тестY), подробно=0)

# оценить модель

_, acc = model.evaluate(testX, testY, verbose=0)

print(‘> %.3f’ % (acc * 100.0))

# кривые обучения

summary_diagnostics(history )

 

# точка входа, запуск тестовой системы

run_test_harness()

Запуск модели в тестовом наборе данных распечатывает точность классификации в тестовом наборе данных.

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

В этом случае мы можем увидеть скачок точности классификации примерно на 10% с примерно 73% без выпадения до примерно 83% с выпадением.

> 83.450

> 83.450

Рассматривая кривую обучения модели, мы видим, что проблема переобучения была решена. Модель хорошо сходится в течение примерно 40 или 50 эпох, после чего дальнейшее улучшение набора тестовых данных не происходит.

Отличный результат. Мы могли бы развить эту модель и добавить раннюю остановку с терпением около 10 эпох, чтобы сохранить хорошо работающую модель на тестовом наборе во время обучения примерно в тот момент, когда не наблюдается никаких дальнейших улучшений.

Мы также могли бы попробовать изучить график скорости обучения, при котором скорость обучения падает после того, как улучшения на тестовом наборе останавливаются.

Отсев показал хорошие результаты, и мы не знаем, является ли выбранный коэффициент 20% лучшим. Мы могли бы изучить другие показатели отсева, а также различное расположение слоев отсева в архитектуре модели.

Линейные графики кривых обучения для базовой модели с отсевом в наборе данных CIFAR-10

Снижение веса

Регулировка веса или уменьшение веса включает в себя обновление функции потерь, чтобы оштрафовать модель пропорционально размеру весов модели.

Это имеет регуляризирующий эффект, поскольку большие веса приводят к более сложной и менее стабильной модели, тогда как меньшие веса часто более стабильны и более универсальны.

Чтобы узнать больше о регуляризации веса, см. пост:

  • Использование регуляризации веса для уменьшения переобучения моделей глубокого обучения

Мы можем добавить регуляризацию весов в сверточные слои и полносвязные слои, определив аргумент « kernel_regularizer » и указав тип регуляризации. В этом случае мы будем использовать регуляризацию веса L2 , наиболее распространенный тип, используемый для нейронных сетей, и разумный вес по умолчанию 0,001.

Обновленная базовая модель с уменьшением веса приведена ниже.

# определить модель cnn определить_модель(): модель = Последовательный() model.add(Conv2D(32, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’, kernel_regularizer=l2(0.001), input_shape=(32, 32, 3))) model.add(Conv2D(32, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’, kernel_regularizer=l2(0.001))) model.add(MaxPooling2D((2, 2))) model.add(Conv2D(64, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’, kernel_regularizer=l2(0.001))) model.add(Conv2D(64, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’, kernel_regularizer=l2(0.001))) model.add(MaxPooling2D((2, 2))) model.add(Conv2D(128, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’, kernel_regularizer=l2(0.001))) model.add(Conv2D(128, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’, kernel_regularizer=l2(0. 001))) model.add(MaxPooling2D((2, 2))) model.add(Свести()) model.add(Dense(128, активация=’relu’, kernel_initializer=’he_uniform’, kernel_regularizer=l2(0.001))) model.add (плотный (10, активация = ‘softmax’)) # скомпилировать модель opt = SGD (lr = 0,001, импульс = 0,9) model.compile(optimizer=opt, loss=’categorical_crossentropy’, metrics=[‘accuracy’]) возвратная модель

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

# определить модель cnn

def define_model():

модель = Sequential()

model.add(Conv2D(32, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’, kernel_regularizer=l2(0.001), input_shape= (32, 32, 3)))

model.add(Conv2D(32, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’, kernel_regularizer=l2(0. 001)) )

model.add(MaxPooling2D((2, 2)))

model.add(Conv2D(64, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’, kernel_regularizer=l2(0,001)))

model.add(Conv2D(64, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’, kernel_regularizer=l2(0.001)))

model.add(MaxPooling2D( (2, 2)))

model.add(Conv2D(128, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’, kernel_regularizer=l2(0.001)))

model.add(Conv2D(128, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’, kernel_regularizer=l2(0.001)))

model.add(MaxPooling2D(( 2, 2)))

model.add(Flatten())

model.add(Dense(128, активация=’relu’, kernel_initializer=’he_uniform’, kernel_regularizer=l2(0.001)))

model.add(Dense(10, активации=’softmax’))

# скомпилировать модель

opt = SGD(lr=0.001, импульс=0.9)

model.compile(optimizer=opt, loss=’categorical_crossentropy’, metrics=[‘accuracy’])

возвратная модель

Полный список кодов приведен ниже для полноты картины.

# базовая модель с уменьшением веса на наборе данных cifar10 импорт системы из matplotlib импортировать pyplot из keras.datasets импортировать cifar10 из keras.utils импортировать в_categorical из keras.models импорт последовательный из keras.layers импортировать Conv2D из keras.layers импортировать MaxPooling2D из keras.layers импорт плотный из keras.layers импортировать Flatten из keras.optimizers импорт SGD из keras.regularizers импорт l2 # загрузить поезд и протестировать набор данных деф load_dataset(): # загрузить набор данных (trainX, trainY), (testX, testY) = cifar10.load_data() # одно горячее кодирование целевых значений trainY = to_categorical(trainY) testY = to_categorical (testY) вернуть поезд X, поезд Y, тест X, тест Y # масштаб пикселей def prep_pixels (поезд, тест): # преобразовать целые числа в числа с плавающей запятой train_norm = train.astype(‘float32’) test_norm = test.astype(‘float32’) # нормализовать до диапазона 0-1 поезд_норма = поезд_норма / 255,0 тестовая_норма = тестовая_норма / 255,0 # вернуть нормализованные изображения вернуть train_norm, test_norm # определить модель cnn определить_модель(): модель = Последовательный() model. add(Conv2D(32, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’, kernel_regularizer=l2(0.001), input_shape=(32, 32, 3))) model.add(Conv2D(32, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’, kernel_regularizer=l2(0.001))) model.add(MaxPooling2D((2, 2))) model.add(Conv2D(64, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’, kernel_regularizer=l2(0.001))) model.add(Conv2D(64, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’, kernel_regularizer=l2(0.001))) model.add(MaxPooling2D((2, 2))) model.add(Conv2D(128, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’, kernel_regularizer=l2(0.001))) model.add(Conv2D(128, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’, kernel_regularizer=l2(0.001))) model.add(MaxPooling2D((2, 2))) model.add(Свести()) model.add(Dense(128, активация=’relu’, kernel_initializer=’he_uniform’, kernel_regularizer=l2(0. 001))) model.add (плотный (10, активация = ‘softmax’)) # скомпилировать модель opt = SGD (lr = 0,001, импульс = 0,9) model.compile(optimizer=opt, loss=’categorical_crossentropy’, metrics=[‘accuracy’]) модель возврата # построение диагностических кривых обучения defsummary_diagnostics(история): # сюжетная потеря pyplot.subplot(211) pyplot.title(‘Перекрестная потеря энтропии’) pyplot.plot(history.history[‘потеря’], цвет=’синий’, метка=’поезд’) pyplot.plot(history.history[‘val_loss’], color=’orange’, label=’test’) # точность сюжета pyplot.subplot(212) pyplot.title(‘Точность классификации’) pyplot.plot(history.history[‘точность’], color=’blue’, label=’train’) pyplot.plot(history.history[‘val_accuracy’], color=’оранжевый’, label=’test’) # сохранить график в файл имя файла = sys.argv[0].split(‘/’)[-1] pyplot.savefig (имя файла + ‘_plot.png’) pyplot.close() # запустить тестовую обвязку для оценки модели защита run_test_harness(): # загрузить набор данных trainX, trainY, testX, testY = load_dataset() # подготовить пиксельные данные TrainX, testX = prep_pixels (trainX, testX) # определить модель модель = определить_модель() # подходящая модель history = model. fit(trainX, trainY, epochs=100, batch_size=64, validation_data=(testX, testY), verbose=0) # оценить модель _, acc = model.evaluate (testX, testY, подробный = 0) напечатать(‘> %.3f’ % (акк * 100.0)) # кривые обучения summary_diagnostics(история) # точка входа, запускаем тестовую обвязку run_test_harness()

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

0010 31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

80 10 80010 117

# базовая модель с уменьшением веса на наборе данных cifar10

Import Sys

от Matplotlib Import Pyplot

от Keras. Datasets Import Cifar10

от Keras.Utils Import To_categorical

от Keras.Models Importement

от Keras.Layers Import1111111111111111111111111111111111111111111 годы.

из keras.layers import Dense

из keras.layers import Flatten

из keras.optimizers import SGD

из keras.regularizers import l2

 

# загрузить поезд и тестовый набор данных

def load_dataset():

# загрузить набор данных

(trainX, trainY), (testX, testY) = cifar10.load_data()

# одно горячее кодирование целевых значений

1

1

1

1 trainY = to_categorical(trainY)

testY = to_categorical(testY)

return trainX, trainY, testX, testY

 

# масштаб пикселей

def prep_pixels(train, test):

# преобразование из целого числа

train_norm = train.astype(‘float32’)

test_norm = test.astype(‘float32’)

# нормализовать до диапазона 0-1 нормализованные изображения

return train_norm, test_norm

 

# определить модель cnn

def define_model():

model = Sequential()

model. add(Conv2D(32, (3, 3), активация=’relu ‘, kernel_initializer=’he_uniform’, padding=’same’, kernel_regularizer=l2(0.001), input_shape=(32, 32, 3)))

model.add(Conv2D(32, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’, kernel_regularizer=l2(0.001)))

model.add(MaxPooling2D( (2, 2)))

model.add(Conv2D(64, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’, kernel_regularizer=l2(0.001)))

model.add(Conv2D(64, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’, kernel_regularizer=l2(0.001)))

model.add(MaxPooling2D(( 2, 2)))

model.add(Conv2D(128, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’, kernel_regularizer=l2(0.001)))

model.add(Conv2D( 128, (3, 3)

model.add(Flatten())

model.add(Dense(128, активация=’relu’, kernel_initializer=’he_uniform’, kernel_regularizer=l2(0.001)))

model.add(Dense(10, активация =’софтмакс’))

# модель компиляции

opt = SGD(lr=0,001, импульс=0,9)

model. compile(optimizer=opt, loss=’categorical_crossentropy’, metrics=[‘accuracy’])

модель возврата

1    

# построение диагностических кривых обучения

def summum_diagnostics(history):

# построение графика потерь

pyplot.subplot(211)

pyplot.title(‘Cross Entropy Loss’)

pyplot.history[story[story.history потеря’], цвет=’синий’, метка=’поезд’)

pyplot.plot(history.history[‘val_loss’], color=’orange’, label=’test’)

# точность графика

pyplot.subplot(212)

pyplot.title(‘Точность классификации’)

pyplot.plot(history.history[‘accuracy’], color=’blue’, label=’train’)

pyplot.plot(history.history[‘val_accuracy’], color=’orange’, label= ‘test’)

# сохранить график в файл

filename = sys.argv[0].split(‘/’)[-1]

pyplot.savefig(filename + ‘_plot.png’)

pyplot.close()

 

# запустить тестовую программу для оценки модели

def run_test_harness():

# загрузить набор данных

trainX, trainY, testX, testY = load_dataset()

# подготовить данные пикселей

trainX, testX = prep_pixels(trainX, testX)

# определение модели

model = define_model()

# подгонка модели

history = model. fit(trainX, trainY, epochs=100, batch_size=64, validation_data =(тестX, тестY), подробно=0)

# оценить модель

_, acc = model.evaluate(testX, testY, verbose=0)

print(‘> %.3f’ % (acc * 100.0))

# кривые обучения

summary_diagnostics(history )

 

# точка входа, запуск тестовой системы

run_test_harness()

Запуск модели в тестовом наборе распечатывает точность классификации тестового набора данных.

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

В этом случае мы не видим улучшения производительности модели на тестовом наборе; на самом деле мы видим небольшое падение производительности примерно с 73% до примерно 72% точности классификации.

> 72.550

> 72,550

Рассматривая кривые обучения, мы видим небольшое снижение переобучения, но это влияние не так эффективно, как отсев.

Мы могли бы улучшить эффект уменьшения веса, возможно, используя большее значение веса, например, 0,01 или даже 0,1.

Линейные графики кривых обучения для базовой модели с уменьшением веса в наборе данных CIFAR-10

Увеличение данных

Расширение данных включает в себя создание копий примеров из обучающего набора данных с небольшими случайными изменениями.

Это имеет регуляризующий эффект, поскольку расширяет набор обучающих данных и позволяет модели изучать те же самые общие функции, хотя и в более обобщенном виде.

Существует много типов увеличения данных, которые можно применить. Учитывая, что набор данных состоит из небольших фотографий объектов, мы не хотим использовать аугментацию, которая слишком сильно искажает изображения, чтобы можно было сохранить и использовать полезные функции изображений.

Типы случайных дополнений, которые могут быть полезны, включают горизонтальное отражение, незначительные сдвиги изображения и, возможно, небольшое увеличение или обрезку изображения.

Мы исследуем влияние простого увеличения на базовое изображение, в частности, горизонтальные перевороты и 10-процентные сдвиги по высоте и ширине изображения.

Это можно реализовать в Keras с помощью класса ImageDataGenerator; например:

# создаем генератор данных datagen = ImageDataGenerator (width_shift_range = 0,1, height_shift_range = 0,1, horizontal_flip = True) # подготовить итератор it_train = datagen.flow(trainX, trainY, batch_size=64)

# создать генератор данных

datagen = ImageDataGenerator(width_shift_range=0.1, height_shift_range=0.1, horizontal_flip=True)

# подготовить итератор

it_train = datagen.flow(trainX, trainY, batch_size=64)

1

1

Это можно использовать во время обучения, передав итератор функции model.fit_generator() и определив количество пакетов в одной эпохе.

# подходящая модель шаги = int(trainX.shape[0]/64) history = model. fit_generator(it_train, steps_per_epoch=шаги, эпохи=100, validation_data=(testX, testY), подробный=0)

# подходящая модель

шагов = int(trainX.shape[0] / 64)

history = model.fit_generator(it_train, steps_per_epoch=steps, epochs=100, validation_data=(testX, testY), verbose=0)

Никаких изменений в модели не требуется.

Обновленная версия функции run_test_harness() для поддержки увеличения данных указана ниже.

# запустить тестовую обвязку для оценки модели защита run_test_harness(): # загрузить набор данных trainX, trainY, testX, testY = load_dataset() # подготовить пиксельные данные TrainX, testX = prep_pixels (trainX, testX) # определить модель модель = определить_модель() # создаем генератор данных datagen = ImageDataGenerator (width_shift_range = 0,1, height_shift_range = 0,1, horizontal_flip = True) # подготовить итератор it_train = datagen.flow (trainX, trainY, batch_size = 64) # подходящая модель шаги = int(trainX. shape[0]/64) history = model.fit_generator(it_train, steps_per_epoch=шаги, эпохи=100, validation_data=(testX, testY), подробный=0) # оценить модель _, acc = model.evaluate (testX, testY, подробный = 0) напечатать(‘> %.3f’ % (акк * 100.0)) # кривые обучения summary_diagnostics(история)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

# запустить тестовую систему для оценки модели

def run_test_harness():

# загрузить набор данных

trainX, trainY, testX, testY = load_dataset()

# подготовка данных пикселей

trainX, testX = prep_pixels(trainX, testX)

# определение модели

model = define_model()

# создание генератора данных horizontal_flip=True)

# подготовка итератора

it_train = datagen. flow(trainX, trainY, batch_size=64)

# подгонка модели

steps = int(trainX.shape[0] / 64)

history = model .fit_generator(it_train, steps_per_epoch=шаги, эпохи=100, validation_data=(testX, testY), verbose=0)

# оценить модель

_, acc = model.evaluate(testX, testY, verbose=0)

print(‘> %.3f’ % (acc * 100.0))

# кривые обучения

summary_diagnostics(history )

Полный список кодов приведен ниже для полноты картины.

# базовая модель с аугментацией данных на наборе данных cifar10 импорт системы из matplotlib импортировать pyplot из keras.datasets импортировать cifar10 из keras.utils импортировать в_categorical из keras.models импорт последовательный из keras.layers импортировать Conv2D из keras.layers импортировать MaxPooling2D из keras.layers импорт плотный из keras.layers импортировать Flatten из keras.optimizers импорт SGD из keras.preprocessing.image импортировать ImageDataGenerator # загрузить поезд и протестировать набор данных деф load_dataset(): # загрузить набор данных (trainX, trainY), (testX, testY) = cifar10. load_data() # одно горячее кодирование целевых значений trainY = to_categorical(trainY) testY = to_categorical (testY) вернуть поезд X, поезд Y, тест X, тест Y # масштаб пикселей def prep_pixels (поезд, тест): # преобразовать целые числа в числа с плавающей запятой train_norm = train.astype(‘float32’) test_norm = test.astype(‘float32′) # нормализовать до диапазона 0-1 поезд_норма = поезд_норма / 255,0 тестовая_норма = тестовая_норма / 255,0 # вернуть нормализованные изображения вернуть train_norm, test_norm # определить модель cnn определить_модель(): модель = Последовательный() model.add(Conv2D(32, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’, input_shape=(32, 32, 3))) model.add (Conv2D (32, (3, 3), активация = ‘relu’, kernel_initializer = ‘he_uniform’, padding = ‘то же’)) model.add(MaxPooling2D((2, 2))) model.add (Conv2D (64, (3, 3), активация = ‘relu’, kernel_initializer = ‘he_uniform’, padding = ‘то же’)) model.add (Conv2D (64, (3, 3), активация = ‘relu’, kernel_initializer = ‘he_uniform’, padding = ‘то же’)) model. add(MaxPooling2D((2, 2))) model.add (Conv2D (128, (3, 3), активация = ‘relu’, kernel_initializer = ‘he_uniform’, padding = ‘то же’)) model.add (Conv2D (128, (3, 3), активация = ‘relu’, kernel_initializer = ‘he_uniform’, padding = ‘то же’)) model.add(MaxPooling2D((2, 2))) model.add(Свести()) model.add(Dense(128, активация=’relu’, kernel_initializer=’he_uniform’)) model.add (плотный (10, активация = ‘softmax’)) # скомпилировать модель opt = SGD (lr = 0,001, импульс = 0,9) model.compile(optimizer=opt, loss=’categorical_crossentropy’, metrics=[‘accuracy’]) модель возврата # построение диагностических кривых обучения defsummary_diagnostics(история): # сюжетная потеря pyplot.subplot(211) pyplot.title(‘Перекрестная потеря энтропии’) pyplot.plot(history.history[‘потеря’], цвет=’синий’, метка=’поезд’) pyplot.plot(history.history[‘val_loss’], color=’orange’, label=’test’) # точность сюжета pyplot.subplot(212) pyplot.title(‘Точность классификации’) pyplot.plot(history.history[‘точность’], color=’blue’, label=’train’) pyplot. plot(history.history[‘val_accuracy’], color=’оранжевый’, label=’test’) # сохранить график в файл имя файла = sys.argv[0].split(‘/’)[-1] pyplot.savefig (имя файла + ‘_plot.png’) pyplot.close() # запустить тестовую обвязку для оценки модели защита run_test_harness(): # загрузить набор данных trainX, trainY, testX, testY = load_dataset() # подготовить пиксельные данные TrainX, testX = prep_pixels (trainX, testX) # определить модель модель = определить_модель() # создаем генератор данных datagen = ImageDataGenerator (width_shift_range = 0,1, height_shift_range = 0,1, horizontal_flip = True) # подготовить итератор it_train = datagen.flow (trainX, trainY, batch_size = 64) # подходящая модель шаги = int(trainX.shape[0]/64) history = model.fit_generator(it_train, steps_per_epoch=шаги, эпохи=100, validation_data=(testX, testY), подробный=0) # оценить модель _, acc = model.evaluate (testX, testY, подробный = 0) напечатать(‘> %.3f’ % (акк * 100.0)) # кривые обучения summary_diagnostics(история) # точка входа, запускаем тестовую обвязку run_test_harness()

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

0010 31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

# Базовая модель с увеличением данных в наборе данных CIFAR10

Import Sys

от Matplotlib Import Pyplot

от Keras. Datasets Import Cifar10

из Keras.Utils Import To_Categorical

от KERAS.Models. .layers import Conv2D

из keras.layers import MaxPooling2D

из keras.layers import Dense

из keras.layers import Flatten

из keras.optimizers import SGD

from keras.preprocessing.image import ImageDataGenerator

 

# загрузить поезд и набор тестовых данных

def load_dataset():

# загрузить набор данных

(trainX, trainY), (testX, testY) = cifar1 )

# одно целевое значение горячего кодирования

trainY = to_categorical(trainY)

testY = to_categorical(testY)

return trainX, trainY, testX, testY

 

# масштабные пиксели

):

# преобразовать целые числа в числа с плавающей запятой

train_norm = train.astype(‘float32’)

test_norm = test.astype(‘float32’)

# нормализовать до диапазона 0-1

train_norm = train_norm /

9001.0 test_norm = test_norm / 255. 0

# вернуть нормализованные изображения

return train_norm, test_norm

 

# определить модель cnn

def define_model():

model = Conequential1(ad30.2d,

3, 3), активация = ‘relu’, kernel_initializer = ‘he_uniform’, padding = ‘то же’, input_shape = (32, 32, 3)))

model.add(Conv2D(32, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’))

model.add(MaxPooling2D((2, 2)))

model.add(Conv2D(64, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’))

model.add(Conv2D(64, (3, 3) , активация = ‘relu’, kernel_initializer = ‘he_uniform’, padding = ‘то же’))

model.add(MaxPooling2D((2, 2)))

model.add(Conv2D(128, (3, 3) , активация = ‘relu’, kernel_initializer = ‘he_uniform’, padding = ‘то же’))

model.add(Conv2D(128, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’))

model.add(MaxPooling2D((2, 2)))

model.add(Flatten())

model. add(Dense(128, активация=’relu’, kernel_initializer=’he_uniform’))

model.add(Dense(10, активация=’softmax’))

# скомпилировать модель

opt = SGD(lr=0,001, импульс=0,9)

model.compile(optimizer=opt, loss=’categorical_crossentropy’, metrics=[‘accuracy’])

Возвращение модели

# Диагностические кривые обучения. plot(history.history[‘убыток’], color=’blue’, label=’train’)

pyplot.plot(history.history[‘val_loss’], color=’orange’, label=’test’)

# точность графика

pyplot.subplot(212)

pyplot.title(‘Точность классификации’)

pyplot.plot(history.history[‘accuracy’], color=’blue’, label=’train’)

pyplot.plot(history.history[‘val_accuracy’], color=’orange’, label= ‘test’)

# сохранить график в файл

filename = sys.argv[0].split(‘/’)[-1]

pyplot.savefig(filename + ‘_plot.png’)

pyplot. close()

 

# запустить тестовую программу для оценки модели

def run_test_harness():

# загрузить набор данных

trainX, trainY, testX, testY = load_dataset()

# подготовка данных пикселей

trainX, testX = prep_pixels(trainX, testX)

# определение модели

model = define_model()

# создание генератора данных horizontal_flip=True)

# подготовка итератора

it_train = datagen. flow(trainX, trainY, batch_size=64)

# подгонка модели

steps = int(trainX.shape[0] / 64)

history = model .fit_generator(it_train, steps_per_epoch=шаги, эпохи=100, validation_data=(testX, testY), verbose=0)

# оценить модель

_, acc = model.evaluate(testX, testY, verbose=0)

print(‘> %.3f’ % (acc * 100.0))

# кривые обучения

summary_diagnostics(history )

 

# точка входа, запуск тестовой системы

run_test_harness()

Запуск модели в тестовом наборе данных распечатывает точность классификации в тестовом наборе данных.

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

В этом случае мы видим еще одно значительное улучшение производительности модели, очень похожее на отсев. В этом случае улучшение примерно на 11% с примерно 73% для базовой модели до примерно 84%.

> 84.470

> 84.470

Рассматривая кривые обучения, мы видим такое же улучшение производительности модели, как и при отсеве, хотя график потерь предполагает, что производительность модели на тестовом наборе могла остановиться немного раньше, чем при отсеве.

Результаты показывают, что, возможно, конфигурация, в которой используются как отсев, так и дополнение данных, может быть эффективной.

Линейные графики кривых обучения для базовой модели с увеличением данных в наборе данных CIFAR-10

Обсуждение

В этом разделе мы рассмотрели три подхода, предназначенных для замедления сходимости модели.

Сводка результатов представлена ​​ниже:

  • Исходный уровень + отсев : 83,450%
  • Исходный уровень + снижение веса : 72,550%
  • Базовый уровень + увеличение данных : 84,470%

Результаты показывают, что как отсев, так и увеличение данных дают желаемый эффект, а снижение веса, по крайней мере, для выбранной конфигурации, — нет.

Теперь, когда модель хорошо обучается, мы можем искать как улучшения того, что работает, так и комбинации того, что работает.

Как разработать дополнительные улучшения

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

Теперь мы изучим усовершенствования этих методов, чтобы увидеть, сможем ли мы еще больше улучшить производительность модели. В частности, мы рассмотрим вариант регуляризации отсева и сочетание отсева с увеличением данных.

Обучение замедлилось, поэтому мы исследуем увеличение количества периодов обучения, чтобы при необходимости дать модели достаточно места для отображения динамики обучения на кривых обучения.

Вариант регуляризации отсева

Отсев работает очень хорошо, поэтому, возможно, стоит изучить варианты применения отсева к модели.

Одним из вариантов, который может быть интересным, является увеличение количества отсева с 20% до 25% или 30%. Другой вариант, который может быть интересен, — это использование схемы увеличения отсева с 20 % для первого блока, 30 % для второго блока и так далее до 50 % на полносвязном уровне в части модели классификатора.

Этот тип увеличения отсева с глубиной модели является распространенным шаблоном. Он эффективен, поскольку заставляет слои в глубине модели регуляризовать больше, чем слои, расположенные ближе к входным данным.

Базовая модель с отсевом, обновленная для использования шаблона увеличения процента отсева с глубиной модели, определена ниже.

# определить модель cnn определить_модель(): модель = Последовательный() model.add(Conv2D(32, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’, input_shape=(32, 32, 3))) model.add (Conv2D (32, (3, 3), активация = ‘relu’, kernel_initializer = ‘he_uniform’, padding = ‘то же’)) model.add(MaxPooling2D((2, 2))) model.add (Выпадение (0,2)) model.add (Conv2D (64, (3, 3), активация = ‘relu’, kernel_initializer = ‘he_uniform’, padding = ‘то же’)) model. add (Conv2D (64, (3, 3), активация = ‘relu’, kernel_initializer = ‘he_uniform’, padding = ‘то же’)) model.add(MaxPooling2D((2, 2))) model.add (Выпадение (0,3)) model.add (Conv2D (128, (3, 3), активация = ‘relu’, kernel_initializer = ‘he_uniform’, padding = ‘то же’)) model.add (Conv2D (128, (3, 3), активация = ‘relu’, kernel_initializer = ‘he_uniform’, padding = ‘то же’)) model.add(MaxPooling2D((2, 2))) model.add (Выпадение (0,4)) model.add(Свести()) model.add(Dense(128, активация=’relu’, kernel_initializer=’he_uniform’)) model.add (Выпадение (0,5)) model.add (плотный (10, активация = ‘softmax’)) # скомпилировать модель opt = SGD (lr = 0,001, импульс = 0,9) model.compile(optimizer=opt, loss=’categorical_crossentropy’, metrics=[‘accuracy’]) возвратная модель

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

# определить модель cnn

def define_model():

model = Sequential()

model. add(Conv2D(32, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding= ‘такой же’, input_shape=(32, 32, 3)))

model.add(Conv2D(32, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’тот же’))

model.add(MaxPooling2D((2, 2)))

model.add(Dropout(0.2))

model.add(Conv2D(64, (3, 3), активация=’relu’, kernel_initializer= ‘he_uniform’, padding=’такой же’))

model.add(Conv2D(64, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’))

model.add(MaxPooling2D((2, 2)))

model.add(Dropout(0.3))

model.add(Conv2D(128, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’))

модель. add(Conv2D(128, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’))

model.add(MaxPooling2D((2, 2)))

модель. добавить (выпадение (0,4))

model.add(Flatten())

model.add(Dense(128, активация=’relu’, kernel_initializer=’he_uniform’))

model. add(Dropout(0.5))

model.add(Dense (10, активация=’softmax’))

# скомпилировать модель

opt = SGD(lr=0.001, импульс=0.9)

model.compile(optimizer=opt, loss=’categorical_crossentropy’, metrics=[‘accuracy ‘])

возвратная модель

Полный список кодов с этим изменением приведен ниже для полноты картины.

# базовая модель с увеличением отсева в наборе данных cifar10 импорт системы из matplotlib импортировать pyplot из keras.datasets импортировать cifar10 из keras.utils импортировать в_categorical из keras.models импорт последовательный из keras.layers импортировать Conv2D из keras.layers импортировать MaxPooling2D из keras.layers импорт плотный из keras.layers импортировать Flatten из keras.layers импортировать Dropout из keras.optimizers импорт SGD # загрузить поезд и протестировать набор данных деф load_dataset(): # загрузить набор данных (trainX, trainY), (testX, testY) = cifar10.load_data() # одно горячее кодирование целевых значений trainY = to_categorical(trainY) testY = to_categorical (testY) вернуть поезд X, поезд Y, тест X, тест Y # масштаб пикселей def prep_pixels (поезд, тест): # преобразовать целые числа в числа с плавающей запятой train_norm = train. astype(‘float32’) test_norm = test.astype(‘float32′) # нормализовать до диапазона 0-1 поезд_норма = поезд_норма / 255,0 тестовая_норма = тестовая_норма / 255,0 # вернуть нормализованные изображения вернуть train_norm, test_norm # определить модель cnn определить_модель(): модель = Последовательный() model.add(Conv2D(32, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’, input_shape=(32, 32, 3))) model.add (Conv2D (32, (3, 3), активация = ‘relu’, kernel_initializer = ‘he_uniform’, padding = ‘то же’)) model.add(MaxPooling2D((2, 2))) model.add (Выпадение (0,2)) model.add (Conv2D (64, (3, 3), активация = ‘relu’, kernel_initializer = ‘he_uniform’, padding = ‘то же’)) model.add (Conv2D (64, (3, 3), активация = ‘relu’, kernel_initializer = ‘he_uniform’, padding = ‘то же’)) model.add(MaxPooling2D((2, 2))) model.add (Выпадение (0,3)) model.add (Conv2D (128, (3, 3), активация = ‘relu’, kernel_initializer = ‘he_uniform’, padding = ‘то же’)) model.add (Conv2D (128, (3, 3), активация = ‘relu’, kernel_initializer = ‘he_uniform’, padding = ‘то же’)) model. add(MaxPooling2D((2, 2))) model.add (Выпадение (0,4)) model.add(Свести()) model.add(Dense(128, активация=’relu’, kernel_initializer=’he_uniform’)) model.add (Выпадение (0,5)) model.add (плотный (10, активация = ‘softmax’)) # скомпилировать модель opt = SGD (lr = 0,001, импульс = 0,9) model.compile(optimizer=opt, loss=’categorical_crossentropy’, metrics=[‘accuracy’]) модель возврата # построение диагностических кривых обучения defsummary_diagnostics(история): # сюжетная потеря pyplot.subplot(211) pyplot.title(‘Перекрестная потеря энтропии’) pyplot.plot(history.history[‘потеря’], цвет=’синий’, метка=’поезд’) pyplot.plot(history.history[‘val_loss’], color=’orange’, label=’test’) # точность сюжета pyplot.subplot(212) pyplot.title(‘Точность классификации’) pyplot.plot(history.history[‘точность’], color=’blue’, label=’train’) pyplot.plot(history.history[‘val_accuracy’], color=’оранжевый’, label=’test’) # сохранить график в файл имя файла = sys.argv[0].split(‘/’)[-1] pyplot. savefig (имя файла + ‘_plot.png’) pyplot.close() # запустить тестовую обвязку для оценки модели защита run_test_harness(): # загрузить набор данных trainX, trainY, testX, testY = load_dataset() # подготовить пиксельные данные TrainX, testX = prep_pixels (trainX, testX) # определить модель модель = определить_модель() # подходящая модель history = model.fit(trainX, trainY, epochs=200, batch_size=64, validation_data=(testX, testY), verbose=0) # оценить модель _, acc = model.evaluate (testX, testY, подробный = 0) напечатать(‘> %.3f’ % (акк * 100.0)) # кривые обучения summary_diagnostics(история) # точка входа, запускаем тестовую обвязку run_test_harness()

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

0010 31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

# Базовая модель с увеличением отсевания на наборе данных CIFAR10

Import Sys

от Matplotlib Import Pyplot

от Keras. Datasets Import Cifar10

из Keras.Utils Import To_Categorical

от KERAS.Models.Mopients. .layers import Conv2D

из keras.layers import MaxPooling2D

из keras.layers import Dense

из keras.layers import Flatten

из keras.layers import Dropout

from keras.optimizers import SGD

 

# загрузить поезд и набор тестовых данных

def load_dataset():

# загрузить набор данных

(trainX, trainY), (testX, testY) = cifar10.0_data

# одно целевое значение горячего кодирования

# преобразовать целые числа в числа с плавающей запятой

train_norm = train.astype(‘float32’)

test_norm = test.astype(‘float32’)

# нормализовать до диапазона 0-1

train_norm = train_norm / 255.01 test_norm = test_norm / 255.0

# вернуть нормализованные изображения

return train_norm, test_norm

 

# определить модель cnn

def define_model():

model = Sequential(dv()

2. model 90 , 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’, input_shape=(32, 32, 3)))

model.add(Conv2D(32, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’))

model.add(MaxPooling2D((2, 2)))

model.add(Dropout(0.2))

model.add(Conv2D(64, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’))

модель. add(Conv2D(64, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’))

model.add(MaxPooling2D((2, 2)))

модель. добавить (выпадение (0,3))

model.add(Conv2D(128, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’))

model.add(Conv2D(128, (3, 3), активация = ‘relu’, kernel_initializer = ‘he_uniform’, padding = ‘same’))

model.add (MaxPooling2D ((2, 2)))

model.add (Dropout (0.4))

model.add (Flatten())

model.add(Dense(128, активация=’relu’, kernel_initializer=’he_uniform’))

model. add(Dropout(0.5))

model.add(Dense(10, активация) =’софтмакс’))

# модель компиляции

opt = SGD(lr=0,001, импульс=0,9)

model.compile(optimizer=opt, loss=’categorical_crossentropy’, metrics=[‘accuracy’])

модель возврата

1    

# построение диагностических кривых обучения

def summum_diagnostics(history):

# построение графика потерь

pyplot.subplot(211)

pyplot.title(‘Cross Entropy Loss’)

pyplot.history[story[story.history потеря’], цвет=’синий’, метка=’поезд’)

pyplot.plot(history.history[‘val_loss’], color=’orange’, label=’test’)

# точность графика

pyplot.subplot(212)

pyplot.title(‘Точность классификации’)

pyplot.plot(history.history[‘accuracy’], color=’blue’, label=’train’)

pyplot.plot(history.history[‘val_accuracy’], color=’orange’, label= ‘test’)

# сохранить график в файл

filename = sys.argv[0].split(‘/’)[-1]

pyplot. savefig(filename + ‘_plot.png’)

pyplot.close()

 

# запустить тестовую программу для оценки модели

def run_test_harness():

# загрузить набор данных

trainX, trainY, testX, testY = load_dataset()

# подготовить данные пикселей

trainX, testX = prep_pixels(trainX, testX)

# определение модели

model = define_model()

# подгонка модели

history = model.fit(trainX, trainY, epochs=200, batch_size=64, validation_data =(тестX, тестY), подробно=0)

# оценить модель

_, acc = model.evaluate(testX, testY, verbose=0)

print(‘> %.3f’ % (acc * 100.0))

# кривые обучения

summary_diagnostics(history )

 

# точка входа, запуск тестовой системы

run_test_harness()

Запуск модели в тестовом наборе данных распечатывает точность классификации в тестовом наборе данных.

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

В этом случае мы можем наблюдать небольшой рост производительности с фиксированного отсева примерно на 83 % до увеличивающегося отсева примерно на 84 %.

> 84.690

> 84,690

Рассматривая кривые обучения, мы видим, что модель хорошо сходится, а производительность на тестовом наборе данных, возможно, останавливается на уровне от 110 до 125 эпох. По сравнению с кривыми обучения для фиксированного отсева мы видим, что скорость обучения снова замедлилась, что позволяет дополнительно уточнить модель без переобучения.

Это плодотворная область для исследования этой модели, и, возможно, большее количество слоев отсева и/или более агрессивный отсев могут привести к дальнейшим улучшениям.

Линейные графики кривых обучения для базовой модели с увеличением отсева в наборе данных CIFAR-10

Исключение и увеличение данных

В предыдущем разделе мы обнаружили, что и отсев, и увеличение данных привели к значительному улучшению производительности модели.

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

Полный список кодов модели с фиксированным отсевом и увеличением данных приведен ниже для полноты картины.

# базовая модель с отсевом и увеличением данных в наборе данных cifar10 импорт системы из matplotlib импортировать pyplot из keras.datasets импортировать cifar10 из keras.utils импортировать в_categorical из keras.models импорт последовательный из keras.layers импортировать Conv2D из keras.layers импортировать MaxPooling2D из keras.layers импорт плотный из keras.layers импортировать Flatten из keras.optimizers импорт SGD из keras.preprocessing.image импортировать ImageDataGenerator из keras.layers импортировать Dropout # загрузить поезд и протестировать набор данных деф load_dataset(): # загрузить набор данных (trainX, trainY), (testX, testY) = cifar10. load_data() # одно горячее кодирование целевых значений trainY = to_categorical(trainY) testY = to_categorical (testY) вернуть поезд X, поезд Y, тест X, тест Y # масштаб пикселей def prep_pixels (поезд, тест): # преобразовать целые числа в числа с плавающей запятой train_norm = train.astype(‘float32’) test_norm = test.astype(‘float32′) # нормализовать до диапазона 0-1 поезд_норма = поезд_норма / 255,0 тестовая_норма = тестовая_норма / 255,0 # вернуть нормализованные изображения вернуть train_norm, test_norm # определить модель cnn определить_модель(): модель = Последовательный() model.add(Conv2D(32, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’, input_shape=(32, 32, 3))) model.add (Conv2D (32, (3, 3), активация = ‘relu’, kernel_initializer = ‘he_uniform’, padding = ‘то же’)) model.add(MaxPooling2D((2, 2))) model.add (Выпадение (0,2)) model.add (Conv2D (64, (3, 3), активация = ‘relu’, kernel_initializer = ‘he_uniform’, padding = ‘то же’)) model. add (Conv2D (64, (3, 3), активация = ‘relu’, kernel_initializer = ‘he_uniform’, padding = ‘то же’)) model.add(MaxPooling2D((2, 2))) model.add (Выпадение (0,2)) model.add (Conv2D (128, (3, 3), активация = ‘relu’, kernel_initializer = ‘he_uniform’, padding = ‘то же’)) model.add (Conv2D (128, (3, 3), активация = ‘relu’, kernel_initializer = ‘he_uniform’, padding = ‘то же’)) model.add(MaxPooling2D((2, 2))) model.add (Выпадение (0,2)) model.add(Свести()) model.add(Dense(128, активация=’relu’, kernel_initializer=’he_uniform’)) model.add (Выпадение (0,2)) model.add (плотный (10, активация = ‘softmax’)) # скомпилировать модель opt = SGD (lr = 0,001, импульс = 0,9) model.compile(optimizer=opt, loss=’categorical_crossentropy’, metrics=[‘accuracy’]) модель возврата # построение диагностических кривых обучения defsummary_diagnostics(история): # сюжетная потеря pyplot.subplot(211) pyplot.title(‘Перекрестная потеря энтропии’) pyplot.plot(history.history[‘потеря’], цвет=’синий’, метка=’поезд’) pyplot. plot(history.history[‘val_loss’], color=’orange’, label=’test’) # точность сюжета pyplot.subplot(212) pyplot.title(‘Точность классификации’) pyplot.plot(history.history[‘точность’], color=’blue’, label=’train’) pyplot.plot(history.history[‘val_accuracy’], color=’оранжевый’, label=’test’) # сохранить график в файл имя файла = sys.argv[0].split(‘/’)[-1] pyplot.savefig (имя файла + ‘_plot.png’) pyplot.close() # запустить тестовую обвязку для оценки модели защита run_test_harness(): # загрузить набор данных trainX, trainY, testX, testY = load_dataset() # подготовить пиксельные данные TrainX, testX = prep_pixels (trainX, testX) # определить модель модель = определить_модель() # создаем генератор данных datagen = ImageDataGenerator (width_shift_range = 0,1, height_shift_range = 0,1, horizontal_flip = True) # подготовить итератор it_train = datagen.flow (trainX, trainY, batch_size = 64) # подходящая модель шаги = int(trainX.shape[0]/64) history = model.fit_generator(it_train, steps_per_epoch=шаги, эпохи=200, validation_data=(testX, testY), подробный=0) # оценить модель _, acc = model. evaluate (testX, testY, подробный = 0) напечатать(‘> %.3f’ % (акк * 100.0)) # кривые обучения summary_diagnostics(история) # точка входа, запускаем тестовую обвязку run_test_harness()

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

0010 31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

# Базовая модель с отсеванием и увеличением данных в наборе данных CIFAR10

Import Sys

от Matplotlib Import Pyplot

от Keras. Datasets Import CiFAR10

от Keras.Utils Import To_categorical

от Keras.momdels.

от Keras.momdels. из keras.layers импортировать Conv2D

из keras.layers импортировать MaxPooling2D

из keras.layers import Dense

из keras.layers import Flatten

из keras.optimizers import SGD

из keras.preprocessing.image import ImageDataGenerator

из keras.layers import Dropout

test and load and train набор данных

def load_dataset():

# загрузить набор данных

(trainX, trainY), (testX, testY) = cifar10.load_data()

# одно горячее кодирование целевых значений

trainY = to_categorical(trainY)

testY = to_categorical(testY)

return trainX, trainY, testX, testY

 

# масштаб пикселей

def prep_pixels(train, test):

# преобразование из целых чисел в числа с плавающей точкой

11

11

# преобразование из целых чисел в числа с плавающей запятой

11

(‘float32’)

test_norm = test. astype(‘float32’)

# нормализовать до диапазона 0-1

train_norm = train_norm / 255.0

test_norm = test_norm / 255.0 0m

# return train 0m return images , тест_норма

 

# определить модель cnn

def define_model():

model = Sequential()

model.add(Conv2D(32, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’, input_shape=(32, 32, 3)))

model.add(Conv2D(32, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’ ))

model.add(MaxPooling2D((2, 2)))

model.add(Dropout(0.2))

model.add(Conv2D(64, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’))

model.add(Conv2D(64, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’))

model.add(MaxPooling2D((2, 2)))

model.add(Dropout(0.2))

model.add(Conv2D(128, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’))

модель. add(Conv2D(128, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’))

model.add(MaxPooling2D((2, 2)))

модель. добавить (выпадение (0,2))

model.add(Flatten())

model.add(Dense(128, активация=’relu’, kernel_initializer=’he_uniform’))

model.add(Dropout(0.2))

model.add(Dense (10, активация=’softmax’))

# скомпилировать модель

opt = SGD(lr=0.001, импульс=0.9)

model.compile(optimizer=opt, loss=’categorical_crossentropy’, metrics=[‘accuracy ‘])

модель возврата

 

# построение кривых обучения диагностики

defsummary_diagnostics(history):

# потеря графика

pyplot.subplot(211)

pyplot.title(‘Cross Entropy Loss’)

pyplot.plot(history.history[‘loss’], color=’blue’, label=’train ‘)

pyplot.plot(history.history[‘val_loss’], color=’orange’, label=’test’)

# точность построения

pyplot.subplot(212)

pyplot. title(‘Classification Accuracy’)

pyplot.plot(history.history[‘accuracy’], color=’blue’, label=’train’)

pyplot.plot(history.history[‘val_accuracy’], color=’orange’ , метка=’тест’)

# сохранить график в файл

filename = sys.argv[0].split(‘/’)[-1]

pyplot.savefig(filename + ‘_plot.png’)

pyplot.close()

 

# запустить тестовую программу для оценки модели

def run_test_harness():

# загрузить набор данных

trainX, trainY, testX, testY = load_dataset()

# подготовить пиксельные данные

X

testX (trainX, testX)

# определить модель

model = define_model()

# создать генератор данных

datagen = ImageDataGenerator(width_shift_range=0.1, height_shift_range=0.1, horizontal_flip=True)

# подготовить итератор

it_train = datagen.flow(trainX, trainY, batch_size=64)

1 # 9 модель

steps = int(trainX.shape[0] / 64)

history = model.fit_generator(it_train, steps_per_epoch=steps, epochs=200, validation_data=(testX, testY), verbose=0)

# оценить модель

_, acc = model. evaluate(testX, testY, verbose=0)

print(‘> %.3f’ % (acc * 100.0))

# кривые обучения

summary_diagnostics(history)

 

# точка входа, запуск тестовой системы

run_test_harness

()

Запуск модели в тестовом наборе данных распечатывает точность классификации в тестовом наборе данных.

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

В этом случае мы видим, что, как мы и надеялись, совместное использование обоих методов регуляризации привело к дальнейшему повышению производительности модели на тестовом наборе. В этом случае сочетание фиксированного отсева примерно с 83% и увеличения данных примерно с 84% привело к повышению точности классификации примерно до 85%.

> 85,880

> 85,880

Просматривая кривые обучения, мы видим, что поведение модели при сходимости также лучше, чем только фиксированное отсев и увеличение данных. Обучение было замедлено без переобучения, что позволяет продолжать совершенствоваться.

Сюжет также предполагает, что обучение, возможно, не застопорилось и могло продолжать улучшаться, если позволить ему продолжаться, но, возможно, очень скромно.

Результаты могут быть улучшены, если вместо фиксированной скорости отсева по всей глубине модели будет использоваться схема увеличения отсева.

Линейные графики кривых обучения для базовой модели с отсевом и увеличением данных в наборе данных CIFAR-10

Исключение, увеличение данных и нормализация пакетов

Мы можем расширить предыдущий пример несколькими способами.

Во-первых, мы можем увеличить количество эпох обучения с 200 до 400, чтобы дать модели больше возможностей для улучшения.

Затем мы можем добавить нормализацию пакетов, чтобы стабилизировать обучение и, возможно, ускорить процесс обучения. Чтобы компенсировать это ускорение, мы можем увеличить регуляризацию, изменив отсев с фиксированного шаблона на возрастающий шаблон.

Обновленное определение модели приведено ниже.

# определить модель cnn определить_модель(): модель = Последовательный() model.add(Conv2D(32, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’, input_shape=(32, 32, 3))) model.add(Пакетная нормализация()) model.add (Conv2D (32, (3, 3), активация = ‘relu’, kernel_initializer = ‘he_uniform’, padding = ‘то же’)) model.add(Пакетная нормализация()) model.add(MaxPooling2D((2, 2))) model.add (Выпадение (0,2)) model.add (Conv2D (64, (3, 3), активация = ‘relu’, kernel_initializer = ‘he_uniform’, padding = ‘то же’)) model.add(Пакетная нормализация()) model.add (Conv2D (64, (3, 3), активация = ‘relu’, kernel_initializer = ‘he_uniform’, padding = ‘то же’)) model.add(Пакетная нормализация()) model.add(MaxPooling2D((2, 2))) model.add (Выпадение (0,3)) model.add (Conv2D (128, (3, 3), активация = ‘relu’, kernel_initializer = ‘he_uniform’, padding = ‘то же’)) model.add(Пакетная нормализация()) model. add (Conv2D (128, (3, 3), активация = ‘relu’, kernel_initializer = ‘he_uniform’, padding = ‘то же’)) model.add(Пакетная нормализация()) model.add(MaxPooling2D((2, 2))) model.add (Выпадение (0,4)) model.add(Свести()) model.add(Dense(128, активация=’relu’, kernel_initializer=’he_uniform’)) model.add(Пакетная нормализация()) model.add (Выпадение (0,5)) model.add (плотный (10, активация = ‘softmax’)) # скомпилировать модель opt = SGD (lr = 0,001, импульс = 0,9) model.compile(optimizer=opt, loss=’categorical_crossentropy’, metrics=[‘accuracy’]) возвратная модель

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

# определить модель cnn

def define_model():

model = Sequential()

model. add(Conv2D(32, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding= ‘такой же’, input_shape=(32, 32, 3)))

model.add(BatchNormalization())

model.add(Conv2D(32, (3, 3), активация=’relu’, kernel_initializer=’ he_uniform’, padding=’такой же’))

model.add(BatchNormalization())

model.add(MaxPooling2D((2, 2)))

model.add(Dropout(0.2))

model.add(Conv2D(64, (3, 3) ), активация = ‘relu’, kernel_initializer = ‘he_uniform’, padding = ‘то же’))

model.add(BatchNormalization())

model.add(Conv2D(64, (3, 3), активация=’ relu’, kernel_initializer=’he_uniform’, padding=’same’))

model.add(BatchNormalization())

model.add(MaxPooling2D((2, 2)))

model.add(Dropout(0.3 ))

model.add(Conv2D(128, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’))

model.add(BatchNormalization())

model.add (Conv2D(128, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’))

model. add(BatchNormalization())

model.add(MaxPooling2D((2 , 2)))

model.add(Dropout(0.4))

model.add(Flatten())

model.add(Dense(128, активация=’relu’, kernel_initializer=’he_uniform’))

model.add(BatchNormalization())

model.add(Dropout(0.5))

model.add(Dense(10, активация=’softmax’))

# скомпилировать модель

opt = SGD(lr =0,001, импульс=0,9)

model.compile(optimizer=opt, loss=’categorical_crossentropy’, metrics=[‘accuracy’])

модель возврата

Полный список кодов модели с увеличивающимся отсевом, увеличением данных, пакетной нормализацией и 400 периодами обучения приведен ниже для полноты картины.

# базовая модель с отсевом и увеличением данных в наборе данных cifar10 импорт системы из matplotlib импортировать pyplot из keras.datasets импортировать cifar10 из keras.utils импортировать в_categorical из keras.models импорт последовательный из keras.layers импортировать Conv2D из keras. layers импортировать MaxPooling2D из keras.layers импорт плотный из keras.layers импортировать Flatten из keras.optimizers импорт SGD из keras.preprocessing.image импортировать ImageDataGenerator из keras.layers импортировать Dropout из keras.layers импортировать BatchNormalization # загрузить поезд и протестировать набор данных деф load_dataset(): # загрузить набор данных (trainX, trainY), (testX, testY) = cifar10.load_data() # одно горячее кодирование целевых значений trainY = to_categorical(trainY) testY = to_categorical (testY) вернуть поезд X, поезд Y, тест X, тест Y # масштаб пикселей def prep_pixels (поезд, тест): # преобразовать целые числа в числа с плавающей запятой train_norm = train.astype(‘float32’) test_norm = test.astype(‘float32’) # нормализовать до диапазона 0-1 поезд_норма = поезд_норма / 255,0 тестовая_норма = тестовая_норма / 255,0 # вернуть нормализованные изображения вернуть train_norm, test_norm # определить модель cnn определить_модель(): модель = Последовательный() model. add(Conv2D(32, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’, input_shape=(32, 32, 3))) model.add(Пакетная нормализация()) model.add (Conv2D (32, (3, 3), активация = ‘relu’, kernel_initializer = ‘he_uniform’, padding = ‘то же’)) model.add(Пакетная нормализация()) model.add(MaxPooling2D((2, 2))) model.add (Выпадение (0,2)) model.add (Conv2D (64, (3, 3), активация = ‘relu’, kernel_initializer = ‘he_uniform’, padding = ‘то же’)) model.add(Пакетная нормализация()) model.add (Conv2D (64, (3, 3), активация = ‘relu’, kernel_initializer = ‘he_uniform’, padding = ‘то же’)) model.add(Пакетная нормализация()) model.add(MaxPooling2D((2, 2))) model.add (Выпадение (0,3)) model.add (Conv2D (128, (3, 3), активация = ‘relu’, kernel_initializer = ‘he_uniform’, padding = ‘то же’)) model.add(Пакетная нормализация()) model.add (Conv2D (128, (3, 3), активация = ‘relu’, kernel_initializer = ‘he_uniform’, padding = ‘то же’)) model.add(Пакетная нормализация()) model.add(MaxPooling2D((2, 2))) model. add (Выпадение (0,4)) model.add(Свести()) model.add(Dense(128, активация=’relu’, kernel_initializer=’he_uniform’)) model.add(Пакетная нормализация()) model.add (Выпадение (0,5)) model.add (плотный (10, активация = ‘softmax’)) # скомпилировать модель opt = SGD (lr = 0,001, импульс = 0,9) model.compile(optimizer=opt, loss=’categorical_crossentropy’, metrics=[‘accuracy’]) модель возврата # построение диагностических кривых обучения defsummary_diagnostics(история): # сюжетная потеря pyplot.subplot(211) pyplot.title(‘Перекрестная потеря энтропии’) pyplot.plot(history.history[‘потеря’], цвет=’синий’, метка=’поезд’) pyplot.plot(history.history[‘val_loss’], color=’orange’, label=’test’) # точность сюжета pyplot.subplot(212) pyplot.title(‘Точность классификации’) pyplot.plot(history.history[‘точность’], color=’blue’, label=’train’) pyplot.plot(history.history[‘val_accuracy’], color=’оранжевый’, label=’test’) # сохранить график в файл имя файла = sys.argv[0].split(‘/’)[-1] pyplot. savefig (имя файла + ‘_plot.png’) pyplot.close() # запустить тестовую обвязку для оценки модели защита run_test_harness(): # загрузить набор данных trainX, trainY, testX, testY = load_dataset() # подготовить пиксельные данные TrainX, testX = prep_pixels (trainX, testX) # определить модель модель = определить_модель() # создаем генератор данных datagen = ImageDataGenerator (width_shift_range = 0,1, height_shift_range = 0,1, horizontal_flip = True) # подготовить итератор it_train = datagen.flow (trainX, trainY, batch_size = 64) # подходящая модель шаги = int(trainX.shape[0]/64) history = model.fit_generator(it_train, steps_per_epoch=шаги, эпохи=400, validation_data=(testX, testY), подробный=0) # оценить модель _, acc = model.evaluate (testX, testY, подробный = 0) напечатать(‘> %.3f’ % (акк * 100.0)) # кривые обучения summary_diagnostics(история) # точка входа, запускаем тестовую обвязку run_test_harness()

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

0010 31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

104

105

106

.

# базовая модель с отсевом и дополнением данных в наборе данных cifar100011

из keras.layers import Conv2D

из keras.layers import MaxPooling2D

из keras.layers import Dense

из keras.layers import Flatten

из keras.optimizers import SGD

1

из keras.optimizers import SGD.

из keras.layers import Dropout

из keras.layers import BatchNormalization

 

# загрузить поезд и набор тестовых данных

def load_dataset():

# загрузить набор данных

(trainX, trainY), (testX, testY) = cifar10.load_data()

# одно целевое значение горячего кодирования trainX, trainY, testX, testY

 

# масштаб пикселей

def prep_pixels(train, test):

# преобразование целых чисел в числа с плавающей запятой

train_norm = train.astype(‘float32’)

test_norm. astype(‘float32’)

# Нормализация до диапазона 0-1

TRAIN_NORM = TRAIN_NORM / 255. 0

TEST_NORM = TEST_NORM / 255.0

# возвращает Нормализованные изображения

return train_norm, test_norm

# Define CNN Model

111111110

# DEFIN

модель = Sequential()

model.add(Conv2D(32, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’, input_shape=(32, 32, 3) ))

model.add(Пакетная нормализация())

model.add(Conv2D(32, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’))

model.add(BatchNormalization())

model.add (MaxPooling2D((2, 2)))

model.add(Dropout(0.2))

model.add(Conv2D(64, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding = ‘то же’))

model.add(BatchNormalization())

model.add(Conv2D(64, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’) )

model.add(BatchNormalization())

model.add(MaxPooling2D((2, 2)))

model.add(Dropout(0.3))

model. add(Conv2D(128, (3, 3) ), активация = ‘relu’, kernel_initializer = ‘he_uniform’, padding = ‘то же’))

model.add(BatchNormalization())

model.add(Conv2D(128, (3, 3), активация=’ relu’, kernel_initializer=’he_uniform’, padding=’same’))

model.add(BatchNormalization())

model.add(MaxPooling2D((2, 2)))

model.add(Dropout(0.4 ))

model.add(Flatten())

model.add(Dense(128, активация=’relu’, kernel_initializer=’he_uniform’))

model.add(BatchNormalization())

model.add(Dropout (0.5))

model.add(Dense(10, активация=’softmax’))

# скомпилировать модель

opt = SGD(lr=0.001, импульс=0.9)

model.compile(optimizer=opt, loss=’categorical_crossentropy’, metrics=[‘accuracy’])

модель возврата

 

# построение диагностических кривых обучения

def summary_diagnostics(history):

# потеря участка

pyplot.subplot(211)

pyplot.title(‘Потеря перекрестной энтропии’)

pyplot. plot(history.history[‘потеря’], color= ‘blue’, label=’train’)

pyplot.plot(history.history[‘val_loss’], color=’orange’, label=’test’)

# точность графика

pyplot.subplot(212)

pyplot.title(‘Точность классификации’)

pyplot.plot(history.history[‘точность’], color=’blue’, label=’train’)

pyplot.plot(history.history[‘val_accuracy’], color=’orange’, label=’test’)

# сохранить график в файл

filename = sys.argv[0].split(‘/’ )[-1]

pyplot.savefig(filename + ‘_plot.png’)

pyplot.close()

 

# запустить тестовую программу для оценки модели

def run_test_harness():

load #

load набор данных

trainX, trainY, testX, testY = load_dataset()

# подготовить пиксельные данные

trainX, testX = prep_pixels(trainX, testX)

# определить модель

модель = определить_модель ()

# создать генератор данных

datagen = ImageDataGenerator (width_shift_range = 0,1, height_shift_range = 0,1, horizontal_flip = True)

# подготовить итератор данных =flowtrain it_train 90X101 90X101 90X101 , trainY, batch_size=64)

# подходящая модель

шагов = int(trainX. shape[0] / 64)

history = model.fit_generator(it_train, steps_per_epoch=steps, epochs=400, validation_data=(testX, тестY), подробный=0)

# оценить модель

_, acc = model.evaluate(testX, testY, verbose=0)

print(‘> %.3f’ % (acc * 100.0))

# кривые обучения

summary_diagnostics(history )

 

# точка входа, запуск тестовой системы

run_test_harness()

Запуск модели в тестовом наборе данных распечатывает точность классификации в тестовом наборе данных.

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

В этом случае мы видим, что мы добились дальнейшего повышения производительности модели примерно до 88% точности, улучшив как отсев, так и увеличение данных только примерно на 84%, а только увеличение отсева примерно на 85%.

> 88.620

> 88,620

Рассматривая кривые обучения, мы видим, что обучение модели показывает постоянное улучшение в течение почти 400 эпох. Мы можем видеть, возможно, небольшое падение в тестовом наборе данных около 300 эпох, но тенденция к улучшению продолжается.

Модель может выиграть от дальнейших эпох обучения.

Линейные графики кривых обучения для базовой модели с увеличивающимся отсевом, увеличением данных и нормализацией пакетов в наборе данных CIFAR-10

Обсуждение

В этом разделе мы рассмотрели два подхода, предназначенных для расширения изменений в модели, которые, как мы уже знаем, приводят к улучшению

Сводка результатов представлена ​​ниже:

  • Исходный уровень + увеличение отсева : 84,690%
  • Базовый уровень + Исключение + Увеличение данных : 85,880%
  • Базовый уровень + Увеличение выпадения + Увеличение данных + Нормализация партии : 88,620%

Теперь модель хорошо обучается, и у нас есть хороший контроль над скоростью обучения без переобучения.

Мы могли бы добиться дальнейших улучшений с помощью дополнительной регуляризации. Этого можно добиться более агрессивным отсевом в более поздних слоях. Возможно, дальнейшее добавление уменьшения веса может улучшить модель.

До сих пор мы не настроили гиперпараметры алгоритма обучения, такие как скорость обучения, которая, пожалуй, является самым важным гиперпараметром. Мы можем ожидать дальнейших улучшений с адаптивными изменениями скорости обучения, такими как использование метода адаптивной скорости обучения, такого как Адам. Эти типы изменений могут помочь уточнить модель после сходимости.

Как завершить модель и сделать прогнозы

Процесс улучшения модели может продолжаться до тех пор, пока у нас есть идеи, а также время и ресурсы для их проверки.

В какой-то момент необходимо выбрать и принять окончательную конфигурацию модели. В этом случае мы не будем усложнять и будем использовать базовую модель (VGG с 3 блоками) в качестве окончательной модели.

Во-первых, мы доработаем нашу модель, подобрав модель ко всему набору обучающих данных и сохранив модель в файл для последующего использования. Затем мы загрузим модель и оценим ее производительность в тестовом наборе данных, чтобы получить представление о том, насколько хорошо выбранная модель работает на практике. Наконец, мы будем использовать сохраненную модель, чтобы сделать прогноз для одного изображения.

Сохранить окончательную модель

Окончательная модель обычно подходит для всех доступных данных, таких как комбинация всех наборов обучающих и тестовых данных.

В этом руководстве мы продемонстрируем окончательную модель, подходящую только для набора данных только для обучения, чтобы упростить пример.

Первый шаг — подогнать окончательную модель ко всему набору обучающих данных.

# подходящая модель model.fit (поезд X, поезд Y, эпохи = 100, размер партии = 64, подробный = 0)

# подходящая модель

model. fit(trainX, trainY, epochs=100, batch_size=64, verbose=0)

После подгонки мы можем сохранить окончательную модель в файл H5, вызвав для модели функцию save() и передав выбранное имя файла.

# сохранить модель model.save(‘final_model.h5’)

# сохранить модель

model.save(‘final_model.h5’)

Примечание. Для сохранения и загрузки модели Keras на вашей рабочей станции должна быть установлена ​​библиотека h5py.

Полный пример подгонки окончательной модели к набору обучающих данных и сохранения ее в файл приведен ниже.

# сохранить окончательную модель в файл из keras.datasets импортировать cifar10 из keras.utils импортировать в_categorical из keras.models импорт последовательный из keras.layers импортировать Conv2D из keras.layers импортировать MaxPooling2D из keras.layers импорт плотный из keras.layers импортировать Flatten из keras. optimizers импорт SGD # загрузить поезд и протестировать набор данных деф load_dataset(): # загрузить набор данных (trainX, trainY), (testX, testY) = cifar10.load_data() # одно горячее кодирование целевых значений trainY = to_categorical(trainY) testY = to_categorical (testY) вернуть поезд X, поезд Y, тест X, тест Y # масштаб пикселей def prep_pixels (поезд, тест): # преобразовать целые числа в числа с плавающей запятой train_norm = train.astype(‘float32’) test_norm = test.astype(‘float32′) # нормализовать до диапазона 0-1 поезд_норма = поезд_норма / 255,0 тестовая_норма = тестовая_норма / 255,0 # вернуть нормализованные изображения вернуть train_norm, test_norm # определить модель cnn определить_модель(): модель = Последовательный() model.add(Conv2D(32, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’, input_shape=(32, 32, 3))) model.add (Conv2D (32, (3, 3), активация = ‘relu’, kernel_initializer = ‘he_uniform’, padding = ‘то же’)) model. add(MaxPooling2D((2, 2))) model.add (Conv2D (64, (3, 3), активация = ‘relu’, kernel_initializer = ‘he_uniform’, padding = ‘то же’)) model.add (Conv2D (64, (3, 3), активация = ‘relu’, kernel_initializer = ‘he_uniform’, padding = ‘то же’)) model.add(MaxPooling2D((2, 2))) model.add (Conv2D (128, (3, 3), активация = ‘relu’, kernel_initializer = ‘he_uniform’, padding = ‘то же’)) model.add (Conv2D (128, (3, 3), активация = ‘relu’, kernel_initializer = ‘he_uniform’, padding = ‘то же’)) model.add(MaxPooling2D((2, 2))) model.add(Свести()) model.add(Dense(128, активация=’relu’, kernel_initializer=’he_uniform’)) model.add (плотный (10, активация = ‘softmax’)) # скомпилировать модель opt = SGD (lr = 0,001, импульс = 0,9) model.compile(optimizer=opt, loss=’categorical_crossentropy’, metrics=[‘accuracy’]) модель возврата # запустить тестовую обвязку для оценки модели защита run_test_harness(): # загрузить набор данных trainX, trainY, testX, testY = load_dataset() # подготовить пиксельные данные TrainX, testX = prep_pixels (trainX, testX) # определить модель модель = определить_модель() # подходящая модель model. fit (поезд X, поезд Y, эпохи = 100, размер партии = 64, подробный = 0) # сохранить модель model.save(‘final_model.h5’) # точка входа, запускаем тестовую обвязку run_test_harness()

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

0010 31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

# Сохраните окончательную модель для файла

от Keras. datasets Import Cifar10

от Keras.utils Import to_categorical

от Keras.Models Импортируйте последовательность

от Keras.layers Import2d

от Keras.Layers.

из keras.layers import Dense

из keras.layers import Flatten

из keras.optimizers import SGD

 

# загрузить поезд и тестовый набор данных

def load_dataset():

# загрузить набор данных

(trainX, trainY), (testX, testY) = cifar10.load_data()

# одно горячее кодирование целевых значений

1

1

1

1 trainY = to_categorical(trainY)

testY = to_categorical(testY)

return trainX, trainY, testX, testY

 

# масштаб пикселей

def prep_pixels(train, test):

# преобразование из целого числа

train_norm = train.astype(‘float32’)

test_norm = test.astype(‘float32’)

# нормализовать до диапазона 0-1 нормализованные изображения

return train_norm, test_norm

 

# определить модель cnn

def define_model():

model = Sequential()

model. add(Conv2D(32, (3, 3), активация=’relu ‘, kernel_initializer=’he_uniform’, padding=’same’, input_shape=(32, 32, 3)))

model.add(Conv2D(32, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’))

model.add(MaxPooling2D((2, 2)))

model.add(Conv2D(64, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’))

model.add(Conv2D(64, (3, 3) , активация = ‘relu’, kernel_initializer = ‘he_uniform’, padding = ‘то же’))

model.add(MaxPooling2D((2, 2)))

model.add(Conv2D(128, (3, 3) , активация = ‘relu’, kernel_initializer = ‘he_uniform’, padding = ‘то же’))

model.add(Conv2D(128, (3, 3), активация=’relu’, kernel_initializer=’he_uniform’, padding=’same’))

model.add(MaxPooling2D((2, 2)))

model.add(Flatten())

model.add(Dense(128, активация=’relu’, kernel_initializer=’he_uniform’))

model.add(Dense(10, активация=’softmax’))

# скомпилировать модель

opt = SGD(lr=0,001, импульс=0,9)

model. compile(optimizer=opt, loss=’categorical_crossentropy’, metrics=[‘accuracy’])

return model

 

# запустить тестовую программу для оценки модели

def run_test_harness():

# загрузить набор данных

trainX, trainY, testX, testY = load_dataset() 0 10 0 prepare trainX, testX = prep_pixels(trainX, testX)

# определить модель

model = define_model()

# подходящая модель

model.fit(trainX, trainY, epochs=100, batch_size=64, verbose=0)

# сохранить модель

model.save(‘final_model.h5’)

 

# точка входа, запуск тестовой системы

run_test_harness()

После запуска этого примера у вас будет 4,3-мегабайтный файл с именем « final_model.h5 » в вашем текущем рабочем каталоге.

Оценить окончательную модель

Теперь мы можем загрузить окончательную модель и оценить ее на тестовом наборе данных.

Это то, что мы могли бы сделать, если бы были заинтересованы в представлении производительности выбранной модели заинтересованным сторонам проекта.

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

Модель можно загрузить с помощью функции load_model() .

Полный пример загрузки сохраненной модели и ее оценки в тестовом наборе данных приведен ниже.

# оценить глубокую модель на тестовом наборе данных из keras.datasets импортировать cifar10 из keras.models импортировать load_model из keras.utils импортировать в_categorical # загрузить поезд и протестировать набор данных деф load_dataset(): # загрузить набор данных (trainX, trainY), (testX, testY) = cifar10.load_data() # одно горячее кодирование целевых значений trainY = to_categorical(trainY) testY = to_categorical (testY) вернуть поезд X, поезд Y, тест X, тест Y # масштаб пикселей def prep_pixels (поезд, тест): # преобразовать целые числа в числа с плавающей запятой train_norm = train. astype(‘float32’) test_norm = test.astype(‘float32’) # нормализовать до диапазона 0-1 поезд_норма = поезд_норма / 255,0 тестовая_норма = тестовая_норма / 255,0 # вернуть нормализованные изображения вернуть train_norm, test_norm # запустить тестовую обвязку для оценки модели защита run_test_harness(): # загрузить набор данных trainX, trainY, testX, testY = load_dataset() # подготовить пиксельные данные TrainX, testX = prep_pixels (trainX, testX) # загрузить модель модель = load_model(‘final_model.h5’) # оценить модель на тестовом наборе данных _, acc = model.evaluate (testX, testY, подробный = 0) напечатать(‘> %.3f’ % (акк * 100.0)) # точка входа, запускаем тестовую обвязку run_test_harness()

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

0010 31

32

33

34

35

36

37

38

0 3 1

# оценить глубокую модель в тестовом наборе данных ):

# загрузить набор данных

(trainX, trainY), (testX, testY) = cifar10. load_data()

# одно целевое значение горячего кодирования

trainY = to_categorical(trainY)

testY = to_categorical(testY)

return trainX, trainY, testX, testY

 

# масштабные пиксели pretrains, testY

11 :

# преобразовать целые числа в числа с плавающей точкой

train_norm = train.astype(‘float32’)

test_norm = test.astype(‘float32’)

# нормализовать до диапазона 0-1

train_norm = train_norm / 9001.2501.

test_norm = test_norm / 255.0

# return Нормализованные изображения

return train_norm, test_norm

# Запустите тестовый жгут для оценки модели

def run_test_harnes , testY = load_dataset()

# подготовить пиксельные данные

trainX, testX = prep_pixels(trainX, testX)

# загрузить модель

model = load_model(‘final_model.h5’)

# оценить модель на тестовом наборе данных

_, acc = model.evaluate(testX, testY, verbose=0)

print(‘> %. 3f’ % (acc * 100.0))

 

# точка входа, запуск тестовой системы

run_test_harness ()

Выполнение примера загружает сохраненную модель и оценивает модель в наборе данных проверки удержания.

Точность классификации модели в наборе тестовых данных вычисляется и распечатывается.

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

В этом случае мы видим, что модель достигла точности около 73%, что очень близко к тому, что мы видели, когда оценивали модель как часть нашего тестового комплекта.

73.750

73.750

Сделать прогноз

Мы можем использовать нашу сохраненную модель для предсказания новых изображений.

В модели предполагается, что новые изображения являются цветными, они сегментированы таким образом, что одно изображение содержит один центрированный объект, а размер изображения является квадратным размером 32×32 пикселя.

Ниже приведено изображение, извлеченное из набора тестовых данных CIFAR-10. Вы можете сохранить его в текущем рабочем каталоге с именем файла « sample_image.png ».

Олень

  • Скачать изображение оленя (sample_image.png)

Мы представим, что это совершенно новое и невидимое изображение, подготовленное требуемым образом, и посмотрим, как мы можем использовать нашу сохраненную модель для предсказания целого числа, которое представляет изображение.

Для этого примера мы ожидаем класс « 4 » для « Олень ».

Во-первых, мы можем загрузить изображение и изменить его размер до 32×32 пикселей. Затем загруженное изображение можно изменить, чтобы оно имело один канал и представляло один образец в наборе данных. Функция load_image() реализует это и возвращает загруженное изображение, готовое к классификации.

Важно отметить, что значения пикселей подготавливаются так же, как значения пикселей подготавливались для обучающего набора данных при подгонке окончательной модели, в данном случае нормализованной.

# загрузить и подготовить образ деф load_image (имя файла): # загрузить изображение img = load_img (имя файла, target_size = (32, 32)) # преобразовать в массив img = img_to_array(img) # преобразовать в один образец с 3 каналами img = img.reshape (1, 32, 32, 3) # подготовить пиксельные данные img = img.astype(‘float32’) изображение = изображение / 255,0 возврат изображения

1

2

3

4

5

6

7

8

9

10

11

12

# загрузить и подготовить образ

def load_image(filename):

# загрузить образ

img = load_img(filename, target_size=(32, 32))

# преобразовать в массив

img = img_to_array img)

# преобразование в единый образец с 3 каналами

img = img.reshape(1, 32, 32, 3)

# подготовка данных пикселей

img = img.astype(‘float32’)

img = img / 255. 0

вернуть img

Далее мы можем загрузить модель, как в предыдущем разделе, и вызвать функцию Predict_Classes() для прогнозирования объекта на изображении.

# предсказать класс результат = model.predict_classes(img)

# предсказать класс

result = model.predict_classes(img)

Полный пример приведен ниже.

# сделать прогноз для нового изображения. из keras.preprocessing.image импортировать load_img из keras.preprocessing.image импортировать img_to_array из keras.models импортировать load_model # загрузить и подготовить образ деф load_image (имя файла): # загрузить изображение img = load_img (имя файла, target_size = (32, 32)) # преобразовать в массив img = img_to_array(img) # преобразовать в один образец с 3 каналами img = img.reshape (1, 32, 32, 3) # подготовить пиксельные данные img = img.astype(‘float32’) изображение = изображение / 255,0 вернуть изображение # загрузить изображение и предсказать класс защита run_example(): # загрузить изображение img = load_image(‘sample_image. png’) # загрузить модель модель = load_model(‘final_model.h5’) # предсказать класс результат = model.predict_classes(img) печать (результат [0]) # точка входа, запускаем пример run_example()

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

# сделать прогноз для нового изображения.

от keras.preprocessing.image import load_img

от keras.preprocessing.image import img_to_array

от keras.models import_model

# нагрузка и подготовка к изображению

(Lefelame): Def Def Def Def (Def DEFEMAGE): DEF DEFEMAGE (LIFELENAME):

. изображение

img = load_img(filename, target_size=(32, 32))

# преобразовать в массив

img = img_to_array(img)

# преобразовать в единый образец с 3 каналами

img = img. reshape(1, 32, 32, 3)

# подготовка данных пикселей загрузить изображение и предсказать класс

def run_example():

# загрузить изображение

img = load_image(‘sample_image.png’)

# загрузить модель

model = load_model(‘final_model.h5’)

# предсказать класс

result = model.predict_classes(img)

print(result[0])

 

# точка входа, запустить пример

run_example()

При запуске примера сначала загружается и подготавливается изображение, загружается модель, а затем правильно прогнозируется, что загруженное изображение представляет « оленей » или класс « 4 ».

Расширения

В этом разделе перечислены некоторые идеи по расширению учебника, которые вы, возможно, захотите изучить.

  • Масштабирование пикселей . Изучите альтернативные методы масштабирования пикселей, такие как центрирование и стандартизация, и сравните производительность.
  • Скорость обучения . Изучите альтернативные скорости обучения, адаптивные скорости обучения и графики скорости обучения и сравните производительность.
  • Трансферное обучение . Изучите этот набор данных с помощью трансферного обучения, например предварительно обученной модели VGG-16.

Если вы изучите какое-либо из этих расширений, я хотел бы знать.
Опубликуйте свои выводы в комментариях ниже.

Дополнительное чтение

В этом разделе содержится больше ресурсов по теме, если вы хотите углубиться.

сообщения

  • Распознавание объектов с помощью сверточных нейронных сетей в библиотеке глубокого обучения Keras
  • Нежное введение в Dropout для регуляризации глубоких нейронных сетей
  • Используйте регуляризацию веса для уменьшения переобучения моделей глубокого обучения

API

  • Наборы данных Keras API
  • Код наборов данных Keras

Артикул

  • Результаты наборов данных классификации. Каков класс этого изображения?
  • СИФАР-10, Википедия.
  • Набор данных CIFAR-10 и наборы данных CIFAR-100.
  • CIFAR-10 — Распознавание объектов на изображениях, Kaggle.
  • Простой CNN 90%+, Паскуале Джовенале, Kaggle.

Резюме

В этом руководстве вы узнали, как с нуля разработать модель сверточной нейронной сети для классификации фотографий объектов.

В частности, вы узнали:

  • Как разработать набор тестов для надежной оценки модели и установить базовый уровень производительности для задачи классификации.
  • Как исследовать расширения базовой модели, чтобы улучшить возможности обучения и модели.
  • Как разработать окончательную модель, оценить производительность окончательной модели и использовать ее для прогнозирования новых изображений.

Есть вопросы?
Задавайте свои вопросы в комментариях ниже, и я постараюсь ответить.

Разработайте модели глубокого обучения для машинного зрения уже сегодня!

Разработайте свои собственные модели зрения за считанные минуты

. ..с помощью всего нескольких строк кода Python

Узнайте, как это сделать, в моей новой электронной книге:
Глубокое обучение для компьютерного зрения :
классификация , обнаружение объектов (yolo и rcnn) , распознавание лиц (vggface и facenet) , подготовка данных и многое другое…

Наконец-то внедрите глубокое обучение в свои проекты Vision

Пропустите академические занятия. Просто Результаты.

Посмотреть, что внутри

О Джейсоне Браунли

Джейсон Браунли, доктор философии, специалист по машинному обучению, который обучает разработчиков тому, как получать результаты с помощью современных методов машинного обучения с помощью практических руководств.

Просмотреть все сообщения Джейсона Браунли →

Глубокое обучение CNN для Fashion-MNIST Классификация одежды

Перенос обучения в Keras с моделями компьютерного зрения

Объяснение фотографии окончания одного часа

Searchlight Pictures. о которых до сих пор говорят почти два десятилетия спустя.

Было много теорий о том, что происходит с извращенным фотопроявителем Уильямса Сеймуром «Сай» Пэрришем в конце фильма, в том числе о том, происходит ли весь сюжет просто в его голове. Но если углубиться в предысторию и то, о чем говорится, в том числе в комментариях режиссера к DVD/Blu-Ray версиям фильма, то можно лучше понять, что на самом деле происходит в конце «One Hour Photo». .»

Фильм режиссера Марка Романека рассказывает о леденящей кровь одержимости Сая семьей Йоркин, с которой он познакомился, создавая для них картины. Йоркины уже много лет ходят в одночасовое место для фотосессии Сая, и у него дома на стене висят сотни секретных копий, чтобы показать это. Вуайеристские манеры Сая в конечном итоге становятся жестокими, когда он обнаруживает, что у мистера Йоркина роман, тем самым разрушая его фантазию об идеальной семье, которой Сай считал их. Кульминацией событий становится грязная разборка в гостиничном номере и арест Сая, который позже приводит к странному повороту концовки, из-за которого некоторые зрители не понимают, что на самом деле произошло.

Финальная фотосессия

Searchlight Pictures

Когда «One Hour Photo» впервые вышел на экраны, одной из главных тем, о которых люди не могли перестать говорить, была финальная сцена в гостиничном номере между Саем и Уиллом Йоркиным в исполнении Майкла Вартана, и это до сих пор звучит правдоподобно. Дискуссии на Reddit регулярно возникают, когда новые зрители хотят получить ответы о ключевой конфронтации между двумя персонажами, о чем свидетельствует эта ветка от 2021 года. ). Он заставляет пару позировать обнаженными в различных сексуальных позах, а сам ходит по комнате и фотографирует их. Закончив, Сай пытается сбежать из отеля, но снаружи его встречает полиция. Расследование было начато ранее в фильме после того, как сотрудники, где работает Си, обнаружили фотографии дочери управляющего магазином, которые он сделал. Сай использовал фотографии, чтобы угрожать ему после того, как менеджер обнаружил все копии, которые он делал с Йоркинами и другими. «Я просто фотографировал», — говорит он копам. Инцидент оставляет Уилла Йоркина и его возлюбленную травмированными, что в конечном итоге оказывается целью Сая. Но зачем он это сделал?

В детстве Сай подвергалась жестокому обращению

Searchlight Pictures

После ареста Сая зрители наконец узнают, что побуждало его вести себя так странно. Он говорит детективу Джеймсу Ван Дер Зи (Эрик Ла Саль), что полицейский, кажется, хороший отец и никогда не будет плохо обращаться со своей семьей или заставлять своих детей делать «то, что дети не должны делать», тем самым подразумевая, что Сай подвергался насилию. как ребенок.

«Вы бы никогда не стали делать отвратительные, больные, унизительные фотографии ваших детей, занимающихся подобными вещами», — говорит Сай, по-видимому, говоря о себе. «У Уилла Йоркина было все, но он выбросил», — добавляет Сай. «Он плохой отец». Дет. Ван Дер Зи говорит Саю, что он «теперь понимает», почему он сделал то, что сделал в отеле, а также почему он был так одержим фотографированием Йоркинов. Но есть еще один поворот.

Обсуждая кадры с фильмами, которые полицейские нашли у Сая в отеле, Дет. Ван Дер Зи отмечает, что в комнате были только кадры предметов и случайных вещей, но не Уилл Йоркин и его любовница. Означает ли это, что Сай не делал никаких фотографий? Или он, возможно, вообразил всю конфронтацию целиком? Однако режиссер Марк Романек объясняет в комментарии к DVD, что зрители определенно должны смотреть на финал одним из способов.

Сай сделал то, что с ним сделали

Searchlight Pictures

Как отмечали пользователи Reddit на протяжении многих лет, Романек и сам Робин Уильямс признали возможность интерпретации в «One Hour Photo», но они также согласны с тем, что есть одна главная вещь, которая высечена в камне. «Когда фантазия [Сая] о здоровой семье рухнула, он взял дело в свои руки и сделал именно то, что с ним сделали: психологическое насилие», — объяснил u/adamzissou в обсуждении на форуме 2015 года фильма и комментариев к нему на DVD. . «Когда он превращается в детектива, вы можете видеть, что он опирается на личный опыт, и полицейский даже говорит: «Теперь все это имеет смысл»» 9.0011

Что касается пропавших фотографий, большинство людей согласны с тем, что причина, по которой их не было в пленках, заключалась в том, что Сай их просто не взял. Он хотел психологически мучить Уилла Йоркина и заставить его почувствовать то, что чувствовал Сай, когда он был ребенком, которого фотографировал его отец. «Сай знал, насколько психологически травматично для него быть вынужденным делать эти фотографии, поэтому он хотел, чтобы Уилл и [Майя] чувствовали то же самое из-за романа», — сказал пользователь Reddit u/cheecha_meems. «Молодой Сай, должно быть, чувствовал, что не контролирует ситуацию, но он контролировал Уилла и [Майю] единственным известным ему способом: используя ту же тактику контроля, которую использовал его отец».

Что означает последнее семейное фото?

Searchlight Pictures

После допроса Сая и эмоционального срыва на глазах у детектива изображение улыбающегося Сая исчезает из поля зрения. Затем мы разворачиваемся, чтобы увидеть остальную часть фотографии, на которой Сай стоит рядом с Ниной, Джейкобом (Дилан Смит) и Уиллом, который обнимает свою жену и Сай. Все четверо выражают радость, но вполне понятно, когда вы смотрите эту сцену, если ваше лицо создает выражение замешательства. Как и остальная часть «One Hour Photo», этот момент довольно расплывчатый и поддается интерпретации, основанной на том, что в целом разглашается фильмом.

Самое очевидное прочтение этого изображения состоит в том, что оно представляет предполагаемую динамику отношений Сая с семьей Йоркиных. Хотя они не отвечали взаимностью, он всегда чувствовал себя частью их единства, живя опосредованно через их фотографии. Как выразился У/адамзиссу, он «встроился в их жизнь». С другой стороны, эту фотографию можно было бы принять за изображение самого Сая после того, как он пролил свет на роман Уилла и Майи. Поступая так, он мог видеть себя защитником этого идеального, первозданного семейного образа, за который он так крепко цеплялся, который, как он мог думать, считал его достойным их благодарности и принятия.

По прошествии десятилетий после театрального показа, само собой разумеется, что завершение «One Hour Photo» останется предметом разногласий на десятилетия вперед.

рекомендуемые

Точечная диаграмма изображений—ArcGIS Pro | Документация

Диаграммы рассеяния изображения используются для изучения связи между полосами изображения и их отношения к интересующим элементам и материалам. Значения пикселей одного канала (переменная 1) отображаются по оси x, а значения другого канала (переменная 2) — по оси y. Особенности и материалы на изображении могут быть идентифицированы там, где две переменные пересекаются в распределении или на диаграмме рассеяния.

Вы можете построить преобразованные полосы, чтобы получить ценную информацию об особенностях изображения. Например, преобразование Tasseled Cap — это особая форма анализа основных компонентов, в которой первый компонент, называемый яркостью, сравнивается со вторым компонентом, называемым зеленым цветом. На полученном точечном графике показано распределение кепок с кисточками, где различные виды растительности расположены вдоль так называемой зеленой линии, а типы почвы и антропогенные элементы распределены вдоль линии почвы. Распределение шляпок с кисточками также полезно для определения стадии роста сельскохозяйственных полей от появления всходов до старения, силы вегетации и другой феноменологии.

Точечная диаграмма шапочки с кисточками преобразована в мультиспектральные снимки Landsat-8. Зеленая линия и линия почвы приведены для иллюстрации и не генерируются диаграммой рассеяния изображения.

Создание точечной диаграммы изображения

Чтобы создать точечную диаграмму изображения, щелкните правой кнопкой мыши слой, который вы хотите проанализировать, на панели Содержание, выберите Создать диаграмму и щелкните Точечная диаграмма, чтобы открыть панель Свойства диаграммы.

Чтобы определить настройки параметров для диаграммы, щелкните вкладку «Данные» в верхней части панели «Свойства диаграммы».

Определение области интереса

В верхней части панели свойств диаграммы находится набор инструментов рисования для определения области интереса на изображении. Вы можете выбрать отображение только значений в интересующей области на диаграмме рассеивания. Нарисуйте интересующую область, определяемую линией, кругом, прямоугольником, многоугольником или произвольной формой.

Переменные

Диаграммы рассеяния изображения отображают значения пикселей двух каналов, одной переменной канала для оси x и одной переменной канала для оси y.

Если вы хотите отображать только значения пикселей полос в области интереса, которую вы определили на своем изображении, установите флажок «Использовать пользовательскую область интереса». Если вы хотите отобразить значения пикселей всех каналов на диаграмме рассеяния, не устанавливайте этот флажок. Вы можете удалить интересующую область, нажав кнопку удаления , которая удалит интересующую область и отобразит все пиксели изображения каналов.

Символ

Одноцветный — это вариант символа по умолчанию для точечных диаграмм изображений. Чтобы определить цвет отображения для ваших данных, щелкните символ «Один цвет», чтобы отобразить галерею цветов, и выберите цвет.

Статистика

Вычисляется уравнение регрессии, и соответствующая линия тренда и R2 наносятся на точечные диаграммы. Установите флажок Показать линейный тренд, чтобы отобразить линию тренда. Линия тренда моделирует линейную зависимость между x и y, а R2 количественно определяет, насколько хорошо данные соответствуют модели. Это актуально только для линейных отношений. Чтобы отключить линию тренда, снимите флажок «Показать линейный тренд» на панели «Свойства диаграммы» или переключите видимость, щелкнув элемент в легенде.

Чтобы изменить цвет линии тренда, щелкните образец цвета линии тренда на панели «Свойства диаграммы» и выберите новый цвет.

Когда малые значения x соответствуют малым значениям y, а большие значения x соответствуют большим значениям y (линия с наклоном вверх), это указывает на положительную корреляцию. Когда малые значения x соответствуют большим значениям y, а большие значения x соответствуют малым значениям y (линия с наклоном вниз), это указывает на отрицательную корреляцию.

Статистическая сила корреляции определяется значением R2. В большинстве случаев следует избегать сильно коррелированных мультиспектральных каналов, потому что их нельзя использовать для надежного отделения множества объектов и материалов от изображений. Диаграммы рассеивания могут помочь определить лучшие некоррелированные каналы, которые можно использовать для выявления и извлечения объектов из мультиспектральных изображений.

Ось

Границы оси

Минимальная и максимальная границы оси по умолчанию устанавливаются на основе диапазона значений данных, представленных на оси. Эти значения можно настроить, введя новое значение привязки оси. Нажатие кнопки сброса возвращает ось, привязанную к значению по умолчанию.

Логарифмическая ось

По умолчанию оси точечной диаграммы отображаются в линейном масштабе. Одну или обе оси можно отобразить в логарифмическом масштабе, установив флажок «Логарифмическая ось» в разделе «Оси» на панели «Свойства диаграммы».

Большинство каналов мультиспектральных изображений имеют значения в пределах одного порядка величины, и использование логарифмической шкалы не требуется. Если изображения были преобразованы в другую область, например, с помощью быстрого преобразования Фурье (БПФ), для анализа может быть полезно отображение амплитудного и фазового сигналов с использованием логарифмических масштабов.

Числовой формат

Числовые значения на оси можно отформатировать, указав категорию числового формата или определив строку пользовательского формата.

Направляющие

Направляющие линии или диапазоны могут быть добавлены к диаграммам в качестве ссылки или способа выделения важных значений. Чтобы добавить новую направляющую, перейдите на вкладку «Направляющие» на панели «Свойства диаграммы» и нажмите «Добавить направляющую». Чтобы нарисовать линию, введите значение, в котором вы хотите провести линию. Чтобы создать диапазон, введите значение. При желании вы можете добавить текст в руководство, указав метку.

Интерактивный анализ

Точечная диаграмма может взаимодействовать с изображениями в виде карты. После настройки точечной диаграммы вы можете в интерактивном режиме выбрать регион в распределении и визуализировать связанные пиксели изображения на карте. Это позволяет вам визуально исследовать распределение значений пикселей, составляющих определенные классы объектов на вашей диаграмме рассеяния, и визуализировать разделение между классами объектов для заданного набора переменных диаграммы рассеяния.

На изображении выше показана группа значений, активированных в распределении Tasseled Cap, с соответствующими пикселями изображения, выделенными на отображении карты. Подсвечиваются только пиксели в определенной интересующей области. Если вы не определили интересующую область, ваш выбор в распределении точечной диаграммы может повлиять на пиксели всего изображения.

Фото сюжет: Как при помощи фотографии рассказать историю: 8 полезных советов

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Пролистать наверх