


sukar dipercayai! Gunakan Numpy untuk membangunkan rangka kerja pembelajaran mendalam dan melihat ke dalam proses latihan rangkaian saraf
Helo, semua.
Hari ini saya ingin berkongsi dengan anda projek sumber terbuka yang sangat hebat, saya membangunkan rangka kerja pembelajaran mendalam menggunakan Numpy pada asasnya sama dengan Pytorch.
Hari ini kami mengambil rangkaian neural convolutional ringkas sebagai contoh untuk menganalisis langkah teras yang terlibat dalam proses latihan rangkaian saraf, seperti perambatan ke hadapan, perambatan belakang dan pengoptimuman parameter Kod sumber.
Set data dan kod yang digunakan telah dibungkus, dan terdapat cara untuk mendapatkannya di penghujung artikel.
1. Persediaan
Sediakan data dan kod terlebih dahulu.
1.1 Bina rangkaian
Mula-mula, muat turun kod sumber rangka kerja, alamat: https://github.com/duma-repo/PyDyNet
git clone https://github.com/duma-repo/PyDyNet.git
Bina LeNet rangkaian rangkaian neural konvolusi untuk melatih model tiga klasifikasi.
Cukup buat fail kod terus dalam direktori PyDyNet.
from pydynet import nn class LeNet(nn.Module): def __init__(self): super().__init__() self.conv1 = nn.Conv2d(1, 6, kernel_size=5, padding=2) self.conv2 = nn.Conv2d(6, 16, kernel_size=5) self.avg_pool = nn.AvgPool2d(kernel_size=2, stride=2, padding=0) self.sigmoid = nn.Sigmoid() self.fc1 = nn.Linear(16 * 5 * 5, 120) self.fc2 = nn.Linear(120, 84) self.fc3 = nn.Linear(84, 3) def forward(self, x): x = self.conv1(x) x = self.sigmoid(x) x = self.avg_pool(x) x = self.conv2(x) x = self.sigmoid(x) x = self.avg_pool(x) x = x.reshape(x.shape[0], -1) x = self.fc1(x) x = self.sigmoid(x) x = self.fc2(x) x = self.sigmoid(x) x = self.fc3(x) return x
Seperti yang anda lihat, takrifan rangkaian adalah sama seperti sintaks Pytorch.
Dalam kod sumber yang saya sediakan, fungsi ringkasan disediakan untuk mencetak struktur rangkaian.
1.2 Sediakan data
Data latihan menggunakan set data Fanshion-MNIST, yang mengandungi 10 kategori gambar, 6k imej dalam setiap kategori.
Untuk mempercepatkan latihan, saya hanya mengekstrak 3 kategori pertama, sejumlah imej latihan 1.8w, untuk membuat model tiga klasifikasi.
1.3 Latihan model
import pydynet from pydynet import nn from pydynet import optim lr, num_epochs = 0.9, 10 optimizer = optim.SGD(net.parameters(), lr=lr) loss = nn.CrossEntropyLoss() for epoch in range(num_epochs): net.train() for i, (X, y) in enumerate(train_iter): optimizer.zero_grad() y_hat = net(X) l = loss(y_hat, y) l.backward() optimizer.step() with pydynet.no_grad(): metric.add(l.numpy() * X.shape[0], accuracy(y_hat, y), X.shape[0])
Kod latihan juga sama seperti Pytorch.
Perkara utama yang perlu dilakukan seterusnya ialah mendalami kod sumber latihan model untuk mempelajari prinsip latihan model.
2. train, no_grad dan eval
Net.train akan dipanggil sebelum model memulakan latihan.
def train(self, mode: bool = True): set_grad_enabled(mode) self.set_module_state(mode)
Seperti yang anda lihat, ia akan menetapkan grad(gradient) kepada True dan Tensor yang dibuat selepas itu boleh mempunyai kecerunan. Selepas Tensor membawa kecerunan, ia akan dimasukkan ke dalam graf pengiraan dan menunggu terbitan untuk mengira kecerunan.
Yang berikut dengan no_grad(): kod
class no_grad: def __enter__(self) -> None: self.prev = is_grad_enable() set_grad_enabled(False)
akan menetapkan grad(gradient) kepada False, supaya Tensor yang dibuat kemudian tidak akan diletakkan dalam graf pengiraan, secara semula jadi Juga tidak perlu mengira kecerunan, yang boleh mempercepatkan inferens.
Kami sering melihat penggunaan net.eval() dalam Pytorch, dan kami juga melihat kod sumbernya.
def eval(self): return self.train(False)
Seperti yang anda lihat, ia secara terus memanggil train(False) untuk mematikan kecerunan, dan kesannya serupa dengan no_grad().
Jadi, kereta api biasanya dipanggil untuk menghidupkan kecerunan sebelum latihan. Selepas latihan, panggil eval untuk menutup kecerunan untuk memudahkan inferens pantas.
3. Rambatan ke hadapan
Selain mengira kebarangkalian kategori, perkara yang paling penting dalam perambatan ke hadapan ialah menyusun tensor dalam rangkaian ke dalam graf pengiraan dalam susunan perambatan ke hadapan. Tujuan Ia digunakan untuk mengira kecerunan setiap tensor semasa perambatan belakang.
Tensor dalam rangkaian saraf bukan sahaja digunakan untuk menyimpan data, tetapi juga untuk mengira dan menyimpan kecerunan.
Ambil operasi lilitan lapisan pertama sebagai contoh untuk melihat cara menjana graf pengiraan.
def conv2d(x: tensor.Tensor, kernel: tensor.Tensor, padding: int = 0, stride: int = 1): '''二维卷积函数 ''' N, _, _, _ = x.shape out_channels, _, kernel_size, _ = kernel.shape pad_x = __pad2d(x, padding) col = __im2col2d(pad_x, kernel_size, stride) out_h, out_w = col.shape[-2:] col = col.transpose(0, 4, 5, 1, 2, 3).reshape(N * out_h * out_w, -1) col_filter = kernel.reshape(out_channels, -1).T out = col @ col_filter return out.reshape(N, out_h, out_w, -1).transpose(0, 3, 1, 2)
x ialah imej input, dan tidak perlu merakam kecerunan. Kernel ialah berat kernel lilitan dan perlu mengira kecerunan.
Jadi, tensor baharu yang dijana oleh pad_x = __pad2d(x, padding) juga tidak mempunyai kecerunan, jadi ia tidak perlu ditambah pada graf pengiraan.
Tensor yang dijana oleh kernel.reshape(out_channels, -1) perlu mengira kecerunan dan juga perlu ditambah pada graf pengiraan.
Mari kita lihat proses penyambungan:
def reshape(self, *new_shape): return reshape(self, new_shape) class reshape(UnaryOperator): ''' 张量形状变换算子,在Tensor中进行重载 Parameters ---------- new_shape : tuple 变换后的形状,用法同NumPy ''' def __init__(self, x: Tensor, new_shape: tuple) -> None: self.new_shape = new_shape super().__init__(x) def forward(self, x: Tensor) return x.data.reshape(self.new_shape) def grad_fn(self, x: Tensor, grad: np.ndarray) return grad.reshape(x.shape)
Fungsi reshape akan mengembalikan objek kelas reshape Kelas reshape mewarisi kelas UnaryOperator dan dalam __init__. fungsi, Fungsi permulaan kelas induk dipanggil.
class UnaryOperator(Tensor): def __init__(self, x: Tensor) -> None: if not isinstance(x, Tensor): x = Tensor(x) self.device = x.device super().__init__( data=self.forward(x), device=x.device, # 这里 requires_grad 为 True requires_grad=is_grad_enable() and x.requires_grad, )
Kelas UnaryOperator mewarisi kelas Tensor, jadi objek bentuk semula juga merupakan tensor.
Dalam fungsi __init__ UnaryOperator, panggil fungsi pemulaan Tensor dan parameter_grad yang diperlukan adalah Benar, yang bermaksud bahawa kecerunan perlu dikira. Kod pengiraan
requires_grad ialah is_grad_enable() dan x.requires_grad is_grad_enable() telah ditetapkan kepada True dengan kereta api, dan x ialah kernel convolution, dan require_gradnya juga True.
class Tensor: def __init__( self, data: Any, dtype=None, device: Union[Device, int, str, None] = None, requires_grad: bool = False, ) -> None: if self.requires_grad: # 不需要求梯度的节点不出现在动态计算图中 Graph.add_node(self)
Akhir sekali, dalam kaedah permulaan kelas Tensor, panggil Graph.add_node(self) untuk menambah tensor semasa pada graf pengiraan.
Begitu juga, tensor baharu yang biasa dilihat di bawah menggunakan tensor yang memerlukan_grad=True akan diletakkan dalam graf pengiraan.
Selepas operasi lilitan, 6 nod akan ditambah pada graf pengiraan.
4. Rambatan belakang
Selepas satu rambatan ke hadapan selesai, mulakan dari nod terakhir dalam graf pengiraan dan lakukan rambatan belakang dari belakang ke hadapan.
l = loss(y_hat, y) l.backward()
disebarkan lapisan demi lapisan melalui rangkaian hadapan dan akhirnya dihantar ke loss tensor l.
Mengambil l sebagai titik permulaan dan merambat dari hadapan ke belakang, kecerunan setiap nod dalam graf pengiraan boleh dikira.
Kod teras ke belakang adalah seperti berikut:
def backward(self, retain_graph: bool = False): for node in Graph.node_list[y_id::-1]: grad = node.grad for last in [l for l in node.last if l.requires_grad]: add_grad = node.grad_fn(last, grad) last.grad += add_grad
Graph.node_list[y_id::-1] mengisih graf pengiraan dalam susunan songsang.
node是前向传播时放入计算图中的每个tensor。
node.last 是生成当前tensor的直接父节点。
调用node.grad_fn计算梯度,并反向传给它的父节点。
grad_fn其实就是Tensor的求导公式,如:
class pow(BinaryOperator): ''' 幂运算算子,在Tensor类中进行重载 See also -------- add : 加法算子 ''' def grad_fn(self, node: Tensor, grad: np.ndarray) if node is self.last[0]: return (self.data * self.last[1].data / node.data) * grad
return后的代码其实就是幂函数求导公式。
假设y=x^2,x的导数为2x。
5. 更新参数
反向传播计算梯度后,便可以调用优化器,更新模型参数。
l.backward() optimizer.step()
本次训练我们用梯度下降SGD算法优化参数,更新过程如下:
def step(self): for i in range(len(self.params)): grad = self.params[i].grad + self.weight_decay * self.params[i].data self.v[i] *= self.momentum self.v[i] += self.lr * grad self.params[i].data -= self.v[i] if self.nesterov: self.params[i].data -= self.lr * grad
self.params是整个网络的权重,初始化SGD时传进去的。
step函数最核心的两行代码,self.v[i] += self.lr * grad 和 self.params[i].data -= self.v[i],用当前参数 - 学习速率 * 梯度更新当前参数。
这是机器学习的基础内容了,我们应该很熟悉了。
一次模型训练的完整过程大致就串完了,大家可以设置打印语句,或者通过DEBUG的方式跟踪每一行代码的执行过程,这样可以更了解模型的训练过程。
Atas ialah kandungan terperinci sukar dipercayai! Gunakan Numpy untuk membangunkan rangka kerja pembelajaran mendalam dan melihat ke dalam proses latihan rangkaian saraf. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Ditulis sebelum ini, hari ini kita membincangkan bagaimana teknologi pembelajaran mendalam boleh meningkatkan prestasi SLAM berasaskan penglihatan (penyetempatan dan pemetaan serentak) dalam persekitaran yang kompleks. Dengan menggabungkan kaedah pengekstrakan ciri dalam dan pemadanan kedalaman, di sini kami memperkenalkan sistem SLAM visual hibrid serba boleh yang direka untuk meningkatkan penyesuaian dalam senario yang mencabar seperti keadaan cahaya malap, pencahayaan dinamik, kawasan bertekstur lemah dan seks yang teruk. Sistem kami menyokong berbilang mod, termasuk konfigurasi monokular, stereo, monokular-inersia dan stereo-inersia lanjutan. Selain itu, ia juga menganalisis cara menggabungkan SLAM visual dengan kaedah pembelajaran mendalam untuk memberi inspirasi kepada penyelidikan lain. Melalui percubaan yang meluas pada set data awam dan data sampel sendiri, kami menunjukkan keunggulan SL-SLAM dari segi ketepatan kedudukan dan keteguhan penjejakan.

Alat pengaturcaraan berbantukan AI ini telah menemui sejumlah besar alat pengaturcaraan berbantukan AI yang berguna dalam peringkat pembangunan AI yang pesat ini. Alat pengaturcaraan berbantukan AI boleh meningkatkan kecekapan pembangunan, meningkatkan kualiti kod dan mengurangkan kadar pepijat Ia adalah pembantu penting dalam proses pembangunan perisian moden. Hari ini Dayao akan berkongsi dengan anda 4 alat pengaturcaraan berbantukan AI (dan semua menyokong bahasa C# saya harap ia akan membantu semua orang). https://github.com/YSGStudyHards/DotNetGuide1.GitHubCopilotGitHubCopilot ialah pembantu pengekodan AI yang membantu anda menulis kod dengan lebih pantas dan dengan sedikit usaha, supaya anda boleh lebih memfokuskan pada penyelesaian masalah dan kerjasama. Git

Cara menaik taraf versi numpy: Tutorial yang mudah diikuti, memerlukan contoh kod konkrit Pengenalan: NumPy ialah perpustakaan Python penting yang digunakan untuk pengkomputeran saintifik. Ia menyediakan objek tatasusunan berbilang dimensi yang berkuasa dan satu siri fungsi berkaitan yang boleh digunakan untuk melaksanakan operasi berangka yang cekap. Apabila versi baharu dikeluarkan, ciri yang lebih baharu dan pembetulan pepijat sentiasa tersedia kepada kami. Artikel ini akan menerangkan cara untuk menaik taraf pustaka NumPy anda yang dipasang untuk mendapatkan ciri terkini dan menyelesaikan isu yang diketahui. Langkah 1: Semak versi NumPy semasa pada permulaan

Dalam gelombang perubahan teknologi yang pesat hari ini, Kecerdasan Buatan (AI), Pembelajaran Mesin (ML) dan Pembelajaran Dalam (DL) adalah seperti bintang terang, menerajui gelombang baharu teknologi maklumat. Ketiga-tiga perkataan ini sering muncul dalam pelbagai perbincangan dan aplikasi praktikal yang canggih, tetapi bagi kebanyakan peneroka yang baru dalam bidang ini, makna khusus dan hubungan dalaman mereka mungkin masih diselubungi misteri. Jadi mari kita lihat gambar ini dahulu. Dapat dilihat bahawa terdapat korelasi rapat dan hubungan progresif antara pembelajaran mendalam, pembelajaran mesin dan kecerdasan buatan. Pembelajaran mendalam ialah bidang khusus pembelajaran mesin dan pembelajaran mesin

Hampir 20 tahun telah berlalu sejak konsep pembelajaran mendalam dicadangkan pada tahun 2006. Pembelajaran mendalam, sebagai revolusi dalam bidang kecerdasan buatan, telah melahirkan banyak algoritma yang berpengaruh. Jadi, pada pendapat anda, apakah 10 algoritma teratas untuk pembelajaran mendalam? Berikut adalah algoritma teratas untuk pembelajaran mendalam pada pendapat saya Mereka semua menduduki kedudukan penting dari segi inovasi, nilai aplikasi dan pengaruh. 1. Latar belakang rangkaian saraf dalam (DNN): Rangkaian saraf dalam (DNN), juga dipanggil perceptron berbilang lapisan, adalah algoritma pembelajaran mendalam yang paling biasa Apabila ia mula-mula dicipta, ia dipersoalkan kerana kesesakan kuasa pengkomputeran tahun, kuasa pengkomputeran, Kejayaan datang dengan letupan data. DNN ialah model rangkaian saraf yang mengandungi berbilang lapisan tersembunyi. Dalam model ini, setiap lapisan menghantar input ke lapisan seterusnya dan

Pada 3 Mac 2022, kurang daripada sebulan selepas kelahiran pengaturcara AI pertama di dunia, Devin, pasukan NLP Universiti Princeton membangunkan pengaturcara AI sumber terbuka ejen SWE. Ia memanfaatkan model GPT-4 untuk menyelesaikan isu secara automatik dalam repositori GitHub. Prestasi ejen SWE pada set ujian bangku SWE adalah serupa dengan Devin, mengambil purata 93 saat dan menyelesaikan 12.29% masalah. Dengan berinteraksi dengan terminal khusus, ejen SWE boleh membuka dan mencari kandungan fail, menggunakan semakan sintaks automatik, mengedit baris tertentu dan menulis serta melaksanakan ujian. (Nota: Kandungan di atas adalah sedikit pelarasan bagi kandungan asal, tetapi maklumat utama dalam teks asal dikekalkan dan tidak melebihi had perkataan yang ditentukan.) SWE-A

Tutorial aplikasi mudah alih pembangunan bahasa Go Memandangkan pasaran aplikasi mudah alih terus berkembang pesat, semakin ramai pembangun mula meneroka cara menggunakan bahasa Go untuk membangunkan aplikasi mudah alih. Sebagai bahasa pengaturcaraan yang mudah dan cekap, bahasa Go juga telah menunjukkan potensi yang kukuh dalam pembangunan aplikasi mudah alih. Artikel ini akan memperkenalkan secara terperinci cara menggunakan bahasa Go untuk membangunkan aplikasi mudah alih dan melampirkan contoh kod khusus untuk membantu pembaca bermula dengan cepat dan mula membangunkan aplikasi mudah alih mereka sendiri. 1. Persediaan Sebelum memulakan, kita perlu menyediakan persekitaran dan alatan pembangunan. kepala

Editor |. Kulit Lobak Sejak pengeluaran AlphaFold2 yang berkuasa pada tahun 2021, saintis telah menggunakan model ramalan struktur protein untuk memetakan pelbagai struktur protein dalam sel, menemui ubat dan melukis "peta kosmik" setiap interaksi protein yang diketahui. Baru-baru ini, Google DeepMind mengeluarkan model AlphaFold3, yang boleh melakukan ramalan struktur bersama untuk kompleks termasuk protein, asid nukleik, molekul kecil, ion dan sisa yang diubah suai. Ketepatan AlphaFold3 telah dipertingkatkan dengan ketara berbanding dengan banyak alat khusus pada masa lalu (interaksi protein-ligan, interaksi asid protein-nukleik, ramalan antibodi-antigen). Ini menunjukkan bahawa dalam satu rangka kerja pembelajaran mendalam yang bersatu, adalah mungkin untuk dicapai
