Amerikan draması "Silikon Vadisi" nde "sosisli sandviç" uygulamasını oluşturmak için TensorFlow ve Keras'ı nasıl kullanacağınızı öğretin

Kaynak: Mechanical Chicken

Eser sahibi: Yaoyao

Bu makalenin uzunluğu 10000 kelime , Okumanız tavsiye edilir 20 dakika +

Bu makale size kendi uygulamanızı nasıl geliştireceğinizi öğretir ~

HBOnun hit dizisi "Silikon Vadisi" kısa süre önce "sosisli sandviçleri" tanıyan ve "sosisli sandviçleri" tanımayan bir yapay zeka uygulaması başlattı (Jian Yang'ın gösterinin dördüncü sezonunun dördüncü bölümünde gösterdiği gibi). Şu anda Android ve iOS'ta mevcuttur, ancak yalnızca ABD ve Kanada'daki kullanıcılar içindir.

Yemeğin bir fotoğrafını çektiğinizde (veya telefonunuzdaki fotoğrafı kullanabilirsiniz), size nesnenin "Hotdog or Not Hotdog" olduğunu söyleyecektir. Yaptığı şey budur.Tüm uygulama çok basittir.

Sosisli sandviçleri doğru bir şekilde tanımlamak için yazar, doğrudan bir cep telefonunda çalıştırılabilen ve onu eğitmek için TensorFlow, Keras ve Nvidia GPU kullanan bir sinir ağı yapısı geliştirdi.

İşlev saçma olsa da, bu uygulama derin öğrenme ve uç hesaplamanın (uç hesaplama) oldukça çalıştırılabilir bir örneğidir. Tüm AI programları, kullanıcının cihazında% 100 çalışır ve çekilen fotoğraflar telefondan çıkmadan işlenebilir.

Bu, kullanıcıların daha iyi bir deneyim (buluta gidip gelmeye gerek yoktur), özelliklerin çevrimdışı kullanımı ve daha iyi gizlilik korumasının keyfini çıkarmasına olanak tanır. Bu aynı zamanda, uygulamaları milyonlarca kullanıcıyla bile sıfır ek yük ile çalıştırmamıza olanak tanıyarak geleneksel bulut tabanlı yapay zeka ile karşılaştırıldığında maliyetin büyük bir kısmını bize kazandırır.

Yazar tarafından geliştirilen ekipman (resimdeki eGPU, sosisli sandviç olmayan yapay zekayı eğitmek için kullanılır)

Bu uygulama, verileri manuel olarak düzenlemek için bir dizüstü bilgisayar ve bir GPU kullanan bir geliştirici tarafından geliştirilmiştir. Bu örnek bize, mevcut teknoloji ile teknoloji şirketlerinin desteğine ihtiyaç olmadığını söylüyor. Bireysel geliştiriciler ve meraklılar, ilginç uygulamalar geliştirmek için sınırlı kaynakları da kullanabilir. Çok saçma değil, hadi size kendi uygulamanızı nasıl geliştireceğinizi öğretelim.

içindekiler

1. Uygulama

2. Prototipten ürüne

1. Prototip

2. TensorFlow, Başlangıç yapısı ve aktarım öğrenimi

3. Keras ve SqueezeNet

Üç, DeepDog mimarisi

1. Eğitim

2. Telefonunuzda bir sinir ağı çalıştırın

3. Uygulama davranışını değiştirmek için sinir ağlarını kullanın

4. Kullanıcı deneyimi, geliştirici deneyimi ve yapay zekanın tekinsiz vadisi

1. Uygulama

Bu uygulama önce bir fotoğraf çekmenize izin verecek ve ardından sosisli sandviç alıp almadığınızı size söyleyecektir. Bu özellik basittir ve ImageNet gibi son yapay zeka uygulamalarına bir övgü olarak kabul edilebilir. Sosisli sandviçlere herkesten daha fazla yatırım yapan mühendislik kaynağımız olmasına rağmen, bu uygulamanın aptalca olduğu zamanlar vardır.

Görünüşe göre ketçap olduğu sürece sosisli sandviç

Aksine bazen karmaşık durumlarda da zekasını gösterebilir. Engadget bir keresinde şöyle demişti: "Harika! Bu uygulamayla 20 dakikalık deneyimim, Shazam (şarkı adlarını tahmin edebilen bir uygulama) ile iki yıllık deneyimimden daha iyi."

Görünüşe göre seni "sosisli sandviç değil" kandıramam

2. Prototipten ürüne

Bunun gibi bir deneyiminiz var mı bilmiyorum: Hacker News'u (bilgisayar korsanları ve yeni başlayanlar hakkında bir sosyal haber sitesi) okurken şöyle düşünüyorsunuz: "Bunu elde etmek için bir tur finansmanda 10 milyon yuan var mı? Bunu bu hafta sonu yapabilir misin? "

Sonra bu uygulama sizi aynı hissettirecek ve prototipi, Google Cloud Platform'un Vision API'sini ve React Native'i kullanarak gerçekten sadece bir hafta sonu sürdü.

Ancak raftaki uygulama pazarının son sürümü, birkaç ay içinde (yarı zamanlı) bizim tarafımızdan cilalanır. Meslekten olmayanların anlayamayacağı bazı optimizasyonlar yaptık. Uygulamanın doğruluğunu, AI eğitim süresini, test süresini en üst düzeye çıkarmak ve yinelemeli geliştirmemizi daha verimli hale getiren kurulum ve araçlarımızı yinelemek için birkaç hafta harcadık.

Ek olarak, iOS ve Android'de kullanıcı deneyimini optimize etmek için bütün bir hafta sonu geçirdik.

).

Genellikle çoğu teknik blog yazısı ve akademik makale bu bölümü atlar ve doğrudan nihai planlarını gösterir. Ama size geçmişten bir ders vermek için, denediğimiz uygulanabilir olmayan çözümleri kısaltmak için buradayız. Bundan sonra son başarılı çözümü tanıtacağız.

