【LeNet網絡架構】——深度學習.卷積神經網絡

目錄

1 MLP

2 LeNet簡介

3 Minst數據集

3.1 MINST數據集簡介

3.2 MNIST數據集的預處理

4 LeNet手寫數字識別


LeNet由Yann Lecun 提出,是一種經典的卷積神經網絡,是現代卷積神經網絡的起源之一。Yann將該網絡用于郵局的郵政的郵政編碼識別,有著良好的學習和識別能力。LeNet又稱LeNet-5,具有一個輸入層,兩個卷積層,兩個池化層,3個全連接層(其中最后一個全連接層為輸出層)。

1 MLP

多層感知機MLP(Multilayer Perceptron),也是人工神經網絡(ANN,Artificial Neural Network),是一種全連接(全連接:MLP由多個神經元按照層次結構組成,每個神經元都與上一層的所有神經元相連)的前饋神經網絡模型。

多層感知機(Multilayer Perceptron, MLP)是一種前饋神經網絡,它由輸入層、若干隱藏層和輸出層組成。每一層都由多個神經元(或稱為節點)組成。

  1. 輸入層(Input Layer):輸入層接收外部輸入的數據,將其傳遞到下一層。每個輸入特征都對應一個神經元。

  2. 隱藏層(Hidden Layer):隱藏層是位于輸入層和輸出層之間的一層或多層神經元。每個隱藏層的神經元接收上一層傳來的輸入,并通過權重和激活函數進行計算,然后將結果傳遞到下一層。隱藏層的存在可以使多層感知機具備更強的非線性擬合能力。

  3. 輸出層(Output Layer):輸出層接收隱藏層的輸出,并產生最終的輸出結果。輸出層的神經元數目通常與任務的輸出類別數目一致。對于分類任務,輸出層通常使用softmax激活函數來計算每個類別的概率分布;對于回歸任務,輸出層可以使用線性激活函數。

多層感知機的各層之間是全連接的,也就是說,每個神經元都與上一層的每個神經元相連。每個連接都有一個與之相關的權重和一個偏置。

2 LeNet簡介

LeNet-5模型是由楊立昆(Yann LeCun)教授于1998年在論文Gradient-Based Learning Applied to Document Recognition中提出的,是一種用于手寫體字符識別的非常高效的卷積神經網絡,其實現過程如下圖所示。

原論文的經典的LeNet-5網絡結構如下:

各個結構作用:

卷積層:提取特征圖的特征,淺層的卷積提取的是一些紋路、輪廓等淺層的空間特征,對于深層的卷積,可以提取出深層次的空間特征。

池化層: 1、降低維度 2、最大池化或者平均池化,在本網絡結構中使用的是最大池化。

全連接層: 1、輸出結果 2、位置:一般位于CNN網絡的末端。 3、操作:需要將特征圖reshape成一維向量,再送入全連接層中進行分類或者回歸。

下來我們使用代碼詳解推理一下各卷積層參數的變化:

import torch
import torch.nn as nn# 定義張量x,它的尺寸是1×1×28×28
# 表示了1個,單通道,32×32大小的數據
x = torch.zeros([1, 1, 32, 32])
# 定義一個輸入通道是1,輸出通道是6,卷積核大小是5x5的卷積層
conv1 = nn.Conv2d(in_channels=1, out_channels=6, kernel_size=5)
# 將x,輸入至conv,計算出結果c
c1 = conv1(x)
# 打印結果尺寸程序輸出:
print(c1.shape)# 定義最大池化層
pool = nn.MaxPool2d(2)
# 將卷積層計算得到的特征圖c,輸入至pool
s1 = pool(c1)
# 輸出s的尺寸
print(s1.shape)# 定義第二個輸入通道是6,輸出通道是16,卷積核大小是5x5的卷積層
conv2 = nn.Conv2d(in_channels=6, out_channels=16, kernel_size=5)
# 將x,輸入至conv,計算出結果c
c2 = conv2(s1)
# 打印結果尺寸程序輸出:
print(c2.shape)s2 = pool(c2)
# 輸出s的尺寸
print(s2.shape)

輸出結果:

torch.Size([1, 6, 28, 28])
torch.Size([1, 6, 14, 14])
torch.Size([1, 16, 10, 10])
torch.Size([1, 16, 5, 5])

下面是使用pytorch實現一個最簡單的LeNet模型。、

import torch
import torch.nn as nn
import torch.nn.functional as Fclass LeNet(nn.Module):def __init__(self):super(LeNet, self).__init__()# 定義卷積層self.conv1 = nn.Conv2d(in_channels=1, out_channels=6, kernel_size=5, stride=1)self.conv2 = nn.Conv2d(in_channels=6, out_channels=16, kernel_size=5, stride=1)# 定義全連接層self.fc1 = nn.Linear(16 * 5 * 5, 120)self.fc2 = nn.Linear(120, 84)self.fc3 = nn.Linear(84, 10)# 定義激活函數self.relu = nn.ReLU()def forward(self, x):# 卷積層 + 池化層 + 激活函數x = self.relu(self.conv1(x))x = F.avg_pool2d(x, kernel_size=2, stride=2)x = self.relu(self.conv2(x))x = F.avg_pool2d(x, kernel_size=2, stride=2)# 展平特征圖x = torch.flatten(x, 1)# 全連接層x = self.relu(self.fc1(x))x = self.relu(self.fc2(x))x = self.fc3(x)return x# 創建模型實例
model = LeNet()# 打印模型結構
print(model)

輸出結果:

LeNet((conv1): Conv2d(1, 6, kernel_size=(5, 5), stride=(1, 1))(conv2): Conv2d(6, 16, kernel_size=(5, 5), stride=(1, 1))(fc1): Linear(in_features=400, out_features=120, bias=True)(fc2): Linear(in_features=120, out_features=84, bias=True)(fc3): Linear(in_features=84, out_features=10, bias=True)(relu): ReLU()
)

3 Minst數據集

MNIST是一個手寫數字集合,該數據集來自美國國家標準與技術研究所, National Institute of Standards and Technology (NIST). 訓練集 (training set) 由來自 250 個不同人手寫的數字構成, 其中 50% 是高中學生, 50% 來自人口普查局 (the Census Bureau) 的工作人員. 測試集(test set) 也是同樣比例的手寫數字數據。

3.1 MINST數據集簡介

  1. 該數據集包含60,000個用于訓練的示例和10,000個用于測試的示例。

  2. 數據集包含了0-9共10類手寫數字圖片,每張圖片都做了尺寸歸一化,都是28x28大小的灰度圖。

  3. MNIST數據集包含四個部分: 訓練集圖像:train-images-idx3-ubyte.gz(9.9MB,包含60000個樣本) 訓練集標簽:train-labels-idx1-ubyte.gz(29KB,包含60000個標簽) 測試集圖像:t10k-images-idx3-ubyte.gz(1.6MB,包含10000個樣本) 測試集標簽:t10k-labels-idx1-ubyte.gz(5KB,包含10000個標簽)

3.2 MNIST數據集的預處理

這里我們可以觀察訓練集、驗證集、測試集分別有50000,10000,10000張圖片,并且讀取訓練集的第一張圖片看看。

import torch
from torchvision import datasets, transforms
from torch.utils.data import DataLoader
import matplotlib.pyplot as plt
import numpy as np
import struct# 圖像預處理:將圖像轉換為 (784, 1) 的張量
transform = transforms.Compose([transforms.ToTensor(),               # 轉為 [0,1] 范圍的 Tensortransforms.Lambda(lambda x: x.view(-1, 1))  # 展平為 (784, 1)
])# 加載 MNIST 訓練集和測試集
train_dataset = datasets.MNIST(root='./dataset',train=True,transform=transform,download=True
)test_dataset = datasets.MNIST(root='./dataset',train=False,transform=transform,download=True
)# 使用 DataLoader 批量加載
train_loader = DataLoader(dataset=train_dataset,batch_size=64,shuffle=True
)test_loader = DataLoader(dataset=test_dataset,batch_size=64,shuffle=False
)# ? 打印訓練集和測試集的樣本數量
print(f"訓練集樣本數量: {len(train_dataset)}")
print(f"測試集樣本數量: {len(test_dataset)}")# ? 控制臺輸出矩陣的代碼
print("=" * 140)
print("圖像矩陣的十六進制表示(非零值用紅色標出):")
data = train_dataset[0][0].squeeze().numpy()  # 獲取第一張圖像并轉換為 numpy 數組
rows = 28
columns = 28counter = 0
for i in range(rows):row = data[i * columns: (i + 1) * columns]for value in row:integer_part = int(value * 100)# 防止溢出 unsigned short (0~65535)integer_part = max(0, min(65535, integer_part))hex_bytes = struct.pack('H', integer_part)hex_string = hex_bytes.hex()if hex_string == '0000':print(hex_string + ' ', end="")else:print(f'\033[31m{hex_string}\033[0m' + " ", end="")counter += 1if counter % 28 == 0:print()  # 換行
print("=" * 140)# 示例:取出第一個 batch 的數據
for images, labels in train_loader:print("Batch Images Shape:", images.shape)    # [batch_size, 784, 1]print("Batch Labels Shape:", labels.shape)    # [batch_size]# 顯示第一張圖像img = images[0].reshape(28, 28).numpy()plt.imshow(img, cmap='gray')plt.title(f"Label: {labels[0].item()}")plt.axis('off')plt.show()break  # 只顯示一個 batch

輸出結果:

訓練集樣本數量: 60000
測試集樣本數量: 10000

4 LeNet手寫數字識別

代碼實現如下:

import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
from torchvision import datasets, transforms
import time
from matplotlib import pyplot as pltpipline_train = transforms.Compose([# 隨機旋轉圖片# MNIST 是手寫數字數據集,左右翻轉可能造成語義錯誤(例如,6 和 9 會被混淆)。所以不建議使用# transforms.RandomHorizontalFlip(),# 將圖片尺寸resize到32x32transforms.Resize((32, 32)),# 將圖片轉化為Tensor格式transforms.ToTensor(),# 正則化(當模型出現過擬合的情況時,用來降低模型的復雜度)transforms.Normalize((0.1307,), (0.3081,))
])
pipline_test = transforms.Compose([# 將圖片尺寸resize到32x32transforms.Resize((32, 32)),transforms.ToTensor(),transforms.Normalize((0.1307,), (0.3081,))
])
# 下載數據集
train_set = datasets.MNIST(root="./dataset", train=True, download=True, transform=pipline_train)
test_set = datasets.MNIST(root="./dataset", train=False, download=True, transform=pipline_test)
# 加載數據集
trainloader = torch.utils.data.DataLoader(train_set, batch_size=64, shuffle=True)
testloader = torch.utils.data.DataLoader(test_set, batch_size=32, shuffle=False)# 構建LeNet模型
class LeNet(nn.Module):def __init__(self):super(LeNet, self).__init__()self.conv1 = nn.Conv2d(1, 6, 5)self.relu = nn.ReLU()self.maxpool1 = nn.MaxPool2d(2, 2)self.conv2 = nn.Conv2d(6, 16, 5)self.maxpool2 = nn.MaxPool2d(2, 2)self.fc1 = nn.Linear(16 * 5 * 5, 120)self.fc2 = nn.Linear(120, 84)self.fc3 = nn.Linear(84, 10)def forward(self, x):x = self.conv1(x)x = self.relu(x)x = self.maxpool1(x)x = self.conv2(x)x = self.maxpool2(x)x = x.view(-1, 16 * 5 * 5)x = F.relu(self.fc1(x))x = F.relu(self.fc2(x))x = self.fc3(x)return x# 創建模型,部署gpu
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = LeNet().to(device)
# 定義優化器
optimizer = optim.Adam(model.parameters(), lr=0.001)def train_runner(model, device, trainloader, optimizer, epoch):model.train()total_loss = 0total_correct = 0total_samples = 0for i, (inputs, labels) in enumerate(trainloader):inputs, labels = inputs.to(device), labels.to(device)optimizer.zero_grad()outputs = model(inputs)loss = F.cross_entropy(outputs, labels)predict = outputs.argmax(dim=1)correct = (predict == labels).sum().item()loss.backward()optimizer.step()total_loss += loss.item()total_correct += correcttotal_samples += labels.size(0)if i % 100 == 0:print(f"Epoch {epoch}, Batch {i}, Loss: {loss.item():.6f}, Accuracy: {correct / labels.size(0) * 100:.2f}%")avg_loss = total_loss / len(trainloader)avg_acc = total_correct / total_samplesprint(f"Epoch {epoch} - Average Loss: {avg_loss:.6f}, Accuracy: {avg_acc * 100:.2f}%")return avg_loss, avg_accdef test_runner(model, device, testloader):# 模型驗證, 必須要寫, 否則只要有輸入數據, 即使不訓練, 它也會改變權值# 因為調用eval()將不啟用 BatchNormalization 和 Dropout, BatchNormalization和Dropout置為Falsemodel.eval()# 統計模型正確率, 設置初始值correct = 0.0test_loss = 0.0total = 0# torch.no_grad將不會計算梯度, 也不會進行反向傳播with torch.no_grad():for data, label in testloader:data, label = data.to(device), label.to(device)output = model(data)test_loss += F.cross_entropy(output, label).item()predict = output.argmax(dim=1)# 計算正確數量total += label.size(0)correct += (predict == label).sum().item()# 計算損失值print("test_avarage_loss: {:.6f}, accuracy: {:.6f}%".format(test_loss / total, 100 * (correct / total)))# 調用
epoch = 5
Loss = []
Accuracy = []
for epoch in range(1, epoch + 1):print("start_time", time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())))loss, acc = train_runner(model, device, trainloader, optimizer, epoch)Loss.append(loss)Accuracy.append(acc)test_runner(model, device, testloader)print("end_time: ", time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())), '\n')print('Finished Training')plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
plt.plot(Loss)
plt.title('Training Loss')
plt.xlabel('Epoch')
plt.ylabel('Loss')plt.subplot(1, 2, 2)
plt.plot(Accuracy)
plt.title('Training Accuracy')
plt.xlabel('Epoch')
plt.ylabel('Accuracy')
plt.tight_layout()
plt.show()

輸出效果:
?

start_time 2025-07-21 23:55:06
Epoch 1, Batch 0, Loss: 2.289716, Accuracy: 10.94%
Epoch 1, Batch 100, Loss: 0.193995, Accuracy: 96.88%
Epoch 1, Batch 200, Loss: 0.182066, Accuracy: 93.75%
Epoch 1, Batch 300, Loss: 0.188292, Accuracy: 95.31%
Epoch 1, Batch 400, Loss: 0.124157, Accuracy: 95.31%
Epoch 1, Batch 500, Loss: 0.034723, Accuracy: 100.00%
Epoch 1, Batch 600, Loss: 0.008845, Accuracy: 100.00%
Epoch 1, Batch 700, Loss: 0.085703, Accuracy: 98.44%
Epoch 1, Batch 800, Loss: 0.043274, Accuracy: 100.00%
Epoch 1, Batch 900, Loss: 0.081251, Accuracy: 96.88%
Epoch 1 - Average Loss: 0.204190, Accuracy: 93.77%
test_avarage_loss: 0.001810, accuracy: 98.210000%
end_time:  2025-07-21 23:55:36 start_time 2025-07-21 23:55:36
Epoch 2, Batch 0, Loss: 0.007833, Accuracy: 100.00%
Epoch 2, Batch 100, Loss: 0.026923, Accuracy: 98.44%
Epoch 2, Batch 200, Loss: 0.055813, Accuracy: 98.44%
Epoch 2, Batch 300, Loss: 0.021718, Accuracy: 98.44%
Epoch 2, Batch 400, Loss: 0.044155, Accuracy: 98.44%
Epoch 2, Batch 500, Loss: 0.078634, Accuracy: 98.44%
Epoch 2, Batch 600, Loss: 0.077378, Accuracy: 98.44%
Epoch 2, Batch 700, Loss: 0.024615, Accuracy: 98.44%
Epoch 2, Batch 800, Loss: 0.065229, Accuracy: 95.31%
Epoch 2, Batch 900, Loss: 0.105533, Accuracy: 96.88%
Epoch 2 - Average Loss: 0.058598, Accuracy: 98.17%
test_avarage_loss: 0.001409, accuracy: 98.510000%
end_time:  2025-07-21 23:56:09 start_time 2025-07-21 23:56:09
Epoch 3, Batch 0, Loss: 0.008086, Accuracy: 100.00%
Epoch 3, Batch 100, Loss: 0.007276, Accuracy: 100.00%
Epoch 3, Batch 200, Loss: 0.026653, Accuracy: 98.44%
Epoch 3, Batch 300, Loss: 0.013348, Accuracy: 100.00%
Epoch 3, Batch 400, Loss: 0.051161, Accuracy: 98.44%
Epoch 3, Batch 500, Loss: 0.011193, Accuracy: 100.00%
Epoch 3, Batch 600, Loss: 0.018030, Accuracy: 100.00%
Epoch 3, Batch 700, Loss: 0.031486, Accuracy: 98.44%
Epoch 3, Batch 800, Loss: 0.040127, Accuracy: 96.88%
Epoch 3, Batch 900, Loss: 0.003004, Accuracy: 100.00%
Epoch 3 - Average Loss: 0.041799, Accuracy: 98.73%
test_avarage_loss: 0.001054, accuracy: 98.890000%
end_time:  2025-07-21 23:56:42 start_time 2025-07-21 23:56:42
Epoch 4, Batch 0, Loss: 0.005576, Accuracy: 100.00%
Epoch 4, Batch 100, Loss: 0.004955, Accuracy: 100.00%
Epoch 4, Batch 200, Loss: 0.025697, Accuracy: 98.44%
Epoch 4, Batch 300, Loss: 0.060617, Accuracy: 98.44%
Epoch 4, Batch 400, Loss: 0.011967, Accuracy: 100.00%
Epoch 4, Batch 500, Loss: 0.006767, Accuracy: 100.00%
Epoch 4, Batch 600, Loss: 0.060184, Accuracy: 98.44%
Epoch 4, Batch 700, Loss: 0.018019, Accuracy: 98.44%
Epoch 4, Batch 800, Loss: 0.052307, Accuracy: 98.44%
Epoch 4, Batch 900, Loss: 0.002293, Accuracy: 100.00%
Epoch 4 - Average Loss: 0.033747, Accuracy: 98.92%
test_avarage_loss: 0.001589, accuracy: 98.420000%
end_time:  2025-07-21 23:57:15 start_time 2025-07-21 23:57:15
Epoch 5, Batch 0, Loss: 0.028971, Accuracy: 98.44%
Epoch 5, Batch 100, Loss: 0.002826, Accuracy: 100.00%
Epoch 5, Batch 200, Loss: 0.001654, Accuracy: 100.00%
Epoch 5, Batch 300, Loss: 0.021051, Accuracy: 100.00%
Epoch 5, Batch 400, Loss: 0.122267, Accuracy: 95.31%
Epoch 5, Batch 500, Loss: 0.011313, Accuracy: 100.00%
Epoch 5, Batch 600, Loss: 0.007512, Accuracy: 100.00%
Epoch 5, Batch 700, Loss: 0.029513, Accuracy: 98.44%
Epoch 5, Batch 800, Loss: 0.006132, Accuracy: 100.00%
Epoch 5, Batch 900, Loss: 0.015854, Accuracy: 98.44%
Epoch 5 - Average Loss: 0.027342, Accuracy: 99.14%
test_avarage_loss: 0.001210, accuracy: 98.840000%
end_time:  2025-07-21 23:57:47 

增加模型預測功能:

model.load_state_dict(torch.load('./mymodel.pt'))
print("成功加載模型....")index = random.randint(0,100)
image, label = train_set[index]  # 從 test_set 中直接獲取圖像和標簽
image = image.unsqueeze(0).to(device)# 進行預測
model.eval()
with torch.no_grad():output = model(image)predicted_label = output.argmax(dim=1, keepdim=True)print("Predicted label:", predicted_label[0].item())
print("Actual label:", label)

運行效果:

成功加載模型....Predicted label: 9
Actual label: 9

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/90228.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/90228.shtml
英文地址,請注明出處:http://en.pswp.cn/web/90228.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python筆記完整版

常用pip源 (1)阿里云 http://mirrors.aliyun.com/pypi/simple/(2)豆瓣 http://pypi.douban.com/simple/(3)清華大學 https://pypi.tuna.tsinghua.edu.cn/simple/(4)中國科學技術大學…

2025 鴻蒙創新賽又來了,萬少教你如何強勢切入 HarmonyOS AI特性

2025 鴻蒙創新賽又來了,萬少教你如何強勢切入 前言 ? 2025 華為HarmonyOS 創新賽又來了,創新賽是鴻蒙生態最大規模開發者官方賽事,最高獲百萬激勵。 參賽資格 面向所有開發者開放以隊伍的形式來參加,可以一個人報名一個隊伍&a…

【智能模型系列】Unity通過訪問Ollama調用DeepSeek模型進行本地部署

【智能模型系列】Unity通過訪問Ollama調用DeepSeek模型進行本地部署 目錄 一、前言 二、環境準備 三、核心代碼解析 1、參數配置 2. CallDeepSeek.cs - API交互控制器 3、 MainPanel.cs - 用戶界面控制器 四、源碼 一、前言 在本教程中,我將分享如何在Unity中集成本地…

什么是5G-A三防平板?有什么特點?哪些領域能用到?

在工業自動化與數字化轉型浪潮中,三防平板電腦已成為“危、急、特”場景的核心工具。這類設備不僅具備堅固耐用的物理防護特性,更融合了先進的通信技術與智能處理能力。而隨著5G技術向5G-A階段演進,新一代三防平板正為行業應用注入全新動能。…

Flink實時流量統計:基于窗口函數與Redis Sink的每小時PV監控系統(學習記錄)

題目:利用flink統計網站瀏覽量,并寫入redis。利用窗口函數以及算子實現每小時PV(網站的頁面瀏覽量)統計,對統計后結果數據格式進行設計,存儲至Redis中(利用sink將處理后結果數據輸出到redis數據…

使用Imgui和SDL2做的一個彈球小游戲-Bounze

使用Imgui和SDL2做的一個彈球小游戲-Bounze 油管上面TheCherno博主分享的一個視頻FIRST GAME in C! Did He Do a Good Job? // Code Review (C/SDL2)里面分享了一個Github項目: https://github.com/staticaron/Bounze 使用了Imgui和SDL2,并且可以設置音…

SQL 中 CASE WHEN 及 SELECT CASE WHEN 的用法

SQL 中 CASE WHEN 及 SELECT CASE WHEN 的用法 CASE WHEN 是 SQL 中非常實用的條件表達式,它允許你在查詢中實現條件邏輯。以下是詳細的用法說明: 1. 基本語法結構 CASE WHEN condition1 THEN result1WHEN condition2 THEN result2...ELSE default_resul…

CentOS 7 Linux 基礎知識點匯總

🐧 CentOS 7 Linux 基礎知識點匯總為方便初學者快速掌握 CentOS 7 系統的核心操作,本文檔整理了常用系統命令、快捷鍵、目錄結構及文件后綴名等基礎內容,適合入門參考。 一、常見系統命令 🔍 命令行提示符說明 終端中的提示符包含…

突發限制下的破局之路:國產之光 Lynx 重構 AI 開發安全壁壘

繼 Pro 套餐 “明升暗降” 爭議后,Cursor 本周再掀波瀾 —— 包括 Claude 系列、GPT-4 在內的主流模型一夜之間對中國用戶全面封禁。開發者社群瞬間沸騰,“付費卻用不了”“項目數據導不出” 的焦慮刷屏,境外工具的政策波動再次給行業敲響警鐘…

滲透測試實戰 | docker復雜環境下的內網打點

本文作者:Track-syst1m一.前言本文涉及的相關漏洞均已修復、本文中技術和方法僅用于教育目的;文中討論的所有案例和技術均旨在幫助讀者更好地理解相關安全問題,并采取適當的防護措施來保護自身系統免受攻擊。二.大概流程1. 外網打點漏洞利用?…

阿里云服務器 CentOS 7 安裝 MySQL 8.4 超詳細指南

阿里云服務器 CentOS 7 安裝 MySQL 8.4 超詳細指南 一、準備工作 系統要求: CentOS 7.9 64位2 核(vCPU)2 GiBroot 用戶權限 服務器連接工具: FinalShell 下載安裝包: 訪問 MySQL 官網選擇版本:MySQL 8.4.0…

解決 Electron 中 window.open 打開新窗口的各種“坑”

嘿,各位開發者們!今天我們要聊聊在使用 Electron 時遇到的一個經典問題:如何正確地使用 window.open 來打開新窗口? 這聽起來似乎很簡單,但實際上卻充滿了各種“驚喜”(或者說“驚嚇”)。別擔心…

朝歌智慧盤古信息:以IMS MOM V6重構國產化智能終端新生態

隨著5G、云計算、AI、大數據等技術深度滲透,智能終端行業正迎來場景化創新的爆發期。面對市場需求升級與技術迭代壓力,國產化智能終端領域領軍企業——廣東朝歌智慧互聯科技有限公司(以下簡稱“朝歌智慧”),基于集團“…

docker 離線安裝postgres+postgis實踐

文章目錄前言一、離線安裝docker二、導出導入PG鏡像1.導出2.導入三、啟動容器四、驗證與測試前言 在企業內網環境中部署地理信息系統(GIS)時,常常面臨網絡隔離導致無法在線拉取 Docker 鏡像的問題。 本文將詳細介紹如何通過離線方式完成 Pos…

視頻、音頻錄制

1,項目介紹。 實現全屏錄屏、選擇區域錄屏、攝像頭錄像、麥克風錄音、主板音頻錄音、截屏畫板的自由組合。并通過FFmpeg完成音頻與視頻的合并。 功能界面 畫板畫筆 參考的項目 https://github.com/yangjinming1062/RecordWin 本項目是在此項目的基礎上修復了部…

Linux文件系統理解1

目錄一、初步理解系統層面的文件1. 文件操作的本質2. 進程管理文件核心思想二、系統調用層1. 打開關閉文件函數2. 讀寫文件函數三、操作系統文件管理1. 文件管理機制2. 硬件管理機制四、理解重定向1. 文件描述符分配規則2. 重定向系統調用3. 重定向命令行調用五、理解緩沖區1. …

科技向善,銀發向暖:智慧養老與經濟共筑適老未來

人口老齡化是當今中國社會面臨的重大課題,也是推動社會變革與經濟轉型的重要引擎。隨著數字技術的飛速發展,“智慧養老”正以科技向善的溫度,為老年群體構建更舒適、更安全、更有尊嚴的晚年生活,同時為銀發經濟注入蓬勃活力&#…

numpy庫 降維,矩陣創建與元素的選取,修改

目錄 1.降維函數ravel()和flatten ravel(): flatten(): 2.矩陣存儲與內存結構 3.修改矩陣形狀的方法 4.特殊矩陣創建 全零矩陣: 如np.zeros(5) 創建含5個零的一維數組,輸出中零后的點(如 0.)表示浮點數類型。 全一矩陣:如n…

SpringCloud seata全局事務

項目https://github.com/apache/incubator-seata docker拉取啟動server $ docker run --name seata-server -p 8091:8091 apache/seata-server:2.1.0 seata注冊到nacos <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-…

OpenLayers 快速入門(八)事件系統

看過的知識不等于學會。唯有用心總結、系統記錄&#xff0c;并通過溫故知新反復實踐&#xff0c;才能真正掌握一二 作為一名摸爬滾打三年的前端開發&#xff0c;開源社區給了我飯碗&#xff0c;我也將所學的知識體系回饋給大家&#xff0c;助你少走彎路&#xff01; OpenLayers…