Keras ilə əmlak qiymətlərini proqnozlaşdırmaq üçün ilk sinir şəbəkənizi necə qurmaq olar

Dərin bir öyrənmə mütəxəssisi kimi bir neçə kod sətirində ilk sinir şəbəkənizi qurmaq üçün addım-addım başlanğıc təlimatı!

İlk sinir şəbəkənizi yazmaq yalnız bir neçə sətir kodla edilə bilər! Bu yazıda, əmlak qiymətlərinin ortalamadan yuxarı və ya aşağı olduğunu proqnozlaşdırmaq üçün ilk sinir şəbəkəmizi yaratmaq üçün Keras adlı paketi necə istifadə edə biləcəyimizi araşdıracağıq. Xüsusilə, bütün dərin öyrənmə boru kəmərindən keçəcəyik:

  • Verilənlərə baxış və işləmə
  • Sinir şəbəkəmizi qurmaq və öyrətmək
  • Zərər və dəqiqliyi görün
  • Sinir şəbəkəmizə qanunauyğunluq əlavə edirik

Yalnız 20 ilə 30 dəqiqə ərzində dərin bir öyrənmə praktikantının kodlaşdırdığı kimi öz sinir şəbəkənizə sahib olacaqsınız!

Tələblər:

Bu yazı, keras, tensorflow, pandas, scikit-learn və matplotlib paketlərinin quraşdırıldığı bir mühitlə bir Jupyter dəftəri qurduğunuzu düşünür. Etməmisinizsə, aşağıdakı təlimatdakı təlimatları izləyin:

  • Dərin öyrənmə və məlumat elmi üçün Python ilə işə başlamaq

Bu, Hissə 1-dəki intuitiv dərin araşdırmanın yoldaşıdır. Buna görə də, həddindən artıq uyğunlaşma və istifadə strategiyaları kimi bəzi detallar daxil olmaqla, sinir şəbəkələri və onların necə işləməsi barədə intuitiv bir anlayışa sahib olduğunuzu düşünürük. Yeniləməyə ehtiyacınız olarsa, bu intuitiv təlimatları oxuyun:

  • İntuitiv Dərin Öyrənmə Hissəsi 1a: Sinir Şəbəkələrinə Giriş
  • İntuitiv Dərin Öyrənmə Hissəsi 1b: Sinir Şəbəkələrinə Giriş

Lazım olacaq mənbələr:

Bu gün istifadə edəcəyimiz verilənlər bazası Zillow-un ev dəyərinin proqnozlaşdırılması Kaggle rəqabətçi məlumatlarından uyğunlaşdırılmışdır. Giriş xüsusiyyətlərinin sayını azaltdıq və ev qiymətinin ortalamadan yuxarı və ya aşağı olduğunu proqnozlaşdırmaq üçün tapşırığı dəyişdirdik. Zəhmət olmasa dəyişdirilmiş məlumat dəstini yükləmək və dəftərinizlə eyni qovluğa yerləşdirmək üçün aşağıdakı linki ziyarət edin. Endirmə işarəsi sağ üst küncdə olmalıdır.

Məlumat dəsti yükləyin

İsteğe bağlı olaraq bu yazının bütün kodlarını ehtiva edən bir izahatlı Jupyter dəftərini yükləyə bilərsiniz: Jupyter Notebook.

Qeyd edək ki, bu dəftəri Github-dan yükləmək üçün ana səhifəyə keçib bütün faylları yükləmək üçün ZIP yükləməlisiniz:

İndi başlayaq!

Verilənlərə baxış və işləmə

ML alqoritmini kodlayabilmək üçün əvvəlcə məlumatlarımızı alqoritmin istədiyi formata gətirməliyik. Xüsusilə, etməliyik:

  • Vergüllə Ayrılmış Dəyərlər (CSV) sənədində oxuyun və massivlərə çevirin. Diziler, alqoritmimizin işləyə biləcəyi bir məlumat formatıdır.
  • Datasımızı giriş xüsusiyyətlərinə (x adlandıracağıq) və etiketə (y deyəcəyik) bölün.
  • Verilənləri miqyaslayın (buna normallaşma deyirik) ki, giriş xüsusiyyətləri oxşar böyüklükdə olsun.
  • Məlumat dəstimizi təlim dəstinə, doğrulama dəstinə və test dəstinə bölün. Bu üç məlumat dəstinə niyə ehtiyacımız olduğuna dair bir yeniləməyə ehtiyacınız varsa, Intuitiv Dərin Öyrənmə Hissəsi 1b-yə baxın.

Beləliklə başlayaq! Dərin Öyrənmə və Məlumat Elmləri üçün Python ilə Başlama təlimindən, pandas paketini mühitinizə yükləməlisiniz. Notebookumuza bu paketi idxal edərək istifadə etdiyimizi söyləməliyik. Aşağıdakı kodu daxil edin və Alt-Enter düymələr kombinasiyasına basın:

pandaları pd olaraq idxal edin

Sadəcə pdas adlı pandas paketindəki koddan bəhs etdiyim deməkdir. Sonra aşağıdakı kod satırını icra edərək CSV sənədini oxuduq:

df = pd.read_csv ('housepricedata.csv')

Bu kod sətri "housepricedata.csv" csv faylını oxuduğumuz (dəftərinizlə eyni qovluqda olmalıdır) və "df" dəyişəninə yazdığımız deməkdir. Df-də nələrin olduğunu öyrənmək istəyiriksə, boz qutuya df yazın və Alt-Enter düyməsini vurun:

df

Notebookunuz belə olmalıdır:

Burada məlumatları bir az araşdıra bilərsiniz. İlk on sütunda giriş funksiyalarımız var:

  • Torpaq sahəsi (m²-də)
  • Ümumi keyfiyyət (miqyas 1-dən 10-a qədər)
  • Ümumi vəziyyət (miqyas 1-dən 10-a qədər)
  • Ümumi zirzəmi sahəsi (m²-də)
  • Vanna otağı sayı
  • Yarım hamam otağı
  • Yerdən yuxarıdakı yataq otağı sayı
  • Yerdəki otaqların ümumi sayı
  • Baca sayı
  • Qaraj sahəsi (m²-də)

Son sütunda proqnozlaşdırmaq istədiyimiz funksiya mövcuddur:

  • Evin qiyməti medianın üstündədir, yoxsa yox? (Bəli üçün 1, yox üçün 0)

Verilərimizin necə göründüyünü gördük, onu maşınımızın işlənməsi üçün massivlərə çevirmək istəyirik:

verilənlər dəsti = df.values

Məlumat çərçivəmizi bir massivə çevirmək üçün df dəyərlərini (df.values-ə daxil olaraq) "verilənlər bazası" dəyişənində saxlayırıq. Bu "verilənlər bazası" dəyişənində nə olduğunu görmək üçün dəftərinizin boz bir qutusuna "verilənlər bazası" daxil edin və hüceyrəni işə salın (Alt-Enter):

qeyd

Gördüyünüz kimi, hər şey indi bir massivdə saxlanılır:

Məlumat çərçivəmizi bir sıra halına çevirin

İndi məlumat dəstimizi giriş xüsusiyyətlərinə (X) və proqnozlaşdırmaq istədiyimiz xüsusiyyətə bölürük (Y). Bunu etmək üçün, sadəcə massivimizin ilk 10 sütunu X adlı dəyişənə, sonuncu sütunu isə Y adlı dəyişənə təyin edirik. İlk tapşırıq üçün kod:

X = məlumat qeydləri [:, 0:10]

Bu biraz qəribə görünə bilər, amma kvadrat mötərizədə nələrin olduğunu izah edim. Vergüldən əvvəl hər şey massivin sətirləri ilə və vergüldən sonra hər şey serialın sütunları ilə əlaqəlidir.

Satırları bölmədiyimiz üçün vergülün qarşısına ":" qoyuruq. Bu, verilənlər bazasındakı bütün satırların X-ə daxil olacağı deməkdir.

İlk 10 sütunu çıxarmaq istəyirik. Buna görə, vergüldən sonra "0:10", 0 ilə 9 arasındakı sütunların X-ə qoyulması deməkdir (sütun 10 daxil edilmir). Sütunlarımız 0 indeksi ilə başlayır, buna görə ilk 10 sütun həqiqətən 0 ilə 9 arasındakı sütunlardır.

Daha sonra massivimizin son sütununu Y-ə təyin edirik:

Y = məlumat qeydləri [:, 10]

Tamam, indi məlumatlarımızı giriş xüsusiyyətlərinə (X) və proqnozlaşdırmaq istədiklərimizin etiketinə ayıraq (Y).

Emalımızdakı növbəti addım giriş xüsusiyyətlərinin miqyasının oxşar olmasını təmin etməkdir. Hal-hazırda ərazi sahəsi kimi xüsusiyyətlər minlərlə əmrdədir, ümumi keyfiyyət 1-dən 10-a qədər qiymətləndirilir və şömine sayı adətən 0, 1 və ya 2-dir.

Bu, bəzi praktik problemlərə səbəb olan sinir şəbəkəsini işə salmağı çətinləşdirir. Məlumatların miqyasını artırmağın bir yolu scikit-learn-dən mövcud bir paketi istifadə etməkdir (onu "Başlarkən" yazısında quraşdırdıq).

Əvvəlcə istifadə etmək istədiyimiz kodu idxal etməliyik:

sklearn idxal ön emalından

Bu, sklearn paketinin əvvəlcədən işlənməsində kodu istifadə etmək istədiyimi söyləyir. Sonra bütün giriş xüsusiyyətlərinin 0 ilə 1 arasında olmasını təmin edən məlumat dəstini tərəziyə gətirən min-max scaler adlı bir funksiyadan istifadə edirik:

min_max_scaler = Preprocessing.MinMaxScaler () X_scale = min_max_scaler.fit_transform (X)

Nəzərə alaq ki, sinir şəbəkəmizin təlimində kömək üçün 0 və 1-i seçdik. Bunun arxasındakı nəzəriyyəni keçməyəcəyik. Miqyaslı məlumat dəstimiz artıq "X_scale" massivində saxlanılır. "X_scale" nin necə göründüyünü görmək istəyirsinizsə, hücrəni işə salın:

X_ miqyaslı

Jupyter dəftəriniz indi belə olmalıdır:

İndi məlumat dəstimizi bir təlim dəsti, bir doğrulama dəsti və bir test dəstinə bölən məlumatların işlənməsində son addımımıza gəldik.

Adından da göründüyü kimi, məlumat dəstimizi bir təlim dəsti və bir test dəstinə ayıran "train_test_split" adlı scikit-learn kodunu istifadə edəcəyik. Əvvəlcə lazım olan kodu idxal edəcəyik:

sklearn.model_selection idxal train_test_split

Sonra verilənlər bazanızı aşağıdakı kimi bölün:

X_train, X_val_and_test, Y_train, Y_val_and_test = train_test_split (X_scale, Y, test_size = 0.3)

Bu, val_and_test ölçüsünün ümumi məlumat bazasının 30% -i olduğunu scikit-learn-ə bildirir. Kod, dəyişən adların təklif etdiyi kimi bölünmüş məlumatları bərabər işarəsinin solundakı ilk dörd dəyişkəndə saxlayır.

Təəssüf ki, bu funksiya bizə məlumat dəstimizi yalnız iki hissəyə bölməyə kömək edir. Ayrı bir doğrulama dəsti və test dəsti istədiyimiz üçün eyni funksiyanı yenidən val_and_test üçün bölmə etmək üçün istifadə edə bilərik:

X_val, X_test, Y_val, Y_test = train_test_split (X_val_and_test, Y_val_and_test, test_size = 0.5)

Yuxarıdakı kod val_and_test ölçüsünü doğrulama dəstinə və test dəstinə bərabər şəkildə bölür.

Xülasə olaraq, indi istifadə edəcəyimiz məlumat dəstləri üçün cəmi altı dəyişən var:

  • X_train (10 giriş funksiyası, bütün məlumat dəstinin 70% -i)
  • X_val (10 giriş xüsusiyyəti, bütün məlumat dəstinin 15% -i)
  • X_test (10 giriş funksiyası, bütün məlumat dəstinin 15% -i)
  • Y_train (1 etiket, bütün məlumat dəstinin 70%)
  • Y_val (1 etiket, bütün məlumat dəstinin% 15)
  • Y_test (1 etiket, bütün məlumat dəstinin 15% -i)

Dizilərin hər biri üçün hansı formaların olduğunu (yəni hansı ölçüdə olduqlarını) görmək istəyirsinizsə, onları işlədin

çap (X_train.shape, X_val.shape, X_test.shape, Y_train.shape, Y_val.shape, Y_test.shape)

Jupyter dəftəriniz belə olmalıdır:

Gördüyünüz kimi, təlim dəsti 1022 məlumat nöqtəsi, qiymətləndirmə və test dəstləri isə hər biri 219 məlumat nöqtəsi ehtiva edir. X dəyişkənlərinin 10 giriş xüsusiyyəti var, Y dəyişənlərinin yalnız bir proqnozlaşdırma xüsusiyyəti var.

İndi də məlumatlarımız nəhayət hazırdır! Oğlum!

Xülasə: Bizdə olan məlumatlar işləndikdə:

  • Vergüllə Ayrılmış Dəyərlər (CSV) sənədində oxuyun və massivlərə çevirin.
  • Datasımızı giriş xüsusiyyətlərinə və etiketə bölün.
  • Verilənləri miqyaslayın ki, giriş xüsusiyyətləri oxşar böyüklükdə olsun.
  • Məlumat dəstimizi təlim dəstinə, doğrulama dəstinə və test dəstinə bölün.

İlk sinir şəbəkəmizi qurmaq və öyrətmək

İntuitiv Dərin Öyrənmə Hissəsi 1a-da maşın öyrənmənin iki mərhələdən ibarət olduğunu söylədik. İlk addım bir şablon (memarlıq) təmin etmək və ikinci addım bu şablonu doldurmaq üçün məlumatlardan ən yaxşı nömrələri tapmaqdır. Kodumuz da bundan sonra bu iki addımı izləyəcək.

İlk addım: memarlığın qurulması

Etməli olduğumuz ilk şey memarlıq qurmaqdır. Əvvəlcə neyron şəbəkə arxitekturasının hansı növünü istədiyimizi düşünək. Tutaq ki, bu sinir şəbəkəsini istəyirik:

Problemimiz üçün istifadə edəcəyimiz neyron şəbəkə arxitekturası

Bir sözlə, bu səviyyələrə sahib olmaq istəyirik:

  • Səviyyə 1:32 gizli neyronlar, ReLU aktivasiyası
  • Gizli səviyyə 2: 32 neyron, ReLU aktivasiyası
  • Çıxış qatı: 1 neyron, sigmoid aktivasiya

İndi Keras üçün bu memarlığı təsvir etməliyik. Ardıcıl modeldən istifadə edəcəyik, yəni yalnız yuxarıdakı qatları sıralamaqla təsvir etməliyik.

Əvvəlcə Keras-dan lazımi kodu idxal edək:

keras.models-dən idxal keras.layers-dən ardıcıl idxal Dense

Ardından ardıcıl Keras modelimizdə aşağıdakı kimi göstəririk:

model = Ardıcıl ([Sıx (32, aktivasiya = 'relu', input_shape = (10,)), Sıx (32, activation = 'relu'), Sıx (1, activation = 'Sigmoid'),])

Və yuxarıdakı kod parçası memarlığımızı dəqiq şəkildə təyin etdi! Yuxarıdakı kod aşağıdakı kimi yozula bilər:

model = Ardıcıl ([...])

Bu o deməkdir ki, modelimizi “model” dəyişkənində saxlayırıq və bir-birinin ardınca (qat-qat) kvadrat mötərizədə təsvir edirik.

Sıx (32, aktivasiya = 'relu', input_shape = (10,)),

İlk təbəqəmizi 32 nöron, ReLU aktivasiyası ilə sıx bir təbəqə olaraq sahibik və giriş forması 10 olduğundan 10 giriş xüsusiyyətimiz var. Diqqət yetirin ki, "sıxlıq" istifadə edəcəyimiz tam əlaqəli bir təbəqəyə aiddir.

Sıx (32, aktivasiya = 'relu'),

İkinci qatımız da 32 neyron olan, ReLU aktivasiyası olan sıx bir təbəqədir. Qeyd edək ki, Keras ilk səviyyəmizin nəticəsindən nəticə çıxara biləcəyi üçün giriş formasını təsvir etməyimizə ehtiyac yoxdur.

Sıx (1, aktivasiya = 'Sigmoid'),

Üçüncü qatımız 1 neyron, siqma aktivasiyası olan sıx bir təbəqədir.

Beləliklə, model memarlığımızı (şablonumuzu) kodu yazdıq!

İkinci addım: ən yaxşı nömrələri daxil edin

İndi memarlığımızı dəqiqləşdirdiyimiz üçün bunun üçün ən uyğun nömrələri tapmalıyıq. Təlimə başlamazdan əvvəl modeli konfiqurasiya etməliyik

  • Optimizasiya üçün hansı alqoritmi istifadə etmək istədiyinizi göstərin
  • Ona hansı itki funksiyasından istifadə edəcəyini söyləyin
  • Ona zərər funksiyasından başqa hansı digər ölçümləri izləmək istədiyinizi söyləyin

Modeli bu parametrlərlə konfiqurasiya etmək üçün model.compile funksiyasını aşağıdakı kimi çağırmalıyıq:

model.compile (optimizer = 'sgd', loss = 'binary_crossentropy', metrics = ['dəqiqlik'])

Model.compile-dən sonra aşağıdakı parametrləri mötərizədə qoyduq:

optimizer = 'sgd'

"Sgd" İntuitiv Dərin Öyrənmənin 1b hissəsində gördüyümüz stoxastik gradyan enməsinə (burada minibatch gradient enməsinə aiddir) istinad edir.

itki = 'ikili_crossentropy'

1 və ya 0 dəyərləri olan çıxışlar üçün zərər funksiyasına ikili çarpaz entropiya deyilir.

metriklər = ['dəqiqlik']

Nəhayət, zərər funksiyasına əlavə dəqiqliyi də izləyək. Bu hüceyrəni işə saldıqdan sonra idman edə bilərik!

Verilənlərin təhsili olduqca sadədir və kod sətri yazmağımızı tələb edir:

hist = model.fit (X_train, Y_train, batch_size = 32, epoxs = 100, validation_data = (X_val, Y_val))

Parametrləri məlumatlara uyğunlaşdırdığımız üçün funksiyaya "uyğun" deyilir. H_train və Y_train kimi hansı məlumatlar üzərində məşq etdiyimizi təyin etməliyik. Sonra mini partiyamızın ölçüsünü təyin etdik və onu nə qədər öyrətmək istədiyimizi (dövrlər). Nəhayət, qiymətləndirmə məlumatlarımızın nə olduğunu göstəririk ki, model bizə hər hansı bir zamanda doğrulama məlumatlarını necə işlədiyimizi izah etsin. Bu funksiya tarix dəyişkənliyi altında saxladığımız bir tarix çıxardır. Bu dəyişəni bir az sonra vizuallaşdırmaya çatdıqda istifadə edəcəyik.

İndi hücrənin çalışmasına icazə verin və necə məşq etdiyinə baxın! Jupyter dəftəriniz belə olmalıdır:

İndi modelin məşq etdiyini görə bilərsiniz! Rəqəmlərə baxsanız, itkinin azaldığını və dəqiqliyin zaman keçdikcə artdığını görə bilməlisiniz. Bu nöqtədə hiperparametrlər və sinir şəbəkəsi arxitekturası ilə təcrübə edə bilərsiniz. Hiperparametrlərinizi düzəltdikdə təliminizin necə dəyişdiyini görmək üçün hüceyrələri yenidən işə salın.

Son modelinizdən razı qalan kimi test dəstində qiymətləndirə bilərik. Test dəstimizin dəqiqliyini müəyyən etmək üçün bu kod parçasını işə salaq:

model.evaluate (X_test, Y_test) [1]

Modeldən sonra indeks 1-ə sahib olmağımızın səbəbi funksiyanı qiymətləndirmək funksiyanın itkini birinci element, ikinci element kimi dəqiqliyi qaytarmasıdır. Yalnız dəqiqliyi çıxarmaq üçün yalnız ikinci elementə daxil olun (birinci element 0-da indeksləşdirməyə başladığı üçün 1 ilə indeksləşdirilir).

Məlumat dəstinin bölünməsindəki təsadüfi və ağırlıqların başlanğıcına görə, hər dəfə dəftərimiz işə salındıqda rəqəmlər və qrafiklər bir qədər fərqlənir. Bununla birlikdə, yuxarıda verilmiş memarlığı təqib etdiyiniz təqdirdə% 80 ilə% 95 arasında bir test dəqiqliyi almalısınız!

Test dəsti üzrə qiymətləndirmə

Və orada səndə var, ilk sinir şəbəkənizi şifrələdiniz və öyrətdiniz! Təbrik edirik!

Xülasə: İlk sinir şəbəkəmizi kodlaşdırmaq üçün yalnız bir neçə sətir kod lazım idi:

  • Keras Ardıcıl Modeli ilə memarlığı təyin edirik.
  • Model.compile ilə bəzi parametrlərimizi (optimallaşdırıcı, itki funksiyası, izləniləcək ölçülər) müəyyənləşdiririk
  • Model.fit ilə təlim məlumatları ilə modelimizi (memarlığımız üçün ən yaxşı parametrləri tapırıq) öyrədirik
  • Modelimizi test dəsti ilə model.evaluate ilə qiymətləndiririk

Zərər və dəqiqliyi görün

İntuitiv Dərinlikli Öyrənmənin 1b hissəsində həddindən artıq uyğunlaşma və bəzi nizamlama üsullarından bəhs etdik. Modelimizin hazırda yenidən işlənib hazırlanmadığını haradan bilək?

Etmək istədiyimiz şey, təlim itkisini və keçmiş dövrlərin sayı üzərində dəyər itkisini cızmaqdır. Bəzi gözəl qrafikləri göstərmək üçün matplotlib paketindən istifadə edirik. Həmişəki kimi istifadə etmək istədiyimiz kodu idxal etməliyik:

plt kimi idxal matplotlib.pyplot

Sonra təlim itkisini və doğrulama itkisini görüntüləmək istəyirik. Bunu etmək üçün bu kod parçasını çalıştırın:

plt.plot (hist.history ['itki']) plt.plot (hist.history ['val_loss']) plt.title ('model itkisi') plt.ylabel ('Zərər') plt.xlabel ('dövr') plt.legend (['Qatar', 'Val'], loc = 'Yuxarı Sağ') plt.show ()

Yuxarıdakı kod parçasının hər sətrini izah edəcəyik. İlk iki sətirdə itki və dəyər itkisini planlamaq istədiyimiz deyilir. Üçüncü sətirdə bu diaqramın adı "Model Loss" verilir. Dördüncü və beşinci sətirlərdə y və x oxları üçün hansı etiketlərdən istifadə edilməli olduğu göstərilir. Altıncı sətirdə diaqramımız üçün bir əfsanə var. Əfsanənin mövqeyi sağ üstdədir. Yeddinci sətir Jupyter Notebook-un qrafiki göstərməsini tələb edir.

Jupyter dəftəriniz belə olmalıdır:

Jupyter dəftərinizdə görməli olduğunuz bir model itkisi qrafiki

Təlim dəqiqliyini və doğrulama dəqiqliyini aşağıdakı kodla təmsil etmək üçün eyni şeyi edə bilərik:

plt.plot (hist.history ['acc']) plt.plot (hist.history ['val_acc']) plt.title ('model dəqiqliyi') plt.ylabel ('dəqiqlik') plt.xlabel ('dövr') plt.legend (['Qatar', 'Val'], loc = 'aşağı sağ') plt.show ()

Buna bənzər bir diaqram almalısınız:

Təlim və qiymətləndirmə dəsti üçün model dəqiqliyi sahəsi

Təlim dəsti üçün modelimizdəki təkmilləşdirmələr müəyyən dərəcədə doğrulama dəstindəki inkişaflarla uyğun olduğundan, modelimizə həddindən artıq uyğunlaşmaq böyük bir problem kimi görünmür.

Xülasə: Təlimi və qiymətləndirmə itkisini / vaxtını dəqiqləşdirmək və modelimizdə həddindən artıq uyğunlaşma olub olmadığını müəyyən etmək üçün matplotlib istifadə edirik.

Sinir şəbəkəmizə qanunauyğunluq əlavə edirik

Sinir şəbəkəmizə qanunauyğunluğun gətirilməsi üçün təlim dəstimizi çox dolduran bir sinir şəbəkəsi ilə işləyirik. Bu modeli 2 adlandırırıq.

model_2 = Ardıcıl ([Sıx (1000, aktivasiya = 'relu', input_shape = (10,)), Sıx (1000, aktivasiya = 'relu'), Sıx (1000, aktivasiya = 'relu'), Sıx (1000, aktivasiya = 'relu'), Dicht (1, aktivasiya = 'Sigmoid'),])
model_2.compile (optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['dəqiqlik'])
hist_2 = model_2.fit (X_train, Y_train, batch_size = 32, epoxs = 100, validation_data = (X_val, Y_val))

Burada daha böyük bir model qurduq və Adam optimizatorunu istifadə edirik. Adam, stokastik qradiyent enməsinə bəzi optimallaşdırmalar əlavə edən, ən az itki ilə funksiyaya daha sürətli çatan ən çox yayılmış optimizatorlardan biridir. Bu kodu işlədiriksə və aşağıdakı kodla hist_2 üçün zərər sahələrini çəksək (kodun "hist" əvəzinə "hist_2" istifadə etməyimiz xaricində eyni olduğunu unutmayın):

plt.plot (hist_2.history ['zərər']) plt.plot (hist_2.history ['val_loss']) plt.title ('model itkisi') plt.ylabel ('Zərər') plt.xlabel ('epoch') plt.legend (['Qatar', 'Val'], loc = 'Yuxarı Sağ') plt.show ()

Belə bir hərəkət alırıq:

Həddindən artıq uyğun model üçün zərər əyriləri

Bu, uyğunlaşmanın açıq bir əlamətidir. Məşq itkisi azalır, lakin doğrulama itkisi məşq itkisindən xeyli çoxdur və artır (20-ci dövrün dönüş nöqtəsindən sonra). Dəqiqliyi aşağıdakı kodla təmsil etsək:

plt.plot (hist_2.history ['acc']) plt.plot (hist_2.history ['val_acc']) plt.title ('model dəqiqliyi') plt.ylabel ('dəqiqlik') plt.xlabel ('dövr') plt.legend (['Qatar', 'Val'], loc = 'aşağı sağ') plt.show ()

Qatarla doğrulama dəqiqliyi arasında daha əhəmiyyətli bir uyğunsuzluğu da görə bilərik:

Həddindən artıq uyğun modelimiz üçün təlim və doğrulama dəqiqliyi

İndi artıq uyğunlaşmanı azaltmaq üçün bəzi strategiyamızı sınayaq (arxitekturamızı ilk modelimizə qaytarmaqdan başqa). Unutmayın, İntuitiv Dərinlikdə Öyrənmə Hissəsi 1b-də həddindən artıq uyğunluğu azaltmaq üçün üç strategiyanı təqdim etdik.

Üçdən, L2 nizamlanmasını və uğursuzluğu buraya daxil edəcəyik. Buraya vaxtından əvvəl dayanma əlavə etməməyimizin səbəbi, ilk iki strategiyanı istifadə etdikdən sonra doğrulama itkisi yuxarıda göstərilən U şəklini almaması və buna görə vaxtından əvvəl dayandırılması o qədər də təsirli olmamasıdır.

Əvvəlcə L2 qanunauyğunluğu və buraxma üçün lazım olan kodu idxal edək:

keras.layers-dən keras idxal düzenleyicisinden buraxma idxal edir

Sonra üçüncü modelimizi belə ifadə edirik:

model_3 = Ardıcıl ([sıxlıq (1000, aktivasiya = 'relu', Kernel_regularizer = nizamlayıcılar. l2 (0.01), Giriş_biçəyi = (10,)) = düzenleyiciler.l2 (0.01)), düşmə (0.3), sıxlıq (1000, aktivasiya = 'relu', kernel_regularizer = düzenleyiciler.l2 (0.01)), düşmə (0.3), sıxlıq (1000, aktivasiya = ' relu ', kernel_regularizer = regularizers.l2 (0.01)), düşmə (0.3), yoğunluq (1, activation =' Sigmoid ', Kernel_regularizer = regularizers.l2 (0.01)),])

Model 3 və Model 2 arasındakı fərqləri deyə bilərsinizmi? İki əsas fərq var:

Fərq 1: L2 qanunauyğunluğunu əlavə etmək üçün hər bir sıx qatımıza bir az əlavə kod əlavə etdiyimizə diqqət yetirin:

kernel_regularizer = müntəzəmləşdiricilər.l2 (0.01)

Bu, Keras-a bu parametrlərin kvadrat dəyərlərini ümumi itki funksiyamıza daxil etməsini və itki funksiyasında 0,01 ilə çəkməsini tələb edir.

Fərq 2: Tərkibi əlavə etmək üçün yeni bir qat əlavə etdik:

Buraxma (0.3),

Bu o deməkdir ki, əvvəlki növbədə olan neyronların məşq zamanı 0,3 uğursuzluq ehtimalı var. Gəlin onu tərtib edək və Model 2 (həddindən artıq uyğun) ilə eyni parametrlərlə işləyək:

model_3.compile (optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['dəqiqlik'])
hist_3 = model_3.fit (X_train, Y_train, batch_size = 32, epochs = 100, validation_data = (X_val, Y_val))

İndi itki və dəqiqlik qrafiklərini çəkək. Zərərin başlanğıcda daha yüksək olduğunu və bunun səbəbi zərər funksiyasını dəyişdirdiyimizi görəcəksən. Zərər üçün pəncərənin 0 ilə 1,2 arasında böyüdülməsi üçün çəkmək üçün əlavə bir kod sətri (plt.ylim) əlavə edirik:

plt.plot (hist_3.history ['zərər']) plt.plot (hist_3.history ['val_loss']) plt.title ('model itkisi') plt.ylabel ('Zərər') plt.xlabel ('epoch') plt.legend (['Qatar', 'Val'], loc = 'Yuxarı Sağ') plt.ylim (yuxarıda = 1,2, aşağıda = 0) plt.show ()

Buna bənzər bir zərər qrafiki görəcəksiniz:

Doğrulama itkisinin təlim itkisinə çox yaxın olduğunu görə bilərsiniz. Bənzər bir kod parçasından istifadə edərək dəqiqliyi təsvir edək:

plt.plot (hist_3.history ['acc']) plt.plot (hist_3.history ['val_acc']) plt.title ('model dəqiqliyi') plt.ylabel ('dəqiqlik') plt.xlabel ('dövr') plt.legend (['Qatar', 'Val'], loc = 'sağ alt') plt.show ()

Və belə bir süjet əldə edəcəyik:

Model 2-dəki modelimizlə müqayisədə həddindən artıq uyğunluğu xeyli azaltdıq! Beləliklə, təlim dəstinin həddindən artıq uyğunlaşmasını azaltmaq üçün nizamlama texnikalarımızı tətbiq edirik.

Xülasə: Həddindən artıq uyğunlaşma ilə məşğul olmaq üçün, hər birini təxminən bir kod sətri ilə aşağıdakı strategiyaları modelimizə daxil edə bilərik:

  • L2 nizamlanması
  • Rədd ol

Təlimin / doğrulamanın itkisini və dəqiqliyini təsəvvür etsək, bu əlavələrin həddən artıq uyğunlaşmasına səbəb olduğunu görə bilərik!

Birləşdirilmiş xülasə:

Bu yazıda Python kodunu yazdıq:

  • Məlumatları araşdırın və işləyin
  • Sinir şəbəkəmizi qurun və öyrədin
  • Zərər və dəqiqliyi görün
  • Sinir şəbəkəmizə qanunauyğunluq əlavə edin

Çox şey yaşamışıq, amma çox sətir kod yazmırıq! Sinir şəbəkəmizin qurulması və təhsili yalnız təxminən 4-5 satır kod çəkdi və fərqli model arxitekturaları ilə təcrübələr aparmaq sadəcə fərqli səviyyələrdə dəyişdirmə və ya fərqli hiperparametrləri dəyişdirmək üçün sadə bir məsələdir. Əslində Keras, sinir şəbəkələrimizi qurmağı çox asanlaşdırdı və biz onu görüntü işlənməsi və təbii dil emalı sahəsində daha inkişaf etmiş tətbiqetmələr üçün istifadə etməyə davam edəcəyik.

Nə var? Növbəti Kodlama Yoldaşımız, Hissə 2-də şəkilləri tanımaq üçün öz Konvolutional Sinir Şəbəkələrimizin (CNN) kodlaşdırılmasını araşdıracağıq.

Burada CNN-lərlə başlayın: İntuitiv Dərin Öyrənmə Hissə 2: Kompüter Vizyonu üçün CNN-lər

Müəllif haqqında:

Salam, mənim adım Joseph! Bu yaxınlarda Stanford Universitetindən məzun oldum, burada Stanford Maşın Təlim Qrupunda Andrew Ng ilə çalışdım. Dərin öyrənmə konsepsiyalarını hər kəs üçün mümkün qədər intuitiv və başa düşülən etmək istəyirəm, bu da nəşrimi motivasiya etdi: İntuitiv dərin öyrənmə.