1. Prototip

Google Cloud Vision belgesinin örnek görüntüsü ve ilgili API çıktısı

Prototipler oluşturmak için React Native'i kullanmayı seçtik çünkü bir yandan bu iyi bir test alanı, diğer yandan birçok cihazı hızlı bir şekilde desteklememize yardımcı olabilir. Gerçekler, seçimimizin doğru olduğunu kanıtladı.

Bu projenin takip çalışmasında, yine de React Native'i koruduk: İş yükümüzü her zaman basitleştirmese de ve bu uygulamanın tasarımını kasıtlı olarak sınırlamış olsak da, sonunda React Native hala bu görevi yerine getirebildi.

Prototip oluştururken kullandıklarımız - Google Cloud'un Vision API'si tarafımızdan hızla kullanımdan kaldırıldı. Üç neden var:

  • Sosisli sandviçleri tanımlamadaki doğruluğu ortalamadır. Çok sayıda nesneyi tanımakta iyi olmasına rağmen, bir şeyi tanımasına izin vermek sizin için çok zordur. 2016'da denediğimizde birçok başarısızlık oldu.

  • Bir bulut hizmeti olduğu için cihazdakinden çok daha yavaş çalışacaktır (net! Çok! Yavaş!) Ve çevrimdışı işlevleri desteklemez. Ve fotoğraf cihazdan çıktığında, bazı gizlilik ve yasal hususları tetikleyecektir.

  • Son olarak, uygulama çevrimiçi olduğunda Google'ın bulut hizmetlerini kullanmanın maliyeti çok yüksek olacaktır.

Bu faktörleri hesaba katarak, şimdi popüler olan "uç bilgi işlem" i denemeye başladık; bu, önce sinir ağını kendi dizüstü bilgisayarımızda eğitmek, ardından bunu iletmek ve doğrudan mobil cihazımıza yerleştirmek anlamına geliyor. Bu durumda sinir ağı, çıkarımı doğrudan kullanıcının cep telefonunda gerçekleştirebilir.

2. TensorFlow, Başlangıç yapısı ve aktarım öğrenimi

TensorFlow ekibinden Pete Warden ile şans eseri sohbet ettikten sonra, TensorFlow'un doğrudan bir iOS cihazına gömülebildiğini fark ettik ve bu yönde keşfetmeye başladık. React Native'den sonra TensorFlow, ikinci nihai geliştirme aracımız oldu.

TensorFlow'un Objective C ++ kamera örneğini React Native kitaplığımıza entegre etmemiz sadece bir günümüzü aldı ve aktarım öğrenme komut dosyasını kullanmak biraz daha uzun sürdü.

Transfer öğrenme betiği, Başlangıç yapısını yeniden eğitmenize yardımcı olabilir, böylece daha spesifik resim problemlerini idare edebilir. Başlangıç, görüntü tanıma sorunlarını çözmek için Google tarafından oluşturulmuş bir dizi sinir yapısının adıdır. Bazı Inceptions eğitilmiştir ve ağırlıkları ayarlanmıştır. Çoğu durumda, görüntü tanıma ağı ImageNet üzerinde eğitilmiştir.

ImageNet, 20.000'den fazla farklı öğeyi (sosisli sandviçler dahil) en iyi şekilde tanımlayabilen sinir ağı yapısını keşfetmeyi amaçlayan bir yarışma düzenliyor. Ancak tıpkı Google Cloud Vision API gibi, bu rekabet yatay ve dikey taramaya sahip olsa da, algoritma hala 20.000 öğenin tanınmasında eksik. Bu durumda, transfer öğrenimi, tam olarak eğitilmiş bir sinir ağı bulup, tek bir görevi daha iyi tamamlayabilecek bir araca yeniden eğitmektir.

Bu, belirli bir dereceye kadar "unutmayı" içerir. Ya yığındaki tüm katmanı doğrudan kesin ya da sinir ağının diğer nesneleri (sandalyeler gibi) ayırt etme yeteneğini yavaşça silin ve ihtiyacınız olan şeyi tanımaya odaklanın. Nesne (bu uygulamada bir sosisli sandviçtir).

Bahsedilen sinir ağı (Inception), ImageNet'te 14 milyon görüntü kullanılarak eğitildi. Sadece birkaç bin sosisli sandviç resmi kullandık, bu da sosisli sandviçleri tanıma yeteneğini büyük ölçüde geliştirdi.

Transfer öğrenmenin en büyük yararı, sıfırdan başlamaktan daha hızlı sonuçlar alabilmeniz ve çok fazla veri kullanmanıza gerek olmamasıdır. Eksiksiz bir eğitim seti yalnızca birden çok GPU ve milyonlarca görüntü gerektirmekle kalmaz, aynı zamanda birkaç ay sürer. Transfer öğrenimi genellikle bir dizüstü bilgisayar ve iki ila üç bin resimle birkaç saat içinde yapılabilir.

Karşılaştığımız zorluklardan biri, hangilerinin sosisli sandviç hangilerinin olmadığını belirlemekti.

"Sosisli sandviç nedir" tanımlaması beklenmedik bir şekilde zordur (kesilmiş bir sosis sayılır mı? Varsa, hangi bağırsaklar işe yarar?) Ve aynı zamanda farklı kültür ve bölgelerdeki sosisli sandviçlerin anlaşılmasını da içerir.

Benzer şekilde, uygulamanın açık ortamı, neredeyse sınırsız kullanıcı girdisi ile uğraşmamız gerektiği anlamına gelir. Bazı bilgisayar tanıma sorunları nispeten sınırlı olsa da (örneğin, cıvataların kalite kusurlarını kontrol etmek için X-ray görüntülerini kullanmak gibi), karşı karşıya olduğumuz şey özçekimler, manzara fotoğrafları ve çok sayıda yemek resmi olacaktır.

Bu geliştirme yönteminin iyi olduğu ve optimizasyon sonuçları getirdiği söylenebilir. Ancak, aşağıdaki iki nedenden dolayı bu yöntemi kullanımdan kaldırdık:

İlk olarak, eğitim verilerimiz ciddi şekilde dengesiz olmalıdır, çünkü "sosisli sandviç değil" den çok daha fazla örnek vardır.

Bu, algoritmanızı eğitmek için 3 sosisli sandviç resmi ve 97 sosisli sandviç olmayan resim kullanırsanız, tanıma sonuçları% 0 sosisli sandviç ve% 100 sosisli sandviç olmadığını gösterse bile doğruluğunun varsayılan olarak olduğu anlamına gelir. Hala% 97 kadar yüksek! Geçiş öğrenimi için TensorFlow kullanıldığında bile bu doğrudan çözülemez. Başka bir deyişle, bu bize temelde eğitimi kontrol etmek ve ağırlıkları sıfırdan içe aktarmak için bir derin öğrenme modeli kullanmamız gerektiğini söylüyor.

Şu anda, mermiyi ısırmaya ve Keras (TensorFlow'a dayalı daha güzel ve kullanışlı soyut soyutlamalar sağlayan bir derin öğrenme yazılımı kitaplığı) ile yeniden başlamaya karar verdik.

Keras, eğitim verilerinin ciddi dengesizliği durumumuza mükemmel bir şekilde uyan bir ağırlık kategorisi seçeneğinin yanı sıra çok güçlü egzersiz araçlarıyla birlikte gelir. Bu fırsatı VGG gibi diğer popüler sinir yapılarını denemek için kullandık, ancak henüz bir sorun çözülmedi: bu yapıların hiçbiri iPhone ile uyumlu değil.

Çok fazla bellek kullanıyorlar ve diğer uygulamaların çökmesine neden oluyorlar. Diğer bir nokta da hesaplama işlem sürelerinin bazen 10 saniyeden fazla sürmesidir ki bu, kullanıcı deneyimi açısından çok kötüdür. Bu sorunu hafifletmek için birçok yol denedik, ancak sonuçta bu sinir yapıları hala cep telefonları için çok büyük.

3. Keras ve SqueezeNet

Şekil: SqueezeNet SqueezeNet ve AlexNet (bilgisayarla görme mimarisinin yaratıcısı)

Size projemizin orta noktasıyla ilgili bir zaman kavramı verin. Bu zamana kadar, kullanıcı arayüzü% 90 tamamlandı ve temelde hiçbir değişiklik olmayacak. Ancak geriye dönüp baktığımızda, sinir ağı o zamanki en fazla% 20 yaptı.

Belli bir zorluk derecemiz var ve iyi bir veri setimiz var, ancak son sinir yapısı kodunun hala kodu yok. O zaman, sinir kodumuz cep telefonlarında kararlı bir şekilde çalışamıyordu ve doğruluğumuz önümüzdeki birkaç hafta içinde önemli ölçüde iyileştirilemeyecekti.

Karşılaştığımız en doğrudan sorun çok basit Eğer Inception ve VGG çok büyükse, göç öğrenimi için kullanabileceğimiz daha basit, eğitimli bir sinir ağı var mı?

Xception, Enet ve SqueezeNet'i keşfettik. Hemen SqueezeNet kullanmaya karar verdik.

SqueezeNet, gömülü bir derin öğrenme çözümü olarak kullanılabilen net bir konumlandırma işlevine sahiptir. Ek olarak, GitHub'da eğitimli bir Keras modeli bulunmaktadır (yay! Açık kaynak web sitesi!)

Peki bu ne kadar fark yaratabilir? VGG gibi bir yapı, yaklaşık 138 milyon parametre gerektirir (nöron ve nöron değerlerini simüle etmek için gerekli sayılar). Başlangıç büyük ölçüde iyileştirildi ve yalnızca 23 milyon parametre gerektiriyor. SqueezeNet, karşılaştırıldığında yalnızca 1,25 milyon parametreye ihtiyaç duyar.

Bu iki fayda sağlayacaktır:

  • Eğitim sırasında küçük bir ağ kullanmak çok daha hızlıdır. Hafızada haritalanacak çok fazla parametre yok, bu da aynı anda antrenman yapabileceğiniz (partiyi artırabileceğiniz) ve sinir ağının daha hızlı birleşeceği (matematiksel formülü tahmin edeceğiniz) anlamına gelir.

  • Geliştirme sırasında bu model daha küçük ve daha hızlıdır. SqueezeNet yalnızca 10MB'den daha az RAM'e ihtiyaç duyarken, Inception gibi olanın 100MB'den fazla RAM'e ihtiyacı olacaktır. Bu boşluk büyük ve özellikle önemli çünkü bazı mobil cihazlarda 100 MB RAM yok. Küçük sinir ağları da büyük olanlardan daha hızlı çalışır.

Elbette kazançlar olduğu için kayıplar da var:

  • Küçük sinir sisteminin "hafızası" iyi değil: karmaşık görevleri (20.000 farklı nesneyi tanımak gibi) idare edemiyor ve hatta karmaşık ikincil öğeler (New York tarzı sosisli sandviçleri Chicago tarzı sosisli sandviçlerden ayırmak gibi) aptalca kafa karıştırıyor. .

  • Bu çıkarıma dayanarak, küçük sinir ağları genellikle doğruluk açısından büyük sinir ağlarından daha düşüktür. ImageNet'te 20.000 farklı nesneyi tanımlamaya çalışırken, SqueezeNet'in doğruluk oranı sadece% 58 iken VGG'nin doğruluğu% 72'dir.

  • Küçük sinir ağlarında transfer öğrenmeyi kullanmak da daha zordur. Teorik olarak, SqueezeNet ile Inception ve VGG ile aynı şekilde başa çıkabiliriz: bazı bilgileri unutmasına izin verin ve sonra sosisli sandviçleri ve sosisli olmayanları tanıması için yeniden eğitin.

    Ancak gerçek uygulama sürecinde, bu yöntemin öğrenme sürecini ayarlamamızı zorlaştırdığını ve elde edilen sonuçların her zaman sıfırdan SqueezeNet eğitimi kadar iyi olmadığını gördük. Bu sorun aynı zamanda projemizin açıklığından da kaynaklanıyor olabilir (kullanıcılar kendi kendilerine fotoğraf çeker ve resim yükler).

  • Genel olarak konuşursak, küçük sinir ağları nadiren aşırı uyum gösterir, ancak birkaç "küçük" yapı kullanırken bu tür sorunlarla karşılaştık. Aşırı uyum, sinir ağınızın çok spesifik olduğu ve sadece üzerinde eğittiğiniz sosisli sandviçin fotoğraflarını tanıyabileceği, ancak analoji yoluyla öğrenemeyeceği anlamına gelir.

  • Bir benzetme yapmak için insan örneğini kullanmak, sanki bir kişi, kavramı soyutlamadan, sosisli sandviçin ekmeğe, bazen de baharatla doldurulmuş bir sosis olduğunu anlamadan ona gösterdiğin sosisli sandviçin resmini hatırlaması gibidir. Malzemeler vb. Ona yepyeni bir sosisli sandviç fotoğrafı gösterirseniz (orijinalinden farklı), bunun bir sosisli sandviç olmadığını söyleyecektir.

  • Küçük bir sinir ağının genellikle daha kötü "hafızası" olduğundan, onlar için tek bir maddede uzmanlaşmanın neden daha zor olduğunu anlamak zor değildir. Ancak birkaç kez, küçük sinir ağımızın doğruluğu% 99'a sıçradı ve sonra aniden önceki eğitimde görünmeyen resimleri tanıyamadı.

  • Yeterli veri seti ekledikten sonra bu sorun ortadan kalktı. Buradaki veri seti, içe aktarılan görüntülerde uygun rastgele değişiklikler (uzatılmış veya bozulmuş) yapacağımız anlamına gelir; bu nedenle, bin görüntünün her birini yüz kez eğitmekle karşılaştırıldığında, bu bin görüntüyü kullanıyoruz Grafikte anlamlı değişiklikler yapın, böylece sinir ağı sadece resmi değil, sosisli sandviçin bileşimini de (ekmek, sosis, baharat vb.) Ve aynı zamanda esnekliği kaybetmeden (hatırlamak yerine) Resimdeki özel bir piksel).

Keras Blog'daki veri örneği

Bu süre zarfında, sinir ağı yapısında ince ayar yapmaya başladık. Özellikle Toplu Nomalizasyonu kullanmaya başladık ve farklı aktivasyon fonksiyonlarını denedik.

  • Toplu normalleştirme, yığındaki değerleri "düzleştirerek" sinir ağınızın daha hızlı öğrenmesine yardımcı olabilir. Özellikle toplu normalizasyonun neden bu işlevi tam olarak anlayamadığı, ancak sinir ağınızın daha yüksek doğruluk elde etmek için daha az eğitim kullanmasına veya aynı anda daha yüksek doğruluk elde etmek için aynı miktarda eğitim kullanmasına neden olabilir. .

  • Aktivasyon fonksiyonu, "nöronlarınızın" aktif olup olmadığını tespit etmek için kullanılan dahili bir fonksiyondur. Birçok akademik makale hala ReLU (Rectified Linear Unit) kullanıyor, ancak en iyi sonuçları ELU ile elde ettik.

SqueezeNet'e toplu normalleştirme ve ELU ekledikten sonra sıfırdan başladık ve% 90'ın üzerinde bir doğrulukla bir sinir ağını eğittik. Bununla birlikte, sinir ağımız hala nispeten kırılgandır, bu da aynı ağın bazen aşırı simüle edileceği, ancak gerçek testler karşısında yetersiz bir şekilde simüle edileceği anlamına gelir. Veri setine daha fazla örnek eklemek ve artan eğitim verileri bile beklentilerimizi karşılamadı.

Dolayısıyla bu aşamadaki iyi sonuçlara ve iPhone üzerinde kullanılabilecek bir uygulamanın oluşturulmasına rağmen bir anda dördüncü ve son yapımıza geçtik.

Üç, DeepDog yapısı

keras.applications.imagenet_utils adresinden _obtain_input_shape içe aktar

keras'tan arka ucu K olarak içe aktar

keras.layers'dan Input, Convolution2D, SeparableConvolution2D'yi içe aktarın, \

GlobalAveragePooling2d \

Yoğun, Aktivasyon, Toplu Normalleştirme

keras.models'ten içe aktarma Modeli

keras.engine.topology'den get_source_inputs içe aktarımı

keras.utils'den get_file içe aktar

keras.utils'den layer_utils içe aktar

def DeepDog (input_tensor = Yok, input_shape = Yok, alfa = 1, sınıflar = 1000):

input_shape = _obtain_input_shape (input_shape,

default_size = 224,

min_size = 48,

data_format = K.image_data_format (),

include_top = Doğru)

input_tensor None ise:

img_input = Girdi (şekil = input_shape)

Başka:

değilse K.is_keras_tensor (input_tensor):

img_input = Girdi (tensor = input_tensor, şekil = input_shape)

Başka:

img_input = input_tensor

x = Convolution2D (int (32 * alpha), (3, 3), strides = (2, 2), padding = 'same') (img_input)

x = Toplu Normalleştirme () (x)

x = Etkinleştirme ('elu') (x)

x = SeparableConvolution2D (int (32 * alpha), (3, 3), strides = (1, 1), padding = 'aynı') (x)

x = Toplu Normalleştirme () (x)

x = Etkinleştirme ('elu') (x)

x = SeparableConvolution2D (int (64 * alpha), (3, 3), strides = (2, 2), padding = 'aynı') (x)

x = Toplu Normalleştirme () (x)

x = Etkinleştirme ('elu') (x)

x = SeparableConvolution2D (int (128 * alpha), (3, 3), strides = (1, 1), padding = 'aynı') (x)

x = Toplu Normalleştirme () (x)

x = Etkinleştirme ('elu') (x)

x = SeparableConvolution2D (int (128 * alpha), (3, 3), strides = (2, 2), padding = 'aynı') (x)

x = Toplu Normalleştirme () (x)

x = Etkinleştirme ('elu') (x)

x = SeparableConvolution2D (int (256 * alpha), (3, 3), strides = (1, 1), padding = 'aynı') (x)

x = Toplu Normalleştirme () (x)

x = Etkinleştirme ('elu') (x)

x = SeparableConvolution2D (int (256 * alpha), (3, 3), strides = (2, 2), padding = 'aynı') (x)

x = Toplu Normalleştirme () (x)

x = Etkinleştirme ('elu') (x)

Aralık içindeki _ için (5):

x = SeparableConvolution2D (int (512 * alpha), (3, 3), strides = (1, 1), padding = 'aynı') (x)

x = Toplu Normalleştirme () (x)

x = Etkinleştirme ('elu') (x)

x = SeparableConvolution2D (int (512 * alpha), (3, 3), strides = (2, 2), padding = 'aynı') (x)

x = Toplu Normalleştirme () (x)

x = Etkinleştirme ('elu') (x)

x = SeparableConvolution2D (int (1024 * alpha), (3, 3), strides = (1, 1), padding = 'aynı') (x)

x = Toplu Normalleştirme () (x)

x = Etkinleştirme ('elu') (x)

x = GlobalAveragePooling2D () (x)

out = Yoğun (1, aktivasyon = 'sigmoid') (x)

input_tensor None değilse:

inputs = get_source_inputs (input_tensor)

Başka:

inputs = img_input

model = Model (girişler, çıkış, ad = 'derin köpek')

dönüş modeli

1. Tasarım

Nihai yapımızın büyük bir kısmı, Google'ın 17 Nisan'da MobileNets hakkındaki makalesinden ilham aldı. Bu makale, Google'ın bizimki gibi basit bir projede sadece yaklaşık 4 milyon parametreyle Inception ile karşılaştırılabilir bir doğruluk elde edebilecek yeni bir sinirsel yapı sunacağını iddia ediyor.

Bu, SqueezeNet (amacımız için aşırı basitleştirilmiş bir yapı) ve Inception / VGG arasında mükemmel bir değiş tokuş olduğu anlamına gelir. Bu makale ayrıca sinir ağının boyutu ve zorluğu ayarlama işlevinden de bahsetti; hafıza ve doğruluk arasında seçim yapabilen, o sırada kalp hastalığımızı çözebilecek.

Uygulamanın yayına girmesinden bir aydan kısa bir süre sonra, makaledeki sonuçları büyük bir hevesle yeniden yapılandırmak istedik. Ancak dramatik olan şu ki, makalenin yayınlandığı gün, İstanbul Teknoloji Üniversitesi öğrencisi Refik Can Malli, GitHub'da Keras kodunu halka açık bir şekilde sağlamak için başı çekti.

Nihai yapımız ve MobileNets'in yapısı veya başka bir deyişle, geleneksel yapıdan önemli ölçüde farklıdır, özellikle:

  • İşleme sırasında toplu normalleştirme kullanmadık, çünkü Xception'ın makalesi (özellikle derin ağlarda evrişimi tartışıyor) toplu normalleştirmenin aslında yapımızın doğruluğunu azaltacağına işaret ediyor gibi görünüyor. Toplu normalleştirme kullanmamak, sinir ağımızın boyutunu da azaltabilir.

  • ReLU'yu ELU ile değiştirdik. Önceki SqueezeNet deneyimiz gibi ELU, ReLU'dan daha yüksek füzyon hızı ve doğruluğu sağlar. PELU kullanmıyoruz. Çünkü kullanımı kolay olmasına rağmen, bu aktivasyon işlevi onu her kullandığımızda ikili bir duruma düşüyor gibi görünüyor. Bu nedenle, ağımızın doğruluğu, kademeli olarak artmak yerine, bir partiden diğerine geçerken% 0 ile% 100 arasında değişecektir. Bu sorunun neden olduğunu bilmiyoruz, bunun nedeni uygulama hatası veya kullanıcı hatası olabilir. Resimdeki genişlik / yükseklik eksenini birleştirmeye çalıştık, ancak işe yaramadı.

  • SELU kullanmıyoruz. İOS ve Android sürümlerini araştırdıktan sonra, sonuçlar PELU'nunkilere çok benziyor. SELU'nun aktivasyon işlevleri için bir kısayol olarak tek başına kullanılamayacağından şüpheleniyoruz. Aslında, makale haritalarının başlığı olarak SELU, dar SNN yapısının bir parçasıdır.

  • ELU kullanırken toplu normalleştirme kullanmaya devam ettik. Bu adımın gereksiz olduğuna dair birçok işaret olmasına rağmen, testi her çalıştırdığımızda, toplu normalleştirme olmadan entegre edilemez. Bunun nedeni yapımızın çok küçük olması olabilir.

  • Aktivasyondan önce toplu normalleştirme kullanıyoruz. Bu son zamanlarda sıcak bir konu olmasına rağmen, küçük bir sinir ağında aktivasyondan sonra toplu normalizasyon ekleme deneylerimiz iyi entegre olamıyor.

  • Sinir ağını optimize etmek için Döngüsel Öğrenme Hızları (CLR) ve Brad Kenstler'in Keras modelini kullandık. CLR, eğitim sırasında en uygun öğrenme oranını (optimum öğrenme oranı) sıkıca bulabilir. Daha da önemlisi, öğrenme sürecini yukarı ve aşağı ayarlayarak, geleneksel optimize edicilerden daha yüksek bir nihai doğruluk oranı elde etmemize yardımcı olabilir. Yukarıdaki iki nedenden dolayı, gelecekte sinir ağlarını eğitmek için CLR kullanmaya karar verdik.

  • MobileNets yapısında veya değerini ayarlamaya gerek olmadığını düşünüyoruz. Çünkü modelimiz = 1 olduğunda hedefe ulaşmak için yeterince küçük. = 1 Hesaplamamız yeterince hızlı. Ancak, eski mobil cihazlarda veya gömülü platformlarda çalışıyorsa, ayarlamalar gereklidir.

Peki bu yığın nasıl çalışıyor? Derin öğrenme genellikle herkese bir "kara kutu" hissi verir. Ancak birçok parçası gerçekten gizemli olsa da, kullandığımız sinir ağı, nasıl çalıştığını ortaya çıkarmak için sık sık bize bazı bilgiler sızdırıyor. Yığındaki katmanları ve bu katmanların belirli girdi görüntülerini nasıl etkinleştirdiğini görebiliriz. Bu bize her katmanın sosis, ekmek ve sosisli sandviçlerin diğer özelliklerini tanıma yeteneğini anlatır.

2. Eğitim

Verilerin kalitesi çok önemlidir. Eğitim verisi ne kadar iyi sağlanırsa, bu sinir ağının yapısı iyi olacaktır. Eğitim verilerinin düzeyini iyileştirmek, bu proje için en çok zaman harcadığımız üç şeyden biridir.

Yaptığımız temel iyileştirmeler aşağıdaki gibidir:

  • Daha fazla resim ve daha çeşitli resimler (uzunluk ve genişlik, arka plan, aydınlatma, kültürel farklılıklar, perspektif perspektifi, kompozisyon vb.) Elde edin.

  • Resim türünü beklenen ürün girdi değeriyle eşleştirin (kullanıcı resmi). Tahminimize göre çoğu durumda kullanıcılar sosisli sandviçlerin veya diğer yiyeceklerin fotoğraflarını çekecek veya bazen insanlar uygulamayı rastgele öğelerle test etmeye çalışacaklar, bu nedenle veri setini oluştururken bu faktörleri dikkate aldık. .

  • Yapay sinir ağınıza sahte olabilecek bazı benzer resimler sağlayın. Sosisli sandviçlerle en kolay karıştırılanlar diğer yiyeceklerdir (hamburger veya sadece sosis veya bebek havuç ve pişmiş domates gibi). Bu, veri setimize yansır.

  • Beklenen resim bozulması: Cep telefonlarında, çoğu resmin kalitesi SLR ile "ortalama seviyeden" daha düşük olacaktır. Cep telefonunun aydınlatması tatmin edici değil. Mobil cihazlarla çekilen fotoğraflar genellikle daha koyu veya belirli bir açıya sahip. Büyük ölçekli veri kümeleri, sorunu çözmenin anahtarıdır.

Ek olarak, kullanıcıların elinde sosisli sandviç yoksa, Google'da sosisli sandviç resimlerini arayacaklarını ve daha sonra cep telefonlarını bilgisayar ekranlarını çekmek için kullanacaklarını ve bunun da başka bir bozulmaya neden olacağını (eğer kamera açılıysa, eğer kullanırsanız resmin eğilmesine neden olur. Cep telefonu kamerasında, LCD ekranda çekim yaparken ışık noktaları ve belirgin hareli olacaktır).

Bu spesifik çarpıtmalar, evrişimli ağların gürültüye direnme zorluğu hakkındaki bazı son akademik makalelere benzeyen sinir ağımızı kolayca karıştırabilir. Çoğu sorun, Keras'ın kanal kaydırma işlevi kullanılarak çözülebilir.

Resim: Wikimedia bozulma örneği: Moray dalgalanmaları ve açık noktalar.

Bazı köşe problemlerini tespit etmek zordur. Özellikle yumuşak odak veya arka plan bulanıklığı ile elde edilen fotoğraflar bazen sinir ağımızın kafasını karıştırabilir. Bu sorunun çözülmesi zordur.

İlk olarak, yumuşak odakla çekilmiş birkaç sosisli fotoğrafı var (bunu düşündüğümüzde acıkıyoruz).

İkincisi, yumuşak odağı tanıma yeteneğini eğitmek için çok fazla sinir ağı kapasitesi harcarsak, yarardan çok zarar verir, çünkü mobil cihazlarla çekilen fotoğrafların çoğu bu işleve sahip değildir. Bu sorunu temelde görmezden gelmeyi seçiyoruz.

Son veri setimiz 150.000 resimden oluşuyor ve bunlardan yalnızca 3.000 sosisli sandviç fotoğrafı var: yalnızca çok az sosisli sandviç var, ancak sosisli sandviç olmayan çok fazla şey var. Burada 49: 1 dengesizliği, Keras sınıfının ağırlık ayarı ile telafi edilir. Geriye kalan 147.000 resmin çoğu yiyecek ve yaklaşık 3.000 resim yemek değildir. Bu, ağımızın daha iyi entegre olmasına ve sosisli ceket giyen gerçek bir şeyle karıştırılmamasına yardımcı olabilir.

Veri genişletmemizin koşulları aşağıdaki gibidir:

  • Eklediğimiz dönüş, ortalamadan ± 135 derece çok daha büyük, çünkü kodu yazarken telefonun yönünü dikkate almıyoruz.

  • Yükseklik ve genişlik% 20 hareket eder

  • % 30 kesme aralığı

  • Yakınlaştırma aralığı% 10

  • Kanal kaydırma (kanal kaydırma)% 20

  • Sinir ağının genelleme ve indüksiyon yeteneğini geliştirmesine yardımcı olmak için rastgele seviye çevirme

Bu rakamlar, girişimlerimize ve uygulamanın gerçek uygulaması hakkındaki anlayışımıza dayanan sezgimize dayanmaktadır ve titiz deneyler yoluyla elde edilmez.

Veri hazırlığımızdaki son anahtar, Patrick Rodriguez'in Keras çoklu işlem görüntü verisi oluşturucusunu kullanmaktır.

Keras'ın kendi çoklu iş parçacığı ve çoklu işlem uygulaması olmasına rağmen, Patrick'in veritabanının daha hızlı çalıştığını gördük (bunun özel nedeni, dikkatlice çalışmak için zamanımız olmamasıdır). Bu kütüphane, eğitim süresini üçte iki oranında azaltmamıza yardımcı oldu.

Bu sinir ağı, 2015 MacBook Pro ve harici bir GPU üzerinde eğitildi. O zamanki eGPU'muz Nvidia GTX 980 Ti idi, ancak şimdi yapmaya başlarsak 1080 Ti satın alacağız.

Ağı 128 görüntüden oluşan gruplar halinde eğitmeyi başardık. Sinir ağımız 240 kez (epoch) eğitildi, yani 150.000 görüntüyü çalıştırmak için 240 kez kullandık. Bu 80 saat sürdü.

Sinir ağını aşağıdaki üç aşamada eğitiyoruz:

İlk aşamada 112 eğitim çalıştırılır (1. seviyede 8 eğitim ile 7 tam CLR döngüsü tamamlanır).

Üçgen 2 yöntemine göre öğrenme oranımız 0.005 ile 0.03 arasındadır (yani maksimum öğrenme oranı her 16 seferde yarıya iner).

İkinci aşamada 64 eğitim tekrar çalıştırılır (Seviye 1'de 8 eğitim ile 4 CLR döngüsü tamamlanır) ve yine üçgen 2 yöntemine göre öğrenme oranı 0.0004 ile 0.0045 arasındadır.

İkinci aşamada 64 eğitim çalıştırılır (4 CLR döngüsü 1. seviyede 8 eğitim ile tamamlanır) ve öğrenme oranı 0.000015 ile 0.0002 arasında olup yine üçgen 2 yöntemine dayanmaktadır.

Güncelleme: Grafiğin önceki sürümünde yanlış bilgiler var

Öğrenme oranı, CLR makalesi tarafından önerilen doğrusal deney çalıştırılarak elde edilse de, aslında bu sayıların anlaşılması zor değildir. Her bir siparişin maksimum değeri, endüstride önerilen standartla uyumlu olan önceki aşamanın minimum değerinin yaklaşık yarısıdır (eğitim sırasında bir doğruluk platosuyla karşılaşırsanız, öğrenme oranınız yarıya indirilmelidir).

Zamandan tasarruf etmek için, eğitimimizin bir kısmı, Paperspace P5000'in Ubantu çalıştıran bir örneğinde gerçekleştirilir. Eğitimin bu bölümünde, parti boyutunu ikiye katlamayı başardık. Bu durumda, her aşamada optimum öğrenme oranının neredeyse iki katına çıktığını gördük.

3. Telefonunuzda bir sinir ağı çalıştırın

Nispeten kompakt bir sinir yapısı oluşturmamıza ve onu mobil ortama uyum sağlayacak şekilde eğitmemize rağmen, iyi çalışmasını sağlamak için yine de çok çalışmamız gerekiyor. Bu gelişmiş sinir ağı yapısını doğrudan çalıştırmaya çalışmak, hızla yüzlerce MB RAM tüketecek ve çoğu cep telefonunun artık bu kadar fazla hafızası yok. Sinir ağını optimize etmenin yanı sıra, görüntüleri işleme ve hatta TensorFlow'un kendisini yükleme şekliniz, sinir ağınızın hızını, kullanılan RAM miktarını ve bir sistem çökmesinin eşiğindeki kullanıcı deneyimini etkileyecektir.

Bu, bu projenin en gizemli kısmı olabilir. Belki de mobil cihazlarda çalışan çok az derin öğrenme uygulaması örneği olduğundan, bu konuda neredeyse hiçbir bilgi bulamıyoruz. Ancak sabırları için TensorFlow ekibine, özellikle Pete Warden, Andrew Harp ve Chad Whipkey'e teşekkür ederiz.

  • Sinir ağımızın ağırlıklarını düzelterek, ağın boyutunu orijinal boyutunun dörtte üçüne düşürdük.

Sonuç olarak, eğitimimizde saklanan herhangi bir değeri kullanmak yerine, optimizasyonumuz en sık meydana gelen N değerini seçecek ve sinir ağınızdaki tüm parametreleri bu değerlere ayarlayacaktır. Bu, sıkıştırmadan sonra sinir ağının boyutunu azaltabilir.

Ancak, bunun sıkıştırılmamış uygulama boyutu veya bellek kullanımı üzerinde hiçbir etkisi yoktur. Bu optimizasyonu nihai ürüne koymadık, çünkü bir yandan sinir ağımız zaten yeterince küçük, diğer yandan bu yuvarlamanın uygulama doğruluğu üzerindeki etkisini ölçmek için zamanımız yok.

  • TensorFlow yazılım kitaplığını iOS sistemine derleyerek bunu optimize edin.

  • Gereksiz algoritmaları TensorFlow yazılım kitaplığından kaldırın: TensorFlow bir anlamda bir sayıyı veya herhangi bir TensorFlow algoritmasını anlayabilen sanal bir makinedir (sanal makine): ekle, çarp, diz Birleştirme vb.

İOS'a derleme sırasında TensorFlow yazılım kitaplığından gereksiz algoritmaları kaldırarak çok fazla bellek tasarrufu sağlayabilirsiniz.

  • Diğer iyileştirmeler de mümkündür. Örneğin, yazarın alakasız başka bir çalışmasında Android ikili boyutunda 1 MB artış var. Bu nedenle, TensorFlow'un iOS kodunda iyileştirilebilecek ve optimize edilebilecek yerler olduğu tahmin edilebilir.

İOS'ta TensorFlow kullanma seçeneğine ek olarak, Apple'ın kendi derin öğrenme yazılımı kitaplıklarına (BNNS, MPSCNN ve daha sonra CoreML) de dikkat ettik. Keras'ta bir sinir ağı tasarlayabilir, TensorFlow'da eğitebilir, ardından tüm değerleri dışa aktarabilir, BNNS veya MPSCNN'yi yeniden uygulayabilir (veya CoreML tarafından doğrudan içe aktarılabilir) ve ardından parametreleri yeni uygulamaya yükleyebiliriz.

Ancak, bu yeni Apple yazılım kitaplıklarının önündeki en büyük engel, bunların yalnızca iOS 10+ üzerinde kullanılabilmeleridir ve uygulamaları iOS'un önceki sürümlerinde kullanılabilir hale getirmek istiyoruz. İOS 10+ herkes tarafından benimsendiğinden ve çerçeve güncellendiğinden, yakın gelecekte artık TensorFlow'u kullanmamız gerekmeyebilir.

#ithalat < CodePush / CodePush.h >

NSString * FilePathForResourceName (NSString * adı, NSString * uzantısı) {

// NSString * file_path =;

NSString * file_path =;

eğer (file_path == NULL) {

LOG (FATAL) < < "Bulunamadı '" < < < < "."

< < < < "'pakette.";

}

dosya_yolu döndür;

}

AIManager.mm ile GitHub tarafından barındırılmaktadır

React'i içe aktar, {Component} from'react ';

'react-native'den {AppRegistry} dosyasını içe aktarın;

CodePush'u "react-native-code-push" dan içe aktarın;

Uygulamayı './ Uygulama'dan içe aktarın;

class nothotdog, Component'i genişletir {

render () {

dönüş (

< Uygulama / >

)

}

}

gerektirir ('./ deepdog.pdf')

const codePushOptions = {checkFrequency: CodePush.CheckFrequency.ON_APP_RESUME};

AppRegistry.registerComponent ('nothotdog', () = > CodePush (codePushOptions) (nothotdog));

index.ios.js, by GitHub tarafından barındırılıyor

Projemiz nasıl farklı?

Aslında, yapacak vaktimiz olmayan veya denemediğimiz pek çok şey var. Gelecekte keşfedeceğimiz fikirler şunlar:

  • Veri büyüme parametrelerimizi daha dikkatli bir şekilde ayarlayın.

  • Uçtan uca, yani, uygulamamızın 2 veya daha fazla sosisli sandviç tanıma eşiği kategorisine sahip olup olmadığı gibi uygulamanın nihayet belirlediği soyut yöntem (tanıma 0,90'dan büyükse nihayet "sosisli sandviç" yazan bir uygulamamız ve varsayılan değerimiz var) 0.5), ağırlığı ikiye katlayın, vb.

  • Uygulamaya bir geri bildirim mekanizması ekleyin - bir hata oluşursa, kullanıcının şikayet etmesine izin verilebilir veya uygulama sinir ağını aktif olarak optimize edebilir.

  • 224 x 224 pikselden daha yüksek görüntü tanıma çözünürlüğü kullanın. Son olarak, 1.0'dan büyük bir MobileNets değeri kullanacağız.

4. Kullanıcı deneyimi, geliştirici deneyimi ve yapay zekanın tekinsiz vadisi

Son olarak, kullanıcı deneyiminin, geliştirici deneyiminin ve yapay zeka uygulamasının geliştirilmesindeki yerleşik önyargının büyük etkisinden bahsetmek istiyoruz. Her noktada başka bir blog yazısı (hatta bir kitap) yazabilirim, ancak burada bu üç şeyin kendi deneyimlerimizdeki çok sağlam etkisinden bahsedeceğiz.

AI uygulama geliştirmenin her aşamasında kullanıcı deneyimi, geleneksel uygulamalardan daha kritiktir. Şu anda, size mükemmel sonuçlar getirebilecek bir derin öğrenme algoritması yoktur, ancak derin öğrenme ve kullanıcı deneyiminin doğru kombinasyonunun size neredeyse mükemmel sonuçlar getireceği birçok durum vardır.

AI bugAI appStochastic Gradient DescentAIUncanny Valley

: New Scientist

GPUTensorFlowimplementcaffe2 / pyTorchTensorFlowAPI

GPU/AI

AI appAIappapp

AI

app......

Asya Kupası'nın 51 maçını izledikten sonra milli futbol takımına giden zayıf takım gerçekten gitti
önceki
Girişim portföyünün boyutu gizlidir! Birçok VC'nin "haitou" projeleri için "Moğolistan" a güvendiği ortaya çıktı
Sonraki
Heze polisi alenen 20 kaçak aradı! Gelin ve oyunda yeni yılı kutlayın
Patlayıcı ürünler için hızlı bir zafer yaratın ve veriler için bir dayanak bulun | China Eastern Data Lab Wang Xuewu ile diyalog
Tepeli Batağan kış için Donghu'ya uçuyor
Singularity Üniversitesi'nin kurucusu: İnsan zekası, daha gelişmiş zeka olmak için yapay zekayı geçecek
Çin şampiyonası perde çağrısı, Chengdu Xingcheng ikinci sırada
"Double 11" karnavalı 10 yıl oldu, ilk single'larını göstermeye gelen 11 kişi
Özel Yalancıları Fare İzleriyle Tanımlayın
Benzeri görülmemiş! Sadece Çin'e yaklaşmak için bu ülke "savaş"
+ 1V3 puan almayı planlayan ve dünya dalgasına dönen 7 dakikalık baskın, 22 yaşındaki Zhang Yuning, Guoan 2 dış yardımını fethetti!
Özel Yüz tanıma teknolojisi balinaları tanımlamak için kullanılabilir mi? Kaggle Sağ Balina Tanıma Yarışması No. 1 size bunu başarmayı öğretiyor!
Özel Tıbbi alanda yapay zeka teknolojisinin uygulanması ve beklentileri (PPT ile)
Önümüzdeki haftanın on dokuzuncu sayısının kapağı | Bu Çift On Bir Dongfang Bubu mu yoksa kırık bir kol Venüs mü?
To Top