自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

終于把卷積神經(jīng)網(wǎng)絡算法搞懂了?。?!

人工智能
卷積層是 CNN 的核心組成部分,它的作用是通過卷積操作從輸入數(shù)據(jù)中提取局部特征。卷積操作的基本思想是用一個小的濾波器(也叫卷積核)在輸入圖像上進行滑動,通過卷積運算生成特征圖。

大家好,我是小寒

今天給大家分享一個強大的算法模型,卷積神經(jīng)網(wǎng)絡算法

卷積神經(jīng)網(wǎng)絡算法(CNN)是一種專門用于處理具有網(wǎng)格結構數(shù)據(jù)(如圖像)的深度學習模型,廣泛應用于圖像分類、目標檢測、語義分割等任務。

CNN 的核心思想是通過模擬生物視覺皮層處理視覺信息的方式,能夠自動從圖像中提取特征,從而進行分類、檢測等任務。

圖片

卷積神經(jīng)網(wǎng)絡的基本組成

CNN 主要包括卷積層、池化層和全連接層。

卷積層

卷積層是 CNN 的核心組成部分,它的作用是通過卷積操作從輸入數(shù)據(jù)中提取局部特征。

卷積操作的基本思想是用一個小的濾波器(也叫卷積核)在輸入圖像上進行滑動,通過卷積運算生成特征圖。

圖片圖片

核心概念

  • 卷積核卷積核,也稱為濾波器(Filter),是卷積層中用于提取特征的一個小型權重矩陣。卷積核在輸入數(shù)據(jù)上滑動,通過與輸入數(shù)據(jù)的局部區(qū)域進行卷積運算,生成特征圖。通常,卷積核的大小為  或 ,選擇卷積核的大小時要考慮計算效率和特征的提取能力。

圖片圖片

  • 步長
    步長指的是卷積核在輸入數(shù)據(jù)上滑動的步長。通過調整步長的大小,可以控制輸出特征圖的尺寸。
    步長越大,輸出特征圖的尺寸越小,計算量也會減少,但可能會導致信息丟失。

圖片圖片

  • 填充
    為了控制輸出特征圖的尺寸,避免因為卷積操作導致特征圖的尺寸過小,通常會在輸入數(shù)據(jù)的邊緣進行填充。
    常見的填充方式有

無填充(Valid):不增加邊界,輸出特征圖較小。

零填充(Same):在輸入邊界填充零,使得輸出特征圖尺寸與輸入圖像尺寸相同

激活函數(shù)

卷積操作后的結果會通過一個非線性激活函數(shù)來引入非線性,使網(wǎng)絡能夠學習復雜的模式。

常見的激活函數(shù)包括

ReLU 函數(shù)通常用于卷積神經(jīng)網(wǎng)絡中的激活層,因為它能夠有效地解決梯度消失問題,并且計算速度較快。

圖片圖片

池化層

池化層用于對卷積層輸出的特征圖進行下采樣,減少特征圖的尺寸,從而減小計算量并增強模型的平移不變性。

常見的池化操作包括最大池化和平均池化。

  • 最大池化
    取池化窗口中的最大值,能夠保留最顯著的特征。
  • 平均池化
    取池化窗口中的平均值,適用于平滑特征。

圖片圖片

全連接層

在卷積層和池化層提取到足夠多的特征之后,通常會將這些特征圖展平(flatten)并輸入到全連接層。

在全連接層中,前一層的所有神經(jīng)元都會與這一層的每個神經(jīng)元相連接。通過加權和,最終輸出用于預測的結果。

圖片圖片

卷積神經(jīng)網(wǎng)絡算法的優(yōu)缺點

優(yōu)點

  • 自動特征提取
    CNN能夠從原始數(shù)據(jù)中自動提取特征,而無需人工設計特征。
    這是卷積神經(jīng)網(wǎng)絡最重要的優(yōu)勢之一。通過多層的卷積和池化操作,CNN能夠學習到從低級到高級的特征,例如邊緣、紋理、形狀、顏色等,而不需要手動提取這些特征。
  • 共享權重
    在卷積層中,同一個卷積核在輸入圖像的所有位置上共享權重,這使得 CNN 的參數(shù)數(shù)量大大減少。
    共享權重不僅減少了內存消耗,還提高了計算效率。
  • 局部感知
    卷積神經(jīng)網(wǎng)絡通過卷積核進行局部感知,每個卷積核只與圖像的一小部分區(qū)域進行計算。
    這種局部感知的特性使得網(wǎng)絡在圖像處理任務中能夠更有效地捕捉到圖像的局部特征。
    隨著網(wǎng)絡層次的加深,網(wǎng)絡逐漸從局部特征提取到全局特征,使得模型能夠捕捉到復雜的高層次抽象。
  • 平移不變性
    卷積操作對圖像進行滑動窗口處理,使得 CNN 具備了一定的平移不變性。
    也就是說,CNN 可以識別圖像中的相同特征,無論該特征出現(xiàn)在圖像的哪個位置。

缺點

  • 需要大量標注數(shù)據(jù)
    雖然 CNN 能夠自動學習特征,但是它需要大量的標注數(shù)據(jù)進行訓練,尤其是在深度網(wǎng)絡的情況下。
    數(shù)據(jù)集的規(guī)模直接影響到模型的訓練效果和泛化能力。
    如果標注數(shù)據(jù)量不足,可能導致模型過擬合或無法學習到有效的特征。
  • 難以解釋性
    CNN 被認為是“黑箱”模型,盡管其在很多任務中取得了令人矚目的成果,但它的內部工作原理和特征學習過程通常難以解釋和理解。

案例分享

下面是一個使用卷積神經(jīng)網(wǎng)絡算法進行手寫數(shù)字識別(MNIST 數(shù)據(jù)集)的示例代碼。

TensorFlow 實現(xiàn)

import tensorflow as tf
from tensorflow.keras import layers, models
from tensorflow.keras.datasets import mnist
from tensorflow.keras.utils import to_categorical
import matplotlib.pyplot as plt
import numpy as np

# 加載 MNIST 數(shù)據(jù)集
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
x_train = x_train.reshape((x_train.shape[0], 28, 28, 1))
x_test = x_test.reshape((x_test.shape[0], 28, 28, 1))
y_train = to_categorical(y_train, 10)  # 10 是類別數(shù)(0-9的數(shù)字)
y_test = to_categorical(y_test, 10)

# 構建卷積神經(jīng)網(wǎng)絡模型
model = models.Sequential()
# 卷積層 1:32 個 3x3 的卷積核,使用 ReLU 激活函數(shù)
model.add(layers.Conv2D(32, (3, 3), activatinotallow='relu', input_shape=(28, 28, 1)))
# 池化層:2x2 最大池化
model.add(layers.MaxPooling2D((2, 2)))
# 卷積層 2:64 個 3x3 的卷積核,使用 ReLU 激活函數(shù)
model.add(layers.Conv2D(64, (3, 3), activatinotallow='relu'))
# 池化層:2x2 最大池化
model.add(layers.MaxPooling2D((2, 2)))
# 卷積層 3:128 個 3x3 的卷積核,使用 ReLU 激活函數(shù)
model.add(layers.Conv2D(128, (3, 3), activatinotallow='relu'))
# 展平層:將二維數(shù)據(jù)展平為一維數(shù)據(jù)
model.add(layers.Flatten())
# 全連接層:128 個神經(jīng)元,ReLU 激活函數(shù)
model.add(layers.Dense(128, activatinotallow='relu'))
# 輸出層:10 個神經(jīng)元,對應 10 個類別(數(shù)字 0-9),softmax 激活函數(shù)
model.add(layers.Dense(10, activatinotallow='softmax'))

model.compile(optimizer='adam',  # 使用 Adam 優(yōu)化器
              loss='categorical_crossentropy',  # 多類交叉熵損失函數(shù)
              metrics=['accuracy'])  # 評估標準:準確率

# 訓練模型
model.fit(x_train, y_train, epochs=5, batch_size=64, validation_data=(x_test, y_test))

# 評估模型性能
test_loss, test_acc = model.evaluate(x_test, y_test, verbose=2)
print(f'測試集準確率: {test_acc:.4f}')
predictions = model.predict(x_test[:5])

# 可視化預測結果和圖像
for i in range(5):
    plt.subplot(1, 5, i+1)  
    plt.imshow(x_test[i].reshape(28, 28), cmap='gray')  
    plt.title(f"預測: {predictions[i].argmax()}")  
plt.show()

圖片圖片

PyTorch 實現(xiàn)

import torch
import torch.nn as nn
import torch.optim as optim
import torchvision
import torchvision.transforms as transforms
import matplotlib.pyplot as plt
import numpy as np

# 數(shù)據(jù)加載與預處理
transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,))])

# 加載 MNIST 數(shù)據(jù)集
trainset = torchvision.datasets.MNIST(root='./data', train=True, download=True, transform=transform)
testset = torchvision.datasets.MNIST(root='./data', train=False, download=True, transform=transform)

trainloader = torch.utils.data.DataLoader(trainset, batch_size=64, shuffle=True)
testloader = torch.utils.data.DataLoader(testset, batch_size=64, shuffle=False)

# 定義卷積神經(jīng)網(wǎng)絡模型
class CNN(nn.Module):
    def __init__(self):
        super(CNN, self).__init__()
        self.conv1 = nn.Conv2d(1, 32, kernel_size=3, padding=1)  # 1通道輸入,32通道輸出,3x3卷積核
        self.conv2 = nn.Conv2d(32, 64, kernel_size=3, padding=1)  # 32通道輸入,64通道輸出,3x3卷積核
        self.conv3 = nn.Conv2d(64, 128, kernel_size=3, padding=1)  # 64通道輸入,128通道輸出,3x3卷積核
        self.fc1 = nn.Linear(128 * 3 * 3, 128)  # 全連接層,輸入維度為卷積輸出的展開維度
        self.fc2 = nn.Linear(128, 10)  # 輸出層,10個數(shù)字類別

    def forward(self, x):
        x = torch.relu(self.conv1(x))
        x = torch.max_pool2d(x, 2)  # 2x2最大池化
        x = torch.relu(self.conv2(x))
        x = torch.max_pool2d(x, 2)  # 2x2最大池化
        x = torch.relu(self.conv3(x))
        x = torch.max_pool2d(x, 2)  # 2x2最大池化
        x = x.view(-1, 128 * 3 * 3)  # 展平
        x = torch.relu(self.fc1(x))
        x = self.fc2(x)
        return x

# 初始化模型、損失函數(shù)和優(yōu)化器
model = CNN()
criterion = nn.CrossEntropyLoss()  # 使用交叉熵損失
optimizer = optim.Adam(model.parameters(), lr=0.001)  # 使用Adam優(yōu)化器

# 訓練模型
num_epochs = 5
for epoch in range(num_epochs):
    model.train()  # 設置模型為訓練模式
    running_loss = 0.0
    for i, (inputs, labels) in enumerate(trainloader, 0):
        optimizer.zero_grad()  # 清零梯度
        outputs = model(inputs)  # 計算模型輸出
        loss = criterion(outputs, labels)  # 計算損失
        loss.backward()  # 反向傳播
        optimizer.step()  # 更新參數(shù)
        running_loss += loss.item()

    print(f"Epoch {epoch+1}, Loss: {running_loss/len(trainloader)}")

print("Finished Training")

# 測試模型
model.eval()  # 設置模型為評估模式
correct = 0
total = 0
with torch.no_grad():  # 在測試時不計算梯度,減少內存消耗
    for inputs, labels in testloader:
        outputs = model(inputs)
        _, predicted = torch.max(outputs, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()

print(f"Test Accuracy: {100 * correct / total:.2f}%")

# 獲取前 5 張圖片及其預測結果
dataiter = iter(testloader)
images, labels = dataiter.next()

# 獲取模型預測結果
model.eval()  # 設置模型為評估模式
outputs = model(images)
_, predicted = torch.max(outputs, 1)

# 顯示圖像和預測結果
fig, axes = plt.subplots(1, 5, figsize=(12, 3))
for i in range(5):
    ax = axes[i]
    ax.imshow(images[i].numpy().squeeze(), cmap='gray')  # 顯示圖像
    ax.set_title(f"Pred: {predicted[i].item()}\nTrue: {labels[i].item()}")
    ax.axis('off')

plt.show()

圖片圖片

責任編輯:武曉燕 來源: 程序員小寒
相關推薦

2024-09-20 07:36:12

2024-10-28 00:38:10

2024-11-15 13:20:02

2024-10-05 23:00:35

2024-09-12 08:28:32

2024-10-17 13:05:35

神經(jīng)網(wǎng)絡算法機器學習深度學習

2024-12-12 00:29:03

2024-11-07 08:26:31

神經(jīng)網(wǎng)絡激活函數(shù)信號

2024-07-24 08:04:24

神經(jīng)網(wǎng)絡激活函數(shù)

2024-12-02 01:10:04

神經(jīng)網(wǎng)絡自然語言DNN

2024-09-26 07:39:46

2024-12-03 08:16:57

2024-10-16 07:58:48

2024-09-23 09:12:20

2024-11-14 00:16:46

Seq2Seq算法RNN

2024-07-17 09:32:19

2021-06-22 09:46:52

神經(jīng)網(wǎng)絡人工智能深度學習

2024-08-01 08:41:08

2025-02-17 13:09:59

深度學習模型壓縮量化

2024-11-05 12:56:06

機器學習函數(shù)MSE
點贊
收藏

51CTO技術棧公眾號