Bagikan melalui


Panduan untuk bahasa pemrogram spesifikasi jaringan neural Net# untuk Azure Machine Learning Studio (klasik)

BERLAKU UNTUK:Berlaku untuk.Pembelajaran Mesin Studio (klasik) Tidak berlaku untuk.Azure Pembelajaran Mesin

Penting

Dukungan untuk Studio Azure Machine Learning (klasik) akan berakhir pada 31 Agustus 2024. Sebaiknya Anda transisi ke Azure Machine Learning sebelum tanggal tersebut.

Mulai 1 Desember 2021, Anda tidak akan dapat membuat sumber daya Studio Azure Machine Learning (klasik) baru. Hingga 31 Agustus 2024, Anda dapat terus menggunakan sumber daya Pembelajaran Mesin Studio (klasik) yang ada.

ML Dokumentasi Studio (klasik) sedang berhenti dan mungkin tidak diperbarui di masa mendatang.

Net# adalah bahasa pemrogram yang dikembangkan oleh Microsoft yang digunakan untuk mendefinisikan arsitektur jaringan neural kompleks seperti jaringan neural mendalam atau konvolusi dimensi arbitrer. Anda dapat menggunakan struktur kompleks untuk meningkatkan pembelajaran data seperti gambar, video, atau audio.

Anda dapat menggunakan spesifikasi arsitektur Net# di semua modul jaringan neural di Studio Azure Machine Learning (klasik):

Artikel ini menjelaskan konsep dasar dan sintaks yang diperlukan untuk mengembangkan jaringan neural kustom menggunakan Net#:

  • Persyaratan jaringan neural dan cara menentukan komponen utama
  • Sintaks dan kata kunci bahasa pemrogram spesifikasi Net#
  • Contoh jaringan neural kustom yang dibuat menggunakan Net#

Dasar-dasar jaringan neural

Struktur jaringan neural terdiri dari simpul-simpul yang diatur dalam lapisan, dan koneksi tertimbang (atau tepi) di antara simpul-simpul. Koneksi terarah, dan setiap koneksi memiliki simpul sumber serta simpul tujuan.

Setiap lapisan yang dapat dilatih (lapisan tersembunyi atau output) memiliki satu atau beberapa bundel koneksi. Bundel koneksi terdiri dari lapisan sumber dan spesifikasi koneksi dari lapisan sumber tersebut. Semua koneksi dalam sumber bundel bersama dan lapisan tujuan yang diberikan. Di Net#, bundel koneksi dianggap sebagai bagian dari lapisan tujuan bundel.

Net# mendukung berbagai jenis bundel koneksi, yang memungkinkan Anda menyesuaikan cara input dipetakan ke lapisan tersembunyi dan output.

Bundel default atau standarnya adalah bundel penuh, saat setiap simpul di lapisan sumber tersambung ke setiap simpul di lapisan tujuan.

Selain itu, Net# mendukung empat jenis bundel koneksi lanjutan berikut:

  • Bundel terfilter. Anda dapat menentukan predikat dengan menggunakan lokasi simpul lapisan sumber dan simpul lapisan tujuan. Simpul tersambung setiap kali predikat bernilai True.

  • Bundel konvolusional. Anda dapat menentukan lingkungan kecil simpul di lapisan sumber. Setiap simpul di lapisan tujuan tersambung ke salah satu lingkungan simpul di lapisan sumber.

  • Bundel terkumpulan dan Bundel normalisasi Respons. Kedua bundel ini mirip dengan bundel konvolusional di mana pengguna menentukan lingkungan kecil simpul di lapisan sumber. Perbedaannya adalah berat tiap tepi dalam kedua bundel ini tidak dapat dilatih. Sebagai gantinya, fungsi yang telah dibuat sistem diterapkan ke nilai simpul sumber untuk menentukan nilai simpul tujuan.

Penyesuaian yang didukung

Arsitektur model jaringan neural yang Anda buat di Studio Azure Machine Learning (klasik) dapat disesuaikan secara ekstensif dengan menggunakan Net#. Anda dapat:

  • Membuat lapisan tersembunyi dan mengontrol jumlah simpul di setiap lapisan.
  • Menentukan cara lapisan akan tersambung satu sama lain.
  • Menentukan struktur konektivitas khusus, seperti bundel konvolusi dan bundel berbagi berat.
  • Menentukan fungsi aktivasi yang berbeda.

Untuk detail sintaks bahasa pemrogram spesifikasi, lihat Spesifikasi Struktur.

Untuk contoh pendefinisian jaringan neural untuk beberapa tugas pembelajaran mesin umum, dari yang paling sederhana hingga paling kompleks, lihat Contoh.

Persyaratan umum

  • Harus ada satu lapisan output, setidaknya satu lapisan input, dan nol atau lebih lapisan tersembunyi.
  • Setiap lapisan memiliki jumlah simpul tetap, disusun secara konseptual dalam array persegi panjang dimensi arbitrer.
  • Lapisan input tidak memiliki parameter terlatih terkait dan mewakili titik tempat data instans memasuki jaringan.
  • Lapisan yang dapat dilatih (lapisan tersembunyi dan output) telah mengaitkan parameter terlatih, yang dikenal sebagai berat dan bias.
  • Simpul sumber dan tujuan harus berada dalam lapisan terpisah.
  • Koneksi harus acyclic; dengan kata lain, tidak boleh ada rantai koneksi yang mengarah kembali ke simpul sumber awal.
  • Lapisan output tidak dapat menjadi lapisan sumber dari bundel koneksi.

Spesifikasi struktur

Spesifikasi struktur jaringan neural terdiri dari tiga bagian: deklarasi konstanta, deklarasi lapisan, deklarasi koneksi. Ada juga bagian deklarasi bersama yang bersifat opsional. Bagian tersebut dapat ditentukan dalam urutan apa pun.

Deklarasi konstanta

Deklarasi konstanta bersifat opsional. Deklarasi ini menyediakan sarana untuk menentukan nilai yang digunakan di tempat lain dalam definisi jaringan neural. Pernyataan deklarasi terdiri dari pengidentifikasi diikuti dengan tanda sama dengan dan ekspresi nilai.

Misalnya, pernyataan berikut mendefinisikan konstanta x:

Const X = 28;

Untuk menentukan dua atau lebih konstanta secara bersamaan, sertakan nama dan nilai pengidentifikasi dalam kurung kurawal, dan pisahkan dengan menggunakan titik koma. Contohnya:

Const { X = 28; Y = 4; }

Sisi kanan setiap ekspresi penugasan dapat menjadi bilangan bulat, bilangan riil, nilai Boolean (True atau False), atau ekspresi matematika. Contohnya:

Const { X = 17 * 2; Y = true; }

Deklarasi lapisan

Deklarasi lapisan diperlukan. Deklarasi ini mendefinisikan ukuran dan sumber lapisan, termasuk bundel dan atribut koneksinya. Pernyataan deklarasi dimulai dengan nama lapisan (input, tersembunyi, atau output), diikuti oleh dimensi lapisan (tupel bilangan bulat positif). Contohnya:

input Data auto;
hidden Hidden[5,20] from Data all;
output Result[2] from Hidden all;
  • Produk dimensi adalah jumlah simpul dalam lapisan. Dalam contoh ini, ada dua dimensi [5,20], yang berarti terdapat 100 node dalam lapisan.
  • Lapisan dapat dideklarasikan dalam urutan apa pun, dengan satu pengecualian: Jika lebih dari satu lapisan input ditentukan, urutan saat lapisan dideklarasikan harus cocok dengan urutan fitur dalam data input.

Untuk menentukan bahwa jumlah simpul dalam lapisan ditentukan secara otomatis, gunakan kata kunci auto. Kata kunci auto memiliki efek yang berbeda, tergantung pada lapisan:

  • Dalam deklarasi lapisan input, jumlah simpul adalah jumlah fitur dalam data input.
  • Dalam deklarasi lapisan tersembunyi, jumlah simpul adalah jumlah yang ditentukan oleh nilai parameter untuk Jumlah simpul tersembunyi.
  • Dalam deklarasi lapisan output, jumlah simpul adalah 2 untuk klasifikasi dua kelas, 1 untuk regresi, dan sama dengan jumlah simpul output untuk klasifikasi multikelas.

Misalnya, definisi jaringan berikut memungkinkan ukuran semua lapisan ditentukan secara otomatis:

input Data auto;
hidden Hidden auto from Data all;
output Result auto from Hidden all;

Deklarasi lapisan untuk lapisan yang dapat dilatih (lapisan tersembunyi atau output) secara opsional dapat mencakup fungsi output (juga disebut fungsi aktivasi), yang defaultnya ke sigmoid untuk model klasifikasi, dan linear untuk model regresi. Bahkan jika Anda menggunakan default, Anda dapat secara eksplisit menyatakan fungsi aktivasi, jika diperlukan untuk kejelasan.

Fungsi output berikut didukung:

  • sigmoid
  • linier
  • softmax
  • rlinear
  • square
  • sqrt
  • srlinear
  • abs
  • tanh
  • brlinear

Misalnya, deklarasi berikut menggunakan fungsi softmax:

output Result [100] softmax from Hidden all;

Deklarasi koneksi

Segera setelah mendefinisikan lapisan yang dapat dilatih, Anda harus mendeklarasikan koneksi di antara lapisan yang telah Anda tentukan. Deklarasi bundel koneksi dimulai dengan kata kunci from, diikuti dengan nama lapisan sumber bundel dan jenis bundel koneksi untuk dibuat.

Saat ini, lima jenis bundel koneksi didukung:

  • Bundel penuh, ditunjukkan oleh kata kunci all
  • Bundel terfilter, ditunjukkan dengan kata kunci where, diikuti dengan ekspresi predikat
  • Bundel konvolusional, ditunjukkan oleh kata kunci convolve, diikuti oleh atribut konvolusi
  • Bundel terkumpulan, ditunjukkan oleh kata kunci kumpulan maks atau kumpulan rata-rata
  • Bundel normalisasi respons, ditunjukkan oleh norma respons kata kunci

Bundel penuh

Bundel koneksi penuh mencakup koneksi dari setiap simpul dalam lapisan sumber ke setiap simpul di lapisan tujuan. Ini adalah tipe koneksi jaringan default.

Bundel terfilter

Spesifikasi bundel koneksi terfilter mencakup predikat, diekspresikan secara sintaks, mirip seperti ekspresi C# lambda. Contoh berikut menentukan dua bundel terfilter:

input Pixels [10, 20];
hidden ByRow[10, 12] from Pixels where (s,d) => s[0] == d[0];
hidden ByCol[5, 20] from Pixels where (s,d) => abs(s[1] - d[1]) <= 1;
  • Dalam predikat untuk ByRow, s adalah parameter yang mewakili indeks ke dalam array persegi panjang dari simpul lapisan input, Pixels, dan d merupakan parameter yang mewakili indeks ke dalam array simpul dari lapisan tersembunyi, ByRow. Jenis keduanya, baik s dan d merupakan tupel bilangan bulat panjang dua. Secara konseptual, s berkisar di semua pasang bilangan bulat dengan 0 <= s[0] < 10 dan 0 <= s[1] < 20, serta rentang d di atas semua pasang bilangan bulat, dengan 0 <= d[0] < 10 dan 0 <= d[1] < 12.

  • Di sisi kanan ekspresi predikat, ada sebuah kondisi. Dalam contoh ini, untuk setiap nilai s dan d sedemikian rupa hingga kondisinya True, ada tepi dari simpul lapisan sumber ke simpul lapisan tujuan. Dengan demikian, ekspresi filter ini menunjukkan bahwa bundel menyertakan koneksi dari simpul yang ditentukan oleh s ke simpul yang ditentukan oleh d dalam semua kasus saat s[0] sama dengan d[0].

Secara opsional, Anda dapat menentukan sekumpulan berat untuk bundel terfilter. Nilai untuk atribut Berat harus merupakan tupel nilai titik ambang dengan panjang yang cocok dengan sejumlah koneksi yang ditentukan oleh bundel. Secara default, berat dihasilkan secara acak.

Nilai berat dikelompokkan menurut indeks simpul tujuan. Artinya, jika simpul tujuan pertama tersambung ke simpul sumber K, elemen K pertama dari tupe Berat adalah berat simpul tujuan pertama, dalam urutan indeks sumber. Hal yang sama berlaku untuk simpul tujuan yang tersisa.

Dimungkinkan untuk menentukan berat secara langsung sebagai nilai konstanta. Misalnya, jika Anda mempelajari berat sebelumnya, Anda dapat menentukannya sebagai konstanta menggunakan sintaks ini:

const Weights_1 = [0.0188045055, 0.130500451, ...]

Bundel konvolusional

Saat data pelatihan memiliki struktur homogen, koneksi konvolusional biasanya digunakan untuk mempelajari fitur data tingkat tinggi. Misalnya, dalam data gambar, audio, atau video, dimensi spasial atau temporal bisa cukup seragam.

Bundel konvolusional menggunakan kernel persegi panjang yang meluncur melalui dimensi. Pada dasarnya, setiap kernel mendefinisikan sekumpulan berat yang diterapkan di lingkungan lokal, yang disebut sebagai aplikasi kernel. Setiap aplikasi kernel sesuai dengan simpul di lapisan sumber, yang disebut sebagai simpul pusat. Berat kernel dibagikan di antara banyak koneksi. Dalam bundel konvolusional, setiap kernel persegi panjang dan semua aplikasi kernel berukuran sama.

Bundel konvolusional mendukung atribut berikut:

InputShape mendefinisikan dimensi lapisan sumber untuk tujuan bundel konvolusional ini. Nilai harus tupel bilangan bulat positif. Produk bilangan bulat harus sama dengan jumlah simpul di lapisan sumber, tetapi jika tidak, produk tersebut tidak perlu cocok dengan dimensi yang dideklarasikan untuk lapisan sumber. Panjang tupel ini menjadi nilai aritas untuk bundel konvolusional. Biasanya aritas mengacu pada jumlah argumen atau operan yang dapat diambil fungsi.

Untuk menentukan bentuk dan lokasi kernel, gunakan atribut KernelShape, Stride, Padding, LowerPad, dan UpperPad:

  • KernelShape: (diperlukan) Mendefinisikan dimensi setiap kernel untuk bundel konvolusional. Nilai harus menjadi tupel bilangan bulat positif dengan panjang yang setara dengan aritas bundel. Setiap komponen tupel ini tidak boleh lebih besar dari komponen InputShape yang sesuai.

  • Stride: (opsional) Mendefinisikan ukuran langkah geser dari konvolusi (ukuran satu langkah untuk setiap dimensi), yaitu jarak antara simpul pusat. Nilai harus menjadi tupel bilangan bulat positif dengan panjang merupakan aritas bundel tersebut. Setiap komponen tupel ini tidak boleh lebih besar dari komponen KernelShape yang sesuai. Nilai defaultnya adalah tupel dengan semua komponen sama dengan satu.

  • Berbagi: (opsional) Menentukan berbagi berat untuk setiap dimensi konvolusi. Nilainya bisa menjadi nilai Boolean tunggal atau tupel nilai Boolean dengan panjang setara aritas bundel. Nilai Boolean tunggal diperluas menjadi tupel dengan panjang yang benar dengan semua komponen sama dengan nilai yang ditentukan. Nilai defaultnya adalah tupel yang terdiri dari semua nilai True.

  • MapCount: (opsional) Menentukan jumlah peta fitur untuk bundel konvolusional. Nilainya bisa menjadi bilangan bulat positif tunggal atau tupel bilangan bulat positif dengan panjang merupakan aritas bundel tersebut. Nilai bilangan bulat tunggal diperluas menjadi tupel dengan panjang yang benar dengan komponen pertama setara nilai yang ditentukan dan semua komponen yang tersisa sama dengan yang lain. Nilai defaultnya adalah satu. Jumlah total peta fitur adalah produk dari komponen tupel. Faktor jumlah total ini di seluruh komponen menentukan cara nilai peta fitur dikelompokkan dalam simpul tujuan.

  • Berat: (opsional) Menentukan berat awal untuk bundel. Nilai harus merupakan sejumlah nilai titik ambang dengan panjang yang merupakan jumlah kernel kali jumlah berat per kernel, seperti yang didefinisikan kemudian dalam artikel ini. Secara default, berat dihasilkan secara acak.

Ada dua set properti yang mengontrol padding yang saling eksklusif:

  • Padding: (opsional) Menentukan apakah input harus diberi ruang spasi dengan menggunakan skema padding default. Nilainya bisa menjadi nilai Boolean tunggal atau tupel nilai Boolean dengan panjang merupakan aritas bundel tersebut.

    Nilai Boolean tunggal diperluas menjadi tupel dengan panjang yang benar dengan semua komponen sama dengan nilai yang ditentukan.

    Jika nilai untuk dimensi adalah True, sumber secara logis diberi ruang spasi dalam dimensi tersebut dengan sel-sel bernilai nol untuk mendukung aplikasi kernel tambahan, sehingga simpul pusat kernel pertama dan terakhir dalam dimensi itu adalah simpul pertama dan terakhir dalam dimensi tersebut pada lapisan sumber. Dengan demikian, jumlah simpul "dummy" di setiap dimensi ditentukan secara otomatis, agar pas dengan kernel (InputShape[d] - 1) / Stride[d] + 1 yang tepat ke dalam lapisan yang memiliki ruang spasi.

    Jika nilai untuk dimensi adalah False, kernel didefinisikan sehingga jumlah simpul di setiap sisi yang ditinggalkan sama (hingga selisih 1). Nilai default atribut ini adalah tupel dengan semua komponen yang sama dengan False.

  • UpperPad dan LowerPad: (opsional) Memberikan kontrol yang lebih besar atas jumlah padding yang akan digunakan. Penting: Atribut ini dapat ditentukan jika dan hanya jika properti Padding di atas tidak ditentukan. Nilai harus berupa tupel bernilai bilangan bulat dengan panjang yang merupakan aritas bundel. Ketika atribut ini ditentukan, node "dummy" ditambahkan ke ujung bawah dan atas setiap dimensi lapisan input. Jumlah node yang ditambahkan ke ujung bawah dan atas di setiap dimensi masing-masing ditentukan oleh LowerPad[i] dan UpperPad[i].

    Untuk memastikan bahwa kernel hanya sesuai dengan simpul "nyata" dan simpul "dummy", kondisi berikut harus dipenuhi:

    • Setiap komponen LowerPad harus benar-benar kurang dari KernelShape[d]/2.

    • Setiap komponen UpperPad tidak boleh lebih besar dari KernelShape[d]/2.

    • Nilai default atribut ini adalah tupel dengan semua komponen yang sama dengan 0.

      Pengaturan Padding = true memungkinkan padding sebanyak yang diperlukan untuk menjaga "pusat" kernel di dalam input "nyata". Ini mengubah matematika sedikit untuk menghitung ukuran output. Umumnya, ukuran output D dihitung sebagai D = (I - K) / S + 1, di mana I ukuran input, K adalah ukuran kernel, S adalah stride, dan / merupakan pembagian bilangan bulat (bulat menuju nol). Jika Anda mengatur UpperPad = [1, 1], ukuran input I efektif 29, dan dengan demikian D = (29 - 5) / 2 + 1 = 13. Namun, ketika Padding = true, pada dasarnya I akan terbentur oleh K - 1; oleh karena itu D = ((28 + 4) - 5) / 2 + 1 = 27 / 2 + 1 = 13 + 1 = 14. Dengan menentukan nilai untuk UpperPad danLowerPad, Anda mendapatkan kontrol lebih besar atas padding daripada jika Anda hanya mengatur Padding = true.

Untuk informasi selengkapnya tentang jaringan konvolusional dan aplikasinya, lihat artikel ini:

Bundel terkumpulan

Bundel terkumpulan menerapkan geometri yang mirip dengan konektivitas konvolusional, tetapi menggunakan fungsi yang telah ditentukan sistem untuk sumber nilai simpul agar mendapatkan nilai simpul tujuan. Oleh karena itu, bundel terkumpulan tidak memiliki kondisi yang dapat dilatih (berat atau bias). Bundel terkumpulan mendukung semua atribut konvolusional kecuali Berbagi, MapCount, dan Berat.

Biasanya, kernel yang dirangkum oleh unit terkumpulan yang berdekatan tidak tumpang tindih. Jika Stride[d] sama dengan KernelShape[d] di setiap dimensi, lapisan yang diperoleh adalah lapisan terkumpulan lokal tradisional, yang umumnya digunakan dalam jaringan neural konvolusional. Setiap simpul tujuan menghitung maksimum atau rata-rata aktivitas kernelnya di lapisan sumber.

Contoh berikut mengilustrasikan bundel terkumpulan:

hidden P1 [5, 12, 12]
  from C1 max pool {
  InputShape  = [ 5, 24, 24];
   KernelShape = [ 1,  2,  2];
   Stride      = [ 1,  2,  2];
  }
  • Aritas dari bundel adalah 3: yaitu, panjang tupel InputShape, KernelShape, dan Stride.
  • Jumlah simpul di lapisan sumber adalah 5 * 24 * 24 = 2880.
  • Ini adalah lapisan terkumpulan lokal tradisional karena KernelShape dan Stride sama.
  • Jumlah simpul di lapisan tujuan adalah 5 * 12 * 12 = 1440.

Untuk informasi selengkapnya tentang lapisan terkumpulan, lihat artikel berikut ini:

Bundel normalisasi respons

Normalisasi respons adalah skema normalisasi lokal yang pertama kali diperkenalkan oleh Geoffrey Hinton, dkk, dalam makalah Klasifikasi ImageNet dengan Jaringan Neural Konvolusi Mendalam.

Normalisasi respons digunakan untuk membantu generalisasi dalam jaring neural. Saat satu neuron menembak pada tingkat aktivasi yang sangat tinggi, lapisan normalisasi respons lokal menekan tingkat aktivasi neuron di sekitarnya. Ini dilakukan dengan menggunakan tiga parameter ( α,β, dan k) serta struktur konvolusional (atau bentuk lingkungan). Setiap neuron di lapisan tujuan y sesuai dengan neuron x di lapisan sumber. Tingkat aktivasi y diberikan oleh rumus berikut, saat f adalah tingkat aktivasi neuron, dan Nx merupakan kernel (atau set yang mengandung neuron di lingkungan x), seperti yang didefinisikan oleh struktur konvolusional berikut:

rumus untuk struktur konvolusional

Bundel normalisasi respons mendukung semua atribut konvolusional kecuali Berbagi, MapCount, dan Berat.

  • Jika kernel berisi neuron dalam peta yang sama dengan x, skema normalisasi disebut sebagai normalisasi peta yang sama. Untuk menentukan normalisasi peta yang sama, koordinat pertama dalam InputShape harus memiliki nilai 1.

  • Jika kernel berisi neuron dalam posisi spasial yang sama dengan x, tetapi neuron berada di peta lain, skema normalisasi disebut normalisasi lintas peta. Jenis normalisasi respons ini mengimplementasikan bentuk penghambatan lateral yang terinspirasi oleh jenis yang ditemukan dalam neuron nyata, membuat persaingan untuk tingkat aktivasi besar di antara output neuron yang dihitung pada peta yang berbeda. Untuk menentukan normalisasi peta, koordinat pertama harus bilangan bulat yang lebih besar dari satu dan tidak lebih besar dari jumlah peta, serta koordinat lainnya harus memiliki nilai 1.

Karena bundel normalisasi respons menerapkan fungsi yang telah ditetapkan sistem ke nilai simpul sumber untuk menentukan nilai simpul tujuan, bundel ini tidak memiliki kondisi yang dapat dilatih (berat atau bias).

Catatan

Simpul di lapisan tujuan sesuai dengan neuron yang merupakan simpul pusat kernel. Misalnya, jika KernelShape[d] adalah ganjil, maka KernelShape[d]/2 sesuai dengan simpul kernel pusat. Jika KernelShape[d] demikian, simpul pusat berada di KernelShape[d]/2 - 1. Oleh karena itu, jika Padding[d] adalah False, simpul KernelShape[d]/2 pertama dan terakhir tidak memiliki simpul yang sesuai di lapisan tujuan. Untuk menghindari situasi ini, tentukan Padding sebagai [benar, benar, ..., benar].

Selain empat atribut yang dijelaskan sebelumnya, bundel normalisasi respons juga mendukung atribut berikut:

  • Alpha: (diperlukan) Menentukan nilai titik ambang yang sesuai dengan α pada rumus sebelumnya.
  • Beta: (diperlukan) Menentukan nilai titik ambang yang sesuai dengan β pada rumus sebelumnya.
  • Offset: (opsional) Menentukan nilai titik ambang yang sesuai dengan k pada rumus sebelumnya. Defaultnya ke 1.

Contoh berikut menentukan bundel normalisasi respons menggunakan atribut berikut:

hidden RN1 [5, 10, 10]
from P1 response norm {
  InputShape  = [ 5, 12, 12];
  KernelShape = [ 1,  3,  3];
  Alpha = 0.001;
  Beta = 0.75;
  }
  • Lapisan sumber mencakup lima peta, masing-masing dengan dimensi 12x12, dengan total 1440 simpul.
  • Nilai KernelShape menunjukkan bahwa ini adalah lapisan normalisasi peta yang sama, saat lingkungannya adalah persegi panjang 3x3.
  • Nilai default Padding adalah False, sehingga lapisan tujuan hanya memiliki 10 simpul di setiap dimensi. Untuk menyertakan satu simpul di lapisan tujuan yang sesuai dengan setiap simpul di lapisan sumber, tambahkan Padding = [benar, benar, benar]; dan ubah ukuran RN1 menjadi [5, 12, 12].

Deklarasi bersama

Net# secara opsional mendukung definisi beberapa bundel dengan berat bersama. Berat dua bundel dapat dibagikan jika strukturnya sama. Sintaks berikut mendefinisikan bundel dengan berat bersama:

share-declaration:
  share    {    layer-list    }
  share    {    bundle-list    }
  share    {    bias-list    }

  layer-list:
    layer-name    ,    layer-name
    layer-list    ,    layer-name

  bundle-list:
    bundle-spec    ,    bundle-spec
    bundle-list    ,    bundle-spec

  bundle-spec:
    layer-name    =>     layer-name

  bias-list:
    bias-spec    ,    bias-spec
    bias-list    ,    bias-spec

  bias-spec:
    1    =>    layer-name

  layer-name:
    identifier

Misalnya, deklarasi bersama berikut menentukan nama lapisan, yang menunjukkan bahwa berat dan bias harus dibagikan:

Const {
  InputSize = 37;
  HiddenSize = 50;
  }
input {
  Data1 [InputSize];
  Data2 [InputSize];
  }
hidden {
  H1 [HiddenSize] from Data1 all;
  H2 [HiddenSize] from Data2 all;
  }
output Result [2] {
  from H1 all;
  from H2 all;
  }
share { H1, H2 } // share both weights and biases
  • Fitur input dipartisi menjadi dua lapisan input berukuran sama.
  • Lapisan tersembunyi lalu menghitung fitur tingkat yang lebih tinggi pada dua lapisan input.
  • Deklarasi bersama menentukan bahwa H1 dan H2 harus dihitung dengan cara yang sama dari input masing-masing.

Atau, ini dapat ditentukan dengan dua deklarasi bersama terpisah sebagai berikut:

share { Data1 => H1, Data2 => H2 } // share weights
<!-- -->
    share { 1 => H1, 1 => H2 } // share biases

Anda dapat menggunakan bentuk pendek hanya saat lapisan berisi satu bundel. Secara umum, berbagi hanya dimungkinkan ketika struktur yang relevan identik, yang berarti bahwa struktur tersebut memiliki ukuran yang sama, geometri konvolusional yang sama, dan sebagainya.

Contoh penggunaan Net#

Bagian ini menyediakan beberapa contoh bagaimana Anda dapat menggunakan Net# untuk menambahkan lapisan tersembunyi, menentukan cara lapisan tersembunyi berinteraksi dengan lapisan lain, dan membangun jaringan konvolusional.

Menentukan jaringan neural kustom sederhana: contoh "Halo Dunia"

Contoh sederhana ini menunjukkan cara membuat model jaringan neural yang memiliki satu lapisan tersembunyi.

input Data auto;
hidden H [200] from Data all;
output Out [10] sigmoid from H all;

Contohnya mengilustrasikan beberapa perintah dasar sebagai berikut:

  • Baris pertama mendefinisikan lapisan input (bernama Data). Saat Anda menggunakan kata kunci auto, jaringan neural secara otomatis menyertakan semua kolom fitur dalam contoh input.
  • Baris kedua membuat lapisan tersembunyi. Nama H ditugaskan ke lapisan tersembunyi, yang memiliki 200 simpul. Lapisan tersembunyi sepenuhnya tersambung ke lapisan input.
  • Baris ketiga mendefinisikan lapisan output (bernama Out), yang berisi 10 simpul output. Jika jaringan neural digunakan untuk klasifikasi, ada satu simpul output per kelas. Kata kunci sigmoid menunjukkan bahwa fungsi output diterapkan ke lapisan output.

Tentukan beberapa lapisan tersembunyi: contoh computer vision

Contoh berikut menunjukkan cara mendefinisikan jaringan neural yang sedikit lebih kompleks, dengan beberapa lapisan tersembunyi kustom.

// Define the input layers
input Pixels [10, 20];
input MetaData [7];

// Define the first two hidden layers, using data only from the Pixels input
hidden ByRow [10, 12] from Pixels where (s,d) => s[0] == d[0];
hidden ByCol [5, 20] from Pixels where (s,d) => abs(s[1] - d[1]) <= 1;

// Define the third hidden layer, which uses as source the hidden layers ByRow and ByCol
hidden Gather [100]
{
from ByRow all;
from ByCol all;
}

// Define the output layer and its sources
output Result [10]
{
from Gather all;
from MetaData all;
}

Contoh ini mengilustrasikan beberapa fitur bahasa pemrogram spesifikasi jaringan neural:

  • Strukturnya memiliki dua lapisan input, Pixels dan MetaData.
  • Lapisan Pixels adalah lapisan sumber untuk dua bundel koneksi, dengan lapisan tujuan, ByRow dan ByCol.
  • Lapisan Gather dan Result merupakan lapisan tujuan dalam beberapa bundel koneksi.
  • Lapisan output, Result, adalah lapisan tujuan dalam dua bundel koneksi; satu dengan lapisan tersembunyi tingkat kedua Gather sebagai lapisan tujuan, dan yang lain dengan lapisan input MetaData sebagai lapisan tujuan.
  • Lapisan tersembunyi, ByRow dan ByCol, menentukan konektivitas terfilter dengan menggunakan ekspresi predikat. Lebih tepatnya, simpul dalam ByRow di [x, y] tersambung ke simpul-simpul dalam Pixels yang memiliki koordinat indeks pertama sama dengan koordinat pertama simpul, x. Demikian pula, simpul dalam ByCol di [x, y] tersambung ke simpul-simpul dalam Pixels yang memiliki koordinat indeks kedua sama dengan koordinat kedua simpul, y.

Menentukan jaringan konvolusional untuk klasifikasi multikelas: contoh pengenalan digit

Definisi jaringan berikut dirancang untuk mengenali angka, dan menggambarkan beberapa teknik canggih untuk menyesuaikan jaringan neural.

input Image [29, 29];
hidden Conv1 [5, 13, 13] from Image convolve
  {
  InputShape  = [29, 29];
  KernelShape = [ 5,  5];
  Stride      = [ 2,  2];
  MapCount    = 5;
  }
hidden Conv2 [50, 5, 5]
from Conv1 convolve
  {
  InputShape  = [ 5, 13, 13];
  KernelShape = [ 1,  5,  5];
  Stride      = [ 1,  2,  2];
  Sharing     = [false, true, true];
  MapCount    = 10;
  }
hidden Hid3 [100] from Conv2 all;
output Digit [10] from Hid3 all;
  • Strukturnya memiliki lapisan input tunggal, Image.

  • Kata kunci convolve menunjukkan bahwa lapisan bernama Conv1 dan Conv2 merupakan lapisan konvolusional. Setiap deklarasi lapisan ini diikuti oleh daftar atribut konvolusi.

  • Net memiliki lapisan tersembunyi ketiga, Hid3, yang sepenuhnya tersambung ke lapisan tersembunyi kedua, Conv2.

  • Lapisan output, Digit, hanya tersambung ke lapisan tersembunyi ketiga, Hid3. Kata kunci all menunjukkan bahwa lapisan output sepenuhnya tersambung ke Hid3.

  • Aritas konvolusi adalah tiga: panjang tuples InputShape, KernelShape, Stride, dan Sharing.

  • Jumlah berat per kernel adalah 1 + KernelShape\[0] * KernelShape\[1] * KernelShape\[2] = 1 + 1 * 5 * 5 = 26. Atau 26 * 50 = 1300.

  • Anda dapat menghitung simpul di setiap lapisan tersembunyi sebagai berikut:

    NodeCount\[0] = (5 - 1) / 1 + 1 = 5 NodeCount\[1] = (13 - 5) / 2 + 1 = 5 NodeCount\[2] = (13 - 5) / 2 + 1 = 5

  • Jumlah total simpul dapat dihitung dengan menggunakan dimensi lapisan yang dideklarasikan, [50, 5, 5], sebagai berikut: MapCount * NodeCount\[0] * NodeCount\[1] * NodeCount\[2] = 10 * 5 * 5 * 5

  • Karena Sharing[d] adalah False hanya untuk d == 0, jumlah kernel adalah MapCount * NodeCount\[0] = 10 * 5 = 50.

Ucapan terima kasih

Bahasa pemrogram Net# untuk penyesuaian arsitektur jaringan neural dikembangkan di Microsoft oleh Shon Katzenberger (Arsitek, Azure Machine Learning) dan Alexey Kamenev (Insinyur Perangkat Lunak, Microsoft Research). Ini digunakan secara internal untuk proyek dan aplikasi pembelajaran mesin mulai dari deteksi gambar hingga analitik teks. Untuk informasi selengkapnya, lihat Jaring Neural di studio Azure Machine Learning - Pengantar Net#