Класификација слика ТенсорФлов: Све што треба да знате о класификаторима зграда



Овај чланак о класификацији слика ТенсорФлов пружиће вам детаљно и свеобухватно знање о класификацији слика.

Класификација слика задатак који чак и беба може да уради за неколико секунди, али за машину је то био тежак задатак до недавних напретка у и Дубоко учење . Самовозећи аутомобили могу да открију предмете и предузимају потребне радње у реалном времену, а већина тога је могућа због тога Класификација слика. У овом чланку ћу вас водити кроз следеће теме:

Шта је ТенсорФлов?

ТенсорФлов је Гоогле-ов Оквир за машинско учење отвореног кода за програмирање тока података за низ задатака. Чворови на графикону представљају математичке операције, док ивице графикона представљају вишедимензионалне низове података који се међусобно комуницирају.





TensorFlow-Image-Recognition
Тензори су само вишедимензионални низови, проширење дводимензионалних табела на податке веће димензије. Постоје многе карактеристике Тенсорфлов-а што га чини погодним за дубоко учење, а основна библиотека отвореног кода вам помаже да развијете и обучите МЛ моделе.

Шта је класификација слика?

Намера Класификације слика је да категорише све пикселе на дигиталној слици у један од неколико покривач земљишта класе или Теме . Ови категоризовани подаци могу се затим користити за производњу тематске мапе земљишног покривача присутног на слици.



Сада, у зависности од интеракције између аналитичара и рачунара током класификације, постоје две врсте класификације:



  • Надгледани &
  • Без надзора

Дакле, без губљења времена, ускочимо у ТенсорФлов класификацију слика. Имам 2 примера: лак и тежак. Наставимо са лаганим.

Класификација слика ТенсорФлов: Мода МНИСТ

Модни МНИСТ скуп података

Овде ћемо користити Фасхион МНИСТ Датасет, који садржи 70.000 слика у сивим скалама у 10 категорија. 60000 ћемо користити за тренинг, а остатак 10000 за потребе тестирања. Фасхион МНИСТ-у можете приступити директно са ТенсорФлов-а, само увезите и учитајте податке.

  • Увезимо прво библиотеке
из __футуре__ импорт абсолуте_импорт, дивисион, принт_фунцтион # ТенсорФлов и тф.керас импорт тенсорфлов ас тф фром тенсорфлов импорт керас # Помоћне библиотеке увозе нумпи као нп импорт матплотлиб.пиплот као плт
  • Учитајмо податке
фасхион_мнист = керас.датасетс.фасхион_мнист (траин_имагес, траин_лабелс), (тест_имагес, тест_лабелс) = фасхион_мнист.лоад_дата ()
  • Даље ћемо мапирати слике у разреде
цласс_намес = ['Мајица / горњи део', 'Панталоне', 'Пуловер', 'Хаљина', 'Капут', 'Сандала', 'Кошуља', 'Патике', 'Торба', 'Глежњача']
  • Истраживање података
траин_имагес.облик 
# Свака ознака је између 0-9
траин_лабелс 
тест_имагес.облик
  • Сада је време за обраду података.
плт.фигура() плт.имсхов(траин_имагес[0]) плт.цолорбар() плт.решетка(Нетачно) плт.Прикажи() 
#Ако прегледате прву слику у комплету за обуку, видећете да вредности пиксела падају у опсег од 0 до 255.

  • Морамо да прилагодимо слике од 0-1 да бисмо их унели у неуронску мрежу
траин_имагес = траин_имагес / 255.0 тест_имагес = тест_имагес / 255.0
  • Прикажимо неке слике.
плт.фигура(фигсизе=(10,10))) за и у домет(25): плт.подзаплет(5,5,и+један) плт.ктицкс([]) плт.итицкс([]) плт.решетка(Нетачно) плт.имсхов(траин_имагес[и], цмап=плт.центиметар.бинарни) плт.клабел(имена_разреда[траин_лабелс[и]]) плт.Прикажи()
 

  • Подесите слојеве
модел = тешко.Редни([ тешко.слојеви.Поравнати(инпут_схапе=(28, 28)), тешко.слојеви.Густо(128, активација=тф.бр.релу), тешко.слојеви.Густо(10, активација=тф.бр.софтмак) ])
  • Саставите модел
модел.саставити(оптимизер='адам', губитак='спарсе_цатегорицал_цроссентропи', метрике=['тачност'])
  • Модел Траининг
модел.фит(траин_имагес, траин_лабелс, епохе=10)

  • Процењивање тачности
тест_лосс, тест_ацц = модел.проценити, оценити(тест_имагес, тест_лабелс) штампати('Тестирај тачност:', тест_ацц)

  • Израда предвиђања
предвиђања = модел.предвидјети(тест_имагес)
предвиђања[0]

Предвиђање је низ од 10 бројева. Они описују „самопоуздање“ модела да слика одговара сваком од 10 различитих одевних предмета. Можемо видети која етикета има највећу вредност поверења.

на пример..аргмак(предвиђања[0])#Модел је најсигурнији да је реч о чизми за зглоб. Да видимо да ли је тачно

Излаз: 9

тест_лабелс[0]

Излаз: 9

предности и недостаци питхона
  • Сада је време да погледамо комплет 10 канала
деф плот_имаге(и, предвиђање_ низ, труе_лабел, имг): предвиђање_ низ, труе_лабел, имг = предвиђање_ низ[и], труе_лабел[и], имг[и] плт.решетка(Нетачно) плт.ктицкс([]) плт.итицкс([]) плт.имсхов(имг, цмап=плт.центиметар.бинарни) предвидјена_знака = на пример..аргмак(предвиђање_ низ) ако предвидјена_знака == труе_лабел: боја = 'зелена' иначе: боја = 'нето' плт.клабел('{} {: 2.0ф}% ({}) '.формат(имена_разреда[предвидјена_знака], 100*на пример..макс(предвиђање_ низ), имена_разреда[труе_лабел]), боја=боја) деф плот_валуе_арраи(и, предвиђање_ низ, труе_лабел): предвиђање_ низ, труе_лабел = предвиђање_ низ[и], труе_лабел[и] плт.решетка(Нетачно) плт.ктицкс([]) плт.итицкс([]) тхисплот = плт.бар(домет(10), предвиђање_ низ, боја='# 777777') плт.илим([0, један]) предвидјена_знака = на пример..аргмак(предвиђање_ низ) тхисплот[предвидјена_знака].сет_цолор('нето') тхисплот[труе_лабел].сет_цолор('зелена')
  • Погледајмо прво 0. и 10. слику
и = 0 плт.фигура(фигсизе=(6,3))) плт.подзаплет(један,2,један) плот_имаге(и, предвиђања, тест_лабелс, тест_имагес) плт.подзаплет(један,2,2) плот_валуе_арраи(и, предвиђања, тест_лабелс) плт.Прикажи()

и = 10 плт.фигура(фигсизе=(6,3))) плт.подзаплет(један,2,један) плот_имаге(и, предвиђања, тест_лабелс, тест_имагес) плт.подзаплет(један,2,2) плот_валуе_арраи(и, предвиђања, тест_лабелс) плт.Прикажи()

  • Хајде сада да нацртамо неколико слика и њихова предвиђања. Тачни су зелени, док су нетачни црвени.
нум_ровс = 5 нум_цолс = 3 нум_имагес = нум_ровс*нум_цолс плт.фигура(фигсизе=(2*2*нум_цолс, 2*нум_ровс))) за и у домет(нум_имагес): плт.подзаплет(нум_ровс, 2*нум_цолс, 2*и+један) плот_имаге(и, предвиђања, тест_лабелс, тест_имагес) плт.подзаплет(нум_ровс, 2*нум_цолс, 2*и+2) плот_валуе_арраи(и, предвиђања, тест_лабелс) плт.Прикажи()

  • Коначно, користићемо обучени модел за предвиђање једне слике.
# Ухватите слику из скупа података за тестирање имг = тест_имагес[0] штампати(имг.облик)
# Додајте слику у групу у којој је једини члан. имг = (на пример..екпанд_димс(имг,0))) штампати(имг.облик)
предвиђања_јединачно = модел.предвидјети(имг) штампати(предвиђања_јединачно)

плот_валуе_арраи(0, предвиђања_јединачно, тест_лабелс) плт.ктицкс(домет(10), имена_разреда, ротација=Четири, пет) плт.Прикажи()

  • Као што видите, предвиђање за нашу једину слику у серији.
резултат предвиђања = на пример..аргмак(предвиђања_јединачно[0])

Излаз: 9

ЦИФАР-10: ЦНН

Скуп података ЦИФАР-10 састоји се од авиона, паса, мачака и других објеката. Претходно ћете обрадити слике, а затим на свим узорцима тренирати конволуциону неуронску мрежу. Слике треба нормализовати, а налепнице морају бити кодиране на један врући начин. Овај случај употребе сигурно ће разјаснити ваше сумње у вези са класификацијом слика ТенсорФлов.

  • Преузимање података
од урллиб.рекуест увоз урлретриеве од ос.патх увоз исфиле, је чађа од ткдм увоз ткдм увоз тарфиле цифар10_датасет_фолдер_патх = 'цифар-10-батцх-пи' класа ДовнлоадПрогресс(ткдм): ласт_блоцк = 0 деф кука(себе, блоцк_нум=један, блоцк_сизе=један, Укупна површина=Ниједан): себе.укупно = Укупна површина себе.ажурирање((блоцк_нум - себе.ласт_блоцк) * блоцк_сизе) себе.ласт_блоцк = блоцк_нум '' проверите да ли је датотека са подацима (зип) већ преузета ако не, преузмите га са 'хттпс://ввв.цс.торонто.еду/~криз/цифар-10-питхон.тар.гз' и сачувајте као цифар-10-питхон.тар.гз '' ако не исфиле('цифар-10-питхон.тар.гз'): са ДовнлоадПрогресс(јединица='Б', унит_сцале=Истина, минитерс=један, десц=„ЦИФАР-10 скуп података“) као што пбар: урлретриеве( 'хттпс://ввв.цс.торонто.еду/~криз/цифар-10-питхон.тар.гз', 'цифар-10-питхон.тар.гз', пбар.кука) ако не је чађа(цифар10_датасет_фолдер_патх): са тарфиле.отворен('цифар-10-питхон.тар.гз') као што катран: катран.ектрацталл() катран.Близу()
  • Увоз потребних библиотека
увоз кисели краставац увоз нумпи као што на пример. увоз матплотлиб.пиплот као што плт
  • Разумевање података

Првобитна серија података је 10000 × 3072 тензор изражен у нумпи низу, где је 10000 број података узорка. Слика је у боји и величине 32 × 32. Храњење се може обавити у формату (ширина к висина к број_канал) или (број_канал к ширина к висина). Дефинишимо ознаке.

деф лоад_лабел_намес(): повратак ['авион', 'аутомобил', 'птица', 'мачка', 'јелен', 'пас', 'жаба', 'коњ', 'брод', 'камион']
  • Преобликовање података

Преобликоваћемо податке у две фазе

Прво поделите вектор реда (3072) на 3 дела. Сваки комад одговара сваком каналу. Резултат је (3 к 1024) димензија тензора. Затим поделите резултујући тензор из претходног корака са 32. 32 овде значи ширину слике. Резултат је (3к32к32).

Друго, морамо да пренесемо податке са (нум_цханнел, видтх, хеигхт) у (видтх, хеигхт, нум_цханнел). За то ћемо користити функцију транспоновања.

деф лоад_цфар10_батцх(цифар10_датасет_фолдер_патх, батцх_ид): са отворен(цифар10_датасет_фолдер_патх + '/ дата_батцх_' + стр(батцх_ид), моду='рб') као што датотека: # напомена врста кодирања је 'латин1' батцх = кисели краставац.оптерећење(датотека, кодирање='латин1') Карактеристике = батцх['подаци'].преобликовати((лен(батцх['подаци']), 3, 32, 32))).транспоновати(0, 2, 3, један) етикете = батцх['етикете'] повратак Карактеристике, етикета
  • Истраживање података
деф дисплаи_статс(цифар10_датасет_фолдер_патх, батцх_ид, сампле_ид): Карактеристике, етикете = лоад_цфар10_батцх(цифар10_датасет_фолдер_патх, батцх_ид) ако не (0 <= сампле_ид < лен(Карактеристике)): штампати('{}узорци у серији{}.{}је ван домета. '.формат(лен(Карактеристике), батцх_ид, сампле_ид))) повратак Ниједан штампати(' Статистика серије #{}: '.формат(батцх_ид))) штампати('Број узорака:{} '.формат(лен(Карактеристике))) лабел_намес = лоад_лабел_намес() лабел_цоунтс = дицт(зип(*на пример..јединствен(етикете, ретурн_цоунтс=Истина))) за кључ, вредност у лабел_цоунтс.предмета(): штампати('Број етикета од [{}] ({}):{}'.формат(кључ, лабел_намес[кључ].горња(), вредност))) сампле_имаге = Карактеристике[сампле_ид] сампле_лабел = етикете[сампле_ид] штампати(' Пример слике{}: '.формат(сампле_ид))) штампати(Слика - Минимална вредност:{}Максимална вредност:{}'.формат(сампле_имаге.мин(), сампле_имаге.макс())) штампати('Слика - облик:{}'.формат(сампле_имаге.облик))) штампати('Ознака - Ид ознаке:{}Име:{}'.формат(сампле_лабел, лабел_намес[сампле_лабел])) плт.имсхов(сампле_имаге)
%матплотлиб у реду %цонфиг ИнлинеБацкенд.фигуре_формат = 'мрежњача' увоз нумпи као што на пример. # Истражите скуп података батцх_ид = 3 сампле_ид = 7000 дисплаи_статс(цифар10_датасет_фолдер_патх, батцх_ид, сампле_ид)

  • Имплементација функција предобраде

Нормализоваћемо податке помоћу Мин-Мак нормализације. Ово једноставно чини да се све к вредности крећу између 0 и 1.
и = (к-мин) / (мак-мин)

деф нормализовати(Икс): '' расправа - к: унос података о слици у нумпи низ [32, 32, 3] повратак - нормализовано х '' мин_вал = на пример..мин(Икс) мак_вал = на пример..макс(Икс) Икс = (Икс-мин_вал) / (мак_вал-мин_вал) повратак Икс
  • Оне-Хот Енцоде
деф оне_хот_енцоде(Икс): '' расправа - к: листа етикета повратак - једна матрица врућег кодирања (број етикета, број класе) '' кодирано = на пример..нуле((лен(Икс), 10))) за идк, сати у набројати(Икс): кодирано[идк] [сати] = један повратак кодирано
  • Претходно обрадите и сачувајте податке
деф _препроцесс_анд_саве(нормализовати, оне_хот_енцоде, Карактеристике, етикете, назив документа): Карактеристике = нормализовати(Карактеристике) етикете = оне_хот_енцоде(етикете) кисели краставац.Депонија((Карактеристике, етикете), отворен(назив документа, 'вб'))) деф препроцесс_анд_саве_дата(цифар10_датасет_фолдер_патх, нормализовати, оне_хот_енцоде): н_батцхес = 5 валид_феатурес = [] валид_лабелс = [] за батцх_и у домет(један, н_батцхес + један): Карактеристике, етикете = лоад_цфар10_батцх(цифар10_датасет_фолдер_патх, батцх_и) # пронађи индекс као тачку као податке за проверу ваљаности у целом скупу података серије (10%) индек_оф_валидатион = инт(лен(Карактеристике) * 0.1) # унапред обрадите 90% целог скупа података серије # - нормализовање карактеристика # - оне_хот_енцоде етикете # - сачувај у новој датотеци под називом, 'препроцесс_батцх_' + батцх_нумбер # - свака датотека за сваку серију _препроцесс_анд_саве(нормализовати, оне_хот_енцоде, Карактеристике[:-индек_оф_валидатион], етикете[:-индек_оф_валидатион], 'препроцесс_батцх_' + стр(батцх_и) + '.п') # за разлику од скупа података о обуци, низ података за валидацију ће се додати кроз све скупове података # - узмите 10% целокупног скупа података серије # - додајте их на листу # - ваљане_карактеристике # - важеће_налепнице валид_феатурес.проширити(Карактеристике[-индек_оф_валидатион:]) валид_лабелс.проширити(етикете[-индек_оф_валидатион:]) # унапријед обрадити сав низ наслаганих података _препроцесс_анд_саве(нормализовати, оне_хот_енцоде, на пример..низ(валид_феатурес), на пример..низ(валид_лабелс), 'препроцесс_валидатион.п') # учитавање скупа података за тестирање са отворен(цифар10_датасет_фолдер_патх + '/ тест_батцх', моду='рб') као што датотека: батцх = кисели краставац.оптерећење(датотека, кодирање='латин1') # унапред обрадити податке о тестирању тест_феатурес = батцх['подаци'].преобликовати((лен(батцх['подаци']), 3, 32, 32))).транспоновати(0, 2, 3, један) тест_лабелс = батцх['етикете'] # Обрадите и сачувајте све податке о тестирању _препроцесс_анд_саве(нормализовати, оне_хот_енцоде, на пример..низ(тест_феатурес), на пример..низ(тест_лабелс), 'препроцесс_траининг.п')
препроцесс_анд_саве_дата(цифар10_датасет_фолдер_патх, нормализовати, оне_хот_енцоде)
  • Цхецкпоинт
увоз кисели краставац валид_феатурес, валид_лабелс = кисели краставац.оптерећење(отворен('препроцесс_валидатион.п', моду='рб')))
  • Изградња мреже

Цео модел се састоји од укупно 14 слојева.

увоз тенсорфлов као што тф деф цонв_нет(Икс, кееп_проб): цонв1_филтер = тф.Променљива(тф.скраћени_нормални(облик=[3, 3, 3, 64], значити=0, стддев=0.08))) цонв2_филтер = тф.Променљива(тф.скраћени_нормални(облик=[3, 3, 64, 128], значити=0, стддев=0.08))) цонв3_филтер = тф.Променљива(тф.скраћени_нормални(облик=[5, 5, 128, 256], значити=0, стддев=0.08))) цонв4_филтер = тф.Променљива(тф.скраћени_нормални(облик=[5, 5, 256, 512], значити=0, стддев=0.08))) # 1, 2 цонв1 = тф.бр.цонв2д(Икс, цонв1_филтер, кораци=[један,један,један,један], паддинг='ИСТИ') цонв1 = тф.бр.релу(цонв1) цонв1_поол = тф.бр.мак_поол(цонв1, ксизе=[један,2,2,један], кораци=[један,2,2,један], паддинг='ИСТИ') цонв1_бн = тф.слојеви.батцх_нормализатион(цонв1_поол) # 3. 4 цонв2 = тф.бр.цонв2д(цонв1_бн, цонв2_филтер, кораци=[један,један,један,један], паддинг='ИСТИ') цонв2 = тф.бр.релу(цонв2) цонв2_поол = тф.бр.мак_поол(цонв2, ксизе=[један,2,2,један], кораци=[један,2,2,један], паддинг='ИСТИ') цонв2_бн = тф.слојеви.батцх_нормализатион(цонв2_поол) # 5, 6 цонв3 = тф.бр.цонв2д(цонв2_бн, цонв3_филтер, кораци=[један,један,један,један], паддинг='ИСТИ') цонв3 = тф.бр.релу(цонв3) цонв3_поол = тф.бр.мак_поол(цонв3, ксизе=[један,2,2,један], кораци=[један,2,2,један], паддинг='ИСТИ') цонв3_бн = тф.слојеви.батцх_нормализатион(цонв3_поол) # 7, 8 цонв4 = тф.бр.цонв2д(цонв3_бн, цонв4_филтер, кораци=[један,један,један,један], паддинг='ИСТИ') цонв4 = тф.бр.релу(цонв4) цонв4_поол = тф.бр.мак_поол(цонв4, ксизе=[један,2,2,један], кораци=[један,2,2,један], паддинг='ИСТИ') цонв4_бн = тф.слојеви.батцх_нормализатион(цонв4_поол) # 9 раван = тф.допринос.слојеви.изравнати(цонв4_бн) # 10 фулл1 = тф.допринос.слојеви.потпуно_повезана(улази=раван, нум_оутпутс=128, ацтиватион_фн=тф.бр.релу) фулл1 = тф.бр.одустати(фулл1, кееп_проб) фулл1 = тф.слојеви.батцх_нормализатион(фулл1) # Једанаест фулл2 = тф.допринос.слојеви.потпуно_повезана(улази=фулл1, нум_оутпутс=256, ацтиватион_фн=тф.бр.релу) фулл2 = тф.бр.одустати(фулл2, кееп_проб) фулл2 = тф.слојеви.батцх_нормализатион(фулл2) # 12 фулл3 = тф.допринос.слојеви.потпуно_повезана(улази=фулл2, нум_оутпутс=512, ацтиватион_фн=тф.бр.релу) фулл3 = тф.бр.одустати(фулл3, кееп_проб) фулл3 = тф.слојеви.батцх_нормализатион(фулл3) # 13 фулл4 = тф.допринос.слојеви.потпуно_повезана(улази=фулл3, нум_оутпутс=1024, ацтиватион_фн=тф.бр.релу) фулл4 = тф.бр.одустати(фулл4, кееп_проб) фулл4 = тф.слојеви.батцх_нормализатион(фулл4) # 14 напоље = тф.допринос.слојеви.потпуно_повезана(улази=фулл3, нум_оутпутс=10, ацтиватион_фн=Ниједан) повратак напоље
  • Хиперпараметри
епохе = 10 батцх_сизе = 128 кееп_пробабилити = 0.7 леарнинг_рате = 0,001
логитс = цонв_нет(Икс, кееп_проб) модел = тф.идентитет(логитс, име='логитс') # Наме логитс Тенсор, тако да се може учитати са диска након тренинга # Губитак и оптимизатор трошак = тф.смањити_значити(тф.бр.софтмак_цросс_ентропи_витх_логитс(логитс=логитс, етикете=И.))) оптимизер = тф.воз.АдамОптимизер(леарнинг_рате=леарнинг_рате).минимизирати(трошак) # Тачност исправно_пред = тф.једнак(тф.аргмак(логитс, један), тф.аргмак(И., један))) тачност = тф.смањити_значити(тф.цаст(исправно_пред, тф.флоат32), име='тачност')
  • Обучите неуронску мрежу
# Једнократна оптимизација 
деф
траин_неурал_нетворк(седница, оптимизер, кееп_пробабилити, феатуре_батцх, лабел_батцх): седница.трцати(оптимизер, феед_дицт={ Икс: феатуре_батцх, И.: лабел_батцх, кееп_проб: кееп_пробабилити })
# Приказивање статистике деф принт_статс(седница, феатуре_батцх, лабел_батцх, трошак, тачност): губитак = сесс.трцати(трошак, феед_дицт={ Икс: феатуре_батцх, И.: лабел_батцх, кееп_проб: један. }) валид_ацц = сесс.трцати(тачност, феед_дицт={ Икс: валид_феатурес, И.: валид_лабелс, кееп_проб: један. }) штампати('Губитак:{:> 10.4ф}Тачност потврде:{: .6ф}'.формат(губитак, валид_ацц)))
  • Потпуна обука и чување модела
деф батцх_феатурес_лабелс(Карактеристике, етикете, батцх_сизе): '' Поделите карактеристике и етикете на серије '' за почетак у домет(0, лен(Карактеристике), батцх_сизе): крај = мин(почетак + батцх_сизе, лен(Карактеристике))) принос Карактеристике[почетак:крај], етикете[почетак:крај] деф лоад_препроцесс_траининг_батцх(батцх_ид, батцх_сизе): '' Учитајте податке о обрађеној обуци и вратите их у групама или мање '' назив документа = 'препроцесс_батцх_' + стр(батцх_ид) + '.п' Карактеристике, етикете = кисели краставац.оптерећење(отворен(назив документа, моду='рб'))) # Вратите податке о обуци у групама величине или мање повратак батцх_феатурес_лабелс(Карактеристике, етикете, батцх_сизе)
# Спремање модела и путање 
саве_модел_патх
= './класификација_слика' штампати('Обука...') са тф.Седница() као што сесс: # Иницијализација променљивих сесс.трцати(тф.глобал_вариаблес_инитиализер()) # Циклус тренинга за епоха у домет(епохе): # Прелистајте све серије н_батцхес = 5 за батцх_и у домет(један, н_батцхес + један): за батцх_феатурес, батцх_лабелс у лоад_препроцесс_траининг_батцх(батцх_и, батцх_сизе): траин_неурал_нетворк(сесс, оптимизер, кееп_пробабилити, батцх_феатурес, батцх_лабелс) штампати('Епоха{:> 2}, Серија ЦИФАР-10{}: '.формат(епоха + један, батцх_и), крај='') принт_статс(сесс, батцх_феатурес, батцх_лабелс, трошак, тачност) # Сачувај модел штедиша = тф.воз.Савер() саве_патх = штедиша.сачувати(сесс, саве_модел_патх)

Сада је завршен важан део Тенсорфлов класификације слика. Сада је време да тестирамо модел.

  • Тестирање модела
увоз кисели краставац увоз нумпи као што на пример. увоз матплотлиб.пиплот као што плт од склеарн.препроцессинг увоз ЛабелБинаризер деф батцх_феатурес_лабелс(Карактеристике, етикете, батцх_сизе): '' Поделите карактеристике и етикете на серије '' за почетак у домет(0, лен(Карактеристике), батцх_сизе): крај = мин(почетак + батцх_сизе, лен(Карактеристике))) принос Карактеристике[почетак:крај], етикете[почетак:крај] деф дисплаи_имаге_предицтионс(Карактеристике, етикете, предвиђања, топ_н_предицтионс): н_цлассес = 10 лабел_намес = лоад_лабел_намес() лабел_бинаризер = ЛабелБинаризер() лабел_бинаризер.фит(домет(н_цлассес))) лабел_идс = лабел_бинаризер.инверсе_трансформ(на пример..низ(етикете))) шипак, секире = плт.подзавере(нровс=топ_н_предицтионс, нцолс=2, фигсизе=(двадесет, 10))) шипак.тигхт_лаиоут() шипак.суптитле('Софтмак предвиђања', фонтсизе=двадесет, И.=1.1) н_предицтионс = 3 маржа = 0,05 инд = на пример..аранге(н_предицтионс) ширина = (један. - 2. * маржа) / н_предицтионс за имаге_и, (одлика, лабел_ид, пред_индициес, пред_вредности) у набројати(зип(Карактеристике, лабел_идс, предвиђања.индекси, предвиђања.вредности)): ако (имаге_и < топ_н_предицтионс): пред_намес = [лабел_намес[пред_и] за пред_и у пред_индициес] тачно_име = лабел_намес[лабел_ид] секире[имаге_и] [0].имсхов((одлика*255).астипе(на пример..инт32, копија=Нетачно))) секире[имаге_и] [0].сет_титле(тачно_име) секире[имаге_и] [0].сет_акис_офф() секире[имаге_и] [један].барх(инд + маржа, пред_вредности[:3], ширина) секире[имаге_и] [један].сет_итицкс(инд + маржа) секире[имаге_и] [један].сет_итицклабелс(пред_намес[::-један]) секире[имаге_и] [један].сет_ктицкс([0, 0.5, 1.0])
%матплотлиб у реду %цонфиг ИнлинеБацкенд.фигуре_формат = 'мрежњача' увоз тенсорфлов као што тф увоз кисели краставац увоз случајни саве_модел_патх = './класификација_слика' батцх_сизе = 64 н_самплес = 10 топ_н_предицтионс = 5 деф тест_модел(): тест_феатурес, тест_лабелс = кисели краставац.оптерећење(отворен('препроцесс_траининг.п', моду='рб'))) лоадед_грапх = тф.Графикон() са тф.Седница(граф=лоадед_грапх) као што сесс: # Учитај модел утоваривач = тф.воз.импорт_мета_грапх(саве_модел_патх + '.мета') утоваривач.обновити(сесс, саве_модел_патх) # Набавите тензоре из учитаног модела лоадед_к = лоадед_грапх.гет_тенсор_би_наме('инпут_к: 0') лоадед_и = лоадед_грапх.гет_тенсор_би_наме('оутпут_и: 0') лоадед_кееп_проб = лоадед_грапх.гет_тенсор_би_наме('кееп_проб: 0') лоадед_логитс = лоадед_грапх.гет_тенсор_би_наме('логитс: 0') лоадед_ацц = лоадед_грапх.гет_тенсор_би_наме('тачност: 0') # Добијте тачност у групама ради ограничења меморије тест_батцх_ацц_тотал = 0 тест_батцх_цоунт = 0 за траин_феатуре_батцх, траин_лабел_батцх у батцх_феатурес_лабелс(тест_феатурес, тест_лабелс, батцх_сизе): тест_батцх_ацц_тотал + = сесс.трцати( лоадед_ацц, феед_дицт={лоадед_к: траин_феатуре_батцх, лоадед_и: траин_лабел_батцх, лоадед_кееп_проб: 1.0}) тест_батцх_цоунт + = један штампати('Испитивање тачности:{} '.формат(тест_батцх_ацц_тотал/тест_батцх_цоунт))) # Штампање случајних узорака рандом_тест_феатурес, рандом_тест_лабелс = тупле(зип(*случајни.узорак(листа(зип(тест_феатурес, тест_лабелс)), н_самплес))) рандом_тест_предицтионс = сесс.трцати( тф.бр.топ_к(тф.бр.софтмак(лоадед_логитс), топ_н_предицтионс), феед_дицт={лоадед_к: рандом_тест_феатурес, лоадед_и: рандом_тест_лабелс, лоадед_кееп_проб: 1.0}) дисплаи_имаге_предицтионс(рандом_тест_феатурес, рандом_тест_лабелс, рандом_тест_предицтионс, топ_н_предицтионс) тест_модел()

Излаз: Тачност тестирања: 0,5882762738853503

Ако тренирате своју неуронску мрежу за више епоха или промените функцију активације, можда ћете добити другачији резултат који може имати бољу тачност.

Дакле, овим смо дошли до краја овог чланка о класификацији слика ТенсорФлов. Сигуран сам да сада можете да користите исте за класификацију било које врсте слика, а нисте почетник у класификацији слика.

Едурека са Питхон сертификационим тренингом припремају професионалци у складу са индустријским захтевима и захтевима. Савладаћете концепте као што су СофтМак функција, Неуронске мреже аутоматског кодирања, Ограничена Болтзманнова машина (РБМ), Керас и ТФЛеарн. Курс су посебно припремили индустријски стручњаци са студијама случајева у стварном времену.