成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

終于把卷積神經網絡算法搞懂了!!!

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

大家好,我是小寒

今天給大家分享一個強大的算法模型,卷積神經網絡算法

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

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

圖片

卷積神經網絡的基本組成

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

卷積層

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

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

圖片圖片

核心概念

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

圖片圖片

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

圖片圖片

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

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

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

激活函數

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

常見的激活函數包括

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

圖片圖片

池化層

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

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

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

圖片圖片

全連接層

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

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

圖片圖片

卷積神經網絡算法的優缺點

優點

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

缺點

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

案例分享

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

TensorFlow 實現

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 數據集
(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 是類別數(0-9的數字)
y_test = to_categorical(y_test, 10)

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

model.compile(optimizer='adam',  # 使用 Adam 優化器
              loss='categorical_crossentropy',  # 多類交叉熵損失函數
              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 實現

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

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

# 加載 MNIST 數據集
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)

# 定義卷積神經網絡模型
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個數字類別

    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

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

# 訓練模型
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()  # 更新參數
        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-10-28 00:38:10

2024-11-15 13:20:02

2024-09-20 07:36:12

2024-10-05 23:00:35

2024-09-12 08:28:32

2024-10-17 13:05:35

神經網絡算法機器學習深度學習

2024-12-12 00:29:03

2024-07-24 08:04:24

神經網絡激活函數

2024-11-07 08:26:31

神經網絡激活函數信號

2024-12-02 01:10:04

神經網絡自然語言DNN

2024-09-26 07:39:46

2024-09-23 09:12:20

2024-10-16 07:58:48

2024-12-03 08:16:57

2024-07-17 09:32:19

2024-11-14 00:16:46

Seq2Seq算法RNN

2021-06-22 09:46:52

神經網絡人工智能深度學習

2024-08-01 08:41:08

2024-10-08 15:09:17

2024-10-08 10:16:22

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品99久久久久久动医院 | 欧美成人精品二区三区99精品 | 精品国产乱码久久久久久丨区2区 | 一区二区三区欧美 | 一区二区视频在线 | 日韩字幕| 99热在线播放| 欧美一区二区三区在线播放 | www国产成人免费观看视频 | 日韩av电影院 | 99小视频| 欧美日韩久久精品 | 日韩在线电影 | 国产精品久久国产愉拍 | 国产福利在线播放 | 91国语清晰打电话对白 | 日本精品久久久久 | 人人射人人| 亚洲五码在线 | 欧美精品一二三 | 久久久在线视频 | 欧美激情在线精品一区二区三区 | 99精品免费视频 | 欧美一区二区 | 国产免费一区二区 | www.亚洲精品 | 国产精品免费在线 | 碰碰视频 | 中文成人在线 | 国产精品欧美一区二区三区 | 亚洲欧美国产精品久久 | 91精品国模一区二区三区 | 欧美久久一级 | 色狠狠一区 | 国产精品观看 | 亚洲成人免费 | 成人av在线大片 | 成人午夜高清 | 久久69精品久久久久久久电影好 | 男人天堂999 | 国产黄色网址在线观看 |