日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人工智能 > 卷积神经网络 >内容正文

卷积神经网络

atm取款机的简单程序代码_LeNet:一个简单的卷积神经网络PyTorch实现

發(fā)布時間:2024/7/5 卷积神经网络 76 豆豆
生活随笔 收集整理的這篇文章主要介紹了 atm取款机的简单程序代码_LeNet:一个简单的卷积神经网络PyTorch实现 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前兩篇文章分別介紹了卷積層和池化層,卷積和池化是卷積神經(jīng)網(wǎng)絡(luò)必備的兩大基礎(chǔ)。本文我們將介紹一個早期用來識別手寫數(shù)字圖像的卷積神經(jīng)網(wǎng)絡(luò):LeNet[1]。LeNet名字來源于論文的第一作者Yann LeCun。1989年,LeNet使用卷積神經(jīng)網(wǎng)絡(luò)和梯度下降法,使得手寫數(shù)字識別達到當(dāng)時領(lǐng)先水平。這個奠基性的工作第一次將卷積神經(jīng)網(wǎng)絡(luò)推上歷史舞臺,為世人所知。由于LeNet的出色表現(xiàn),在很多ATM取款機上,LeNet被用來識別數(shù)字字符。

本文基于PyTorch和TensorFlow 2的代碼已經(jīng)放在了我的GitHub上:https://github.com/luweizheng/machine-learning-notes/tree/master/neural-network/cnn。

網(wǎng)絡(luò)模型結(jié)構(gòu)

LeNet的網(wǎng)絡(luò)結(jié)構(gòu)如下圖所示。

LeNet分為卷積層塊和全連接層塊兩個部分。

卷積層塊里的基本單位是卷積層后接最大池化層:卷積層用來識別圖像里的空間模式,如線條和物體局部,之后的最大池化層則用來降低卷積層對位置的敏感性。卷積層塊由卷積層加池化層兩個這樣的基本單位重復(fù)堆疊構(gòu)成。在卷積層塊中,每個卷積層都使用5×5的窗口,并在輸出上使用Sigmoid激活函數(shù)。整個模型的輸入是1維的黑白圖像,圖像尺寸為28×28。第一個卷積層輸出通道數(shù)為6,第二個卷積層輸出通道數(shù)則增加到16。這是因為第二個卷積層比第一個卷積層的輸入的高和寬要小,所以增加輸出通道使兩個卷積層的參數(shù)尺寸類似。卷積層塊的兩個最大池化層的窗口形狀均為2×2,且步幅為2。由于池化窗口與步幅形狀相同,池化窗口在輸入上每次滑動所覆蓋的區(qū)域互不重疊。

我們通過PyTorch的Sequential類來實現(xiàn)LeNet模型。

class LeNet(nn.Module): def __init__(self): super(LeNet, self).__init__() # 輸入 1 * 28 * 28 self.conv = nn.Sequential( # 卷積層1 # 在輸入基礎(chǔ)上增加了padding,28 * 28 -> 32 * 32 # 1 * 32 * 32 -> 6 * 28 * 28 nn.Conv2d(in_channels=1, out_channels=6, kernel_size=5, padding=2), nn.Sigmoid(), # 6 * 28 * 28 -> 6 * 14 * 14 nn.MaxPool2d(kernel_size=2, stride=2), # kernel_size, stride # 卷積層2 # 6 * 14 * 14 -> 16 * 10 * 10 nn.Conv2d(in_channels=6, out_channels=16, kernel_size=5), nn.Sigmoid(), # 16 * 10 * 10 -> 16 * 5 * 5 nn.MaxPool2d(kernel_size=2, stride=2) ) self.fc = nn.Sequential( # 全連接層1 nn.Linear(in_features=16 * 5 * 5, out_features=120), nn.Sigmoid(), # 全連接層2 nn.Linear(in_features=120, out_features=84), nn.Sigmoid(), nn.Linear(in_features=84, out_features=10) ) def forward(self, img): feature = self.conv(img) output = self.fc(feature.view(img.shape[0], -1)) return output復(fù)制代碼

我們有必要梳理一下模型各層的參數(shù)。輸入形狀為通道數(shù)為1的圖像(1維黑白圖像),尺寸為28×28,經(jīng)過第一個5×5的卷積層,卷積時上下左右都使用了2個元素作為填充,輸出形狀為:(28 - 5 + 4 + 1) × (28 - 5 + 4 + 1) = 28 × 28。第一個卷積層輸出共6個通道,輸出形狀為:6 × 28 × 28。最大池化層核大小2×2,步幅為2,高和寬都被折半,形狀為:6 × 14 × 14。第二個卷積層的卷積核也為5 × 5,但是沒有填充,所以輸出形狀為:(14 - 5 + 1) × (14 - 5 + 1) = 10 × 10。第二個卷積核的輸出為16個通道,所以變成了 16 × 10 × 10。經(jīng)過最大池化層后,高和寬折半,最終為:16 × 5 × 5。

卷積層塊的輸出形狀為(batch_size, output_channels, height, width),在本例中是(batch_size, 16, 5, 5),其中,batch_size是可以調(diào)整大小的。當(dāng)卷積層塊的輸出傳入全連接層塊時,全連接層塊會將一個batch中每個樣本變平(flatten)。原來是形狀是:(通道數(shù) × 高 × 寬),現(xiàn)在直接變成一個長向量,向量長度為通道數(shù) × 高 × 寬。在本例中,展平后的向量長度為:16 × 5 × 5 = 400。全連接層塊含3個全連接層。它們的輸出個數(shù)分別是120、84和10,其中10為輸出的類別個數(shù)。

訓(xùn)練模型

基于上面的網(wǎng)絡(luò),我們開始訓(xùn)練模型。我們使用Fashion-MNIST作為訓(xùn)練數(shù)據(jù)集,很多框架,比如PyTorc提供了Fashion-MNIST數(shù)據(jù)讀取的模塊,我做了一個簡單的封裝:

def load_data_fashion_mnist(batch_size, resize=None, root='~/Datasets/FashionMNIST'): """Use torchvision.datasets module to download the fashion mnist dataset and then load into memory.""" trans = [] if resize: trans.append(torchvision.transforms.Resize(size=resize)) trans.append(torchvision.transforms.ToTensor()) transform = torchvision.transforms.Compose(trans) mnist_train = torchvision.datasets.FashionMNIST(root=root, train=True, download=True, transform=transform) mnist_test = torchvision.datasets.FashionMNIST(root=root, train=False, download=True, transform=transform) if sys.platform.startswith('win'): num_workers = 0 else: num_workers = 4 train_iter = torch.utils.data.DataLoader(mnist_train, batch_size=batch_size, shuffle=True, num_workers=num_workers) test_iter = torch.utils.data.DataLoader(mnist_test, batch_size=batch_size, shuffle=False, num_workers=num_workers) return train_iter, test_iter復(fù)制代碼

load_data_fashion_mnist()方法返回訓(xùn)練集和測試集。

在訓(xùn)練過程中,我們希望看到每一輪迭代的準(zhǔn)確度,構(gòu)造一個evaluate_accuracy方法,計算當(dāng)前一輪迭代的準(zhǔn)確度(模型預(yù)測值與真實值之間的誤差大小):

def evaluate_accuracy(data_iter, net, device=None): if device is None and isinstance(net, torch.nn.Module): device = list(net.parameters())[0].device acc_sum, n = 0.0, 0 with torch.no_grad(): for X, y in data_iter: if isinstance(net, torch.nn.Module): # set the model to evaluation mode (disable dropout) net.eval() # get the acc of this batch acc_sum += (net(X.to(device)).argmax(dim=1) == y.to(device)).float().sum().cpu().item() # change back to train mode net.train() n += y.shape[0] return acc_sum / n復(fù)制代碼

接著,我們可以構(gòu)建一個train()方法,用來訓(xùn)練神經(jīng)網(wǎng)絡(luò):

def try_gpu(i=0): if torch.cuda.device_count() >= i + 1: return torch.device(f'cuda:{i}') return torch.device('cpu')def train(net, train_iter, test_iter, batch_size, optimizer, num_epochs, device=try_gpu()): net = net.to(device) print("training on", device) loss = torch.nn.CrossEntropyLoss() batch_count = 0 for epoch in range(num_epochs): train_l_sum, train_acc_sum, n = 0.0, 0.0, 0 for X, y in train_iter: X = X.to(device) y = y.to(device) y_hat = net(X) l = loss(y_hat, y) optimizer.zero_grad() l.backward() optimizer.step() train_l_sum += l.cpu().item() train_acc_sum += (y_hat.argmax(dim=1) == y).sum().cpu().item() n += y.shape[0] batch_count += 1 test_acc = evaluate_accuracy(test_iter, net) if epoch % 10 == 0: print(f'epoch {epoch + 1} : loss {train_l_sum / batch_count:.3f}, train acc {train_acc_sum / n:.3f}, test acc {test_acc:.3f}')復(fù)制代碼

在整個程序的主邏輯中,設(shè)置必要的參數(shù),讀入訓(xùn)練和測試數(shù)據(jù)并開始訓(xùn)練:

def main(): batch_size = 256 lr, num_epochs = 0.9, 100 net = LeNet() optimizer = torch.optim.SGD(net.parameters(), lr=lr) # load data train_iter, test_iter = load_data_fashion_mnist(batch_size=batch_size) # train train(net, train_iter, test_iter, batch_size, optimizer, num_epochs)復(fù)制代碼

小結(jié)

  • LeNet是一個最簡單的卷積神經(jīng)網(wǎng)絡(luò),卷積神經(jīng)網(wǎng)絡(luò)包含卷積塊部分和全連接層部分。
  • 卷積塊包括一個卷積層和一個池化層。
  • 參考文獻

  • LeCun, Y., Bottou, L., Bengio, Y., & Haffner, P. (1998). Gradient-based learning applied to document recognition. Proceedings of the IEEE, 86(11), 2278-2324.
  • http://d2l.ai/chapter_convolutional-neural-networks/lenet.html
  • https://tangshusen.me/Dive-into-DL-PyTorch/#/chapter05_CNN/5.5_lenet
  • 總結(jié)

    以上是生活随笔為你收集整理的atm取款机的简单程序代码_LeNet:一个简单的卷积神经网络PyTorch实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 欧美专区一区 | 中文字幕在线一区 | 亚洲一区二区影视 | 色噜噜狠狠一区二区三区牛牛影视 | 黄色大片aa| 精品无码在线观看 | 午夜亚洲天堂 | 精品91视频| 久久精品h | 夜夜操狠狠干 | 亚洲mv一区 | 奇米第四色首页 | 91视频一区二区三区 | 国产在线观看一区二区三区 | 成在线人免费视频 | а√中文在线资源库 | 黑人巨大精品一区二区在线 | 灌满闺乖女h高h调教尿h | 国产美女久久久久久 | 国产又粗又猛又黄又爽无遮挡 | 男女视频在线观看免费 | 国产传媒av在线 | 爆操91 | 欧美不卡在线视频 | av中文字幕免费在线观看 | av黄色av | 在线观看免费av网站 | 韩国一区视频 | 亚洲av第一成肉网 | 亚洲国产天堂av | 亚洲自拍成人 | 欧美丰满老熟妇aaaa片 | 久久久精品福利 | a级片一区二区 | 偷拍欧美亚洲 | 激情黄色小说网站 | 97理伦 | 亚洲精品 日韩无码 | av成人| 一个色亚洲 | 欧美性黄色 | 亚洲第一av在线 | 日韩二区在线观看 | 97在线免费视频 | 一本大道伊人av久久综合 | 无码h黄肉3d动漫在线观看 | 国产精品亚洲AV色欲三区不卡 | 国产一区视频网站 | 日本美女视频 | 超碰成人免费电影 | 成人午夜天 | 三级三级久久三级久久18 | 国产精品国语对白 | 四虎影院一区 | 怡红院av在线 | 女人18片毛片60分钟 | 国产日韩在线视频 | 免费看黄色一级片 | 成年人在线免费看 | 黄色在线免费网站 | www.射.com| 久久久久久黄 | 全黄性高潮 | 天堂欧美城网站网址 | 无码任你躁久久久久久久 | 69亚洲精品久久久蜜桃小说 | 免费观看已满十八岁 | 欧美人和黑人牲交网站上线 | 欧美在线视频一区二区三区 | 成人手机看片 | 欧美精品一区二区三区三州 | 精品视频久久 | 国产亚洲电影 | 欧美激情图片 | 涩涩网站在线看 | 日韩欧美电影一区二区三区 | 91美女片黄在线观看 | 淫综合网 | 国产精品三级在线 | 黄色aa级片| 欧美在线观看视频 | 欧美一区成人 | 激情xxxx | 色就色欧美 | 亚洲欧洲久久 | 午夜伦伦| 中国久久 | 精品福利视频导航 | 国产欧美亚洲一区二区 | 狠狠人妻久久久久久 | 四虎com| www在线看片 | 91福利专区 | 久久无码性爱视频 | 欧美日韩人妻精品一区二区 | 国产精品网页 | 久久97精品 | 亚洲色图在线播放 | 岛国av在线 |