IBM Qiskit量子機器學習速成(六)

量子卷積神經網絡

卷積和池化:卷積神經網絡的必備成分

卷積神經網絡被廣泛應用于圖像和音頻的識別當中,關鍵在于“卷積”操作賦予神經網絡統籌學習數據的能力。

執行卷積操作需要輸入數據與卷積核,卷積核首先與輸入數據左上角對齊,隨后逐個計算對應位置處兩個數字之積。當對卷積核中所有的元素均執行該乘積操作后,將結果全部加起來作為新的輸出。在下圖中,我們可以看到卷積核最多只能輸出9個數據(就像游戲2048一樣)。

在這里插入圖片描述

下面的動態圖能更直觀的展現這一過程

在這里插入圖片描述

每一次池化操作都需要輸入數據和池化核,池化核會根據某一要求挑選出符合條件的元素作為代表。

在這里插入圖片描述

如果我們執行最大池化,那么池化核會首先與輸入數據左上角對齊,挑選出范圍內最大的元素作為輸出。如果我們執行平均池化,那么池化核會首先與輸入數據左上角對齊,挑選出范圍內所有元素的平均值作為輸出。

一般而言,一個卷積神經網絡會間隔包含卷積層和池化層,多次重復后,再加上一個全連接層(Fully Connected),就能得到最終數據了。我們一般使用經過卷積神經網絡處理后的圖片或音頻進行機器學習,這樣學習的參數更少,速度更快,同時保留了原先數據的特點。

在這里插入圖片描述

量子卷積與量子池化

在量子電路中,我們不能隨心所欲的創建和使用數據。在經典卷積神經網絡中,輸出和輸入或許是分離存儲的,但是在量子電路中,我們只能一直使用若干條量子電路,不能在執行過程中將其切開。

在這里插入圖片描述

根據相關論文結果,量子中的卷積操作如下

在這里插入圖片描述

最一般的量子卷積包含了15個參數,但是過多的參數會嚴重延長訓練時間,出于教學目的,我們使用這一簡化的卷積操作。

根據相關論文結果,量子中的池化操作如下

在這里插入圖片描述

我們像經典池化操作一樣拋棄一些數據,這里我們拋棄位于上方的量子比特,保留下方的量子比特。

使用Qiskit將卷積和池化寫成代碼形式

def conv_circuit(params):target = QuantumCircuit(2)target.rz(-np.pi / 2, 1)target.cx(1, 0)target.rz(params[0], 0)target.ry(params[1], 1)target.cx(0, 1)target.ry(params[2], 1)target.cx(1, 0)target.rz(np.pi / 2, 0)return target
def pool_circuit(params):target = QuantumCircuit(2)target.rz(-np.pi / 2, 1)target.cx(1, 0)target.rz(params[0], 0)target.ry(params[1], 1)target.cx(0, 1)target.ry(params[2], 1)return target

而在一個大型量子電路中,我們不能只在某兩個量子比特上使用卷積和池化,所以我們需要編寫一套適用于大型量子電路的卷積和池化函數

def conv_layer(num_qubits, param_prefix):qc = QuantumCircuit(num_qubits, name="Convolutional Layer")qubits = list(range(num_qubits))param_index = 0params = ParameterVector(param_prefix, length=num_qubits * 3)for q1, q2 in zip(qubits[0::2], qubits[1::2]):qc = qc.compose(conv_circuit(params[param_index : (param_index + 3)]), [q1, q2])qc.barrier()param_index += 3for q1, q2 in zip(qubits[1::2], qubits[2::2] + [0]):qc = qc.compose(conv_circuit(params[param_index : (param_index + 3)]), [q1, q2])qc.barrier()param_index += 3qc_inst = qc.to_instruction()qc = QuantumCircuit(num_qubits)qc.append(qc_inst, qubits)return qc

對于四個量子比特的電路,結果 如下

在這里插入圖片描述

容易看出該函數的意義即對電路中任意兩個不同量子比特施加卷積操作。

同樣地,我們也可以定義適用于大型量子電路的池化函數

def pool_layer(sources, sinks, param_prefix):num_qubits = len(sources) + len(sinks)qc = QuantumCircuit(num_qubits, name="Pooling Layer")param_index = 0params = ParameterVector(param_prefix, length=num_qubits // 2 * 3)for source, sink in zip(sources, sinks):qc = qc.compose(pool_circuit(params[param_index : (param_index + 3)]), [source, sink])qc.barrier()param_index += 3qc_inst = qc.to_instruction()qc = QuantumCircuit(num_qubits)qc.append(qc_inst, range(num_qubits))return qc

在這里插入圖片描述

可以看出,池化操作先把整個電路分成若干個量子比特對,對與對之間相互不干擾,每個對內再執行池化操作。

實戰演練:水平線與豎直線的分類

首先我們導入本次用到的所有庫

import json
import matplotlib.pyplot as plt
import numpy as np
from IPython.display import clear_output
from qiskit import QuantumCircuit
from qiskit.circuit import ParameterVector
from qiskit.circuit.library import ZFeatureMap
from qiskit.quantum_info import SparsePauliOp
from qiskit_algorithms.optimizers import COBYLA
from qiskit_algorithms.utils import algorithm_globals
from qiskit_machine_learning.algorithms.classifiers import NeuralNetworkClassifier
from qiskit_machine_learning.neural_networks import EstimatorQNN
from sklearn.model_selection import train_test_splitalgorithm_globals.random_seed = 12345

進一步,手動生成數據。我們會編寫函數生成大量包含水平線或豎直線的圖片。

def generate_dataset(num_images):images = []labels = []hor_array = np.zeros((6, 8))ver_array = np.zeros((4, 8))j = 0for i in range(0, 7):if i != 3:hor_array[j][i] = np.pi / 2hor_array[j][i + 1] = np.pi / 2j += 1j = 0for i in range(0, 4):ver_array[j][i] = np.pi / 2ver_array[j][i + 4] = np.pi / 2j += 1for n in range(num_images):rng = algorithm_globals.random.integers(0, 2)if rng == 0:labels.append(-1)random_image = algorithm_globals.random.integers(0, 6)images.append(np.array(hor_array[random_image]))elif rng == 1:labels.append(1)random_image = algorithm_globals.random.integers(0, 4)images.append(np.array(ver_array[random_image]))# Create noisefor i in range(8):if images[-1][i] == 0:images[-1][i] = algorithm_globals.random.uniform(0, np.pi / 4)return images, labels

進行訓練集和測試集分割

images, labels = generate_dataset(50)train_images, test_images, train_labels, test_labels = train_test_split(images, labels, test_size=0.3
)

為了將經典數據編碼到量子電路中,我們還是需要一個特征映射。這里我們使用ZFeatureMao而不是ZZFeatureMap。

feature_map = ZFeatureMap(8)
feature_map.decompose().draw("mpl")

組合卷積層和池化層,創建量子卷積神經網絡

feature_map = ZFeatureMap(8)ansatz = QuantumCircuit(8, name="Ansatz")# First Convolutional Layer
ansatz.compose(conv_layer(8, "с1"), list(range(8)), inplace=True)# First Pooling Layer
ansatz.compose(pool_layer([0, 1, 2, 3], [4, 5, 6, 7], "p1"), list(range(8)), inplace=True)# Second Convolutional Layer
ansatz.compose(conv_layer(4, "c2"), list(range(4, 8)), inplace=True)# Second Pooling Layer
ansatz.compose(pool_layer([0, 1], [2, 3], "p2"), list(range(4, 8)), inplace=True)# Third Convolutional Layer
ansatz.compose(conv_layer(2, "c3"), list(range(6, 8)), inplace=True)# Third Pooling Layer
ansatz.compose(pool_layer([0], [1], "p3"), list(range(6, 8)), inplace=True)# Combining the feature map and ansatz
circuit = QuantumCircuit(8)
circuit.compose(feature_map, range(8), inplace=True)
circuit.compose(ansatz, range(8), inplace=True)observable = SparsePauliOp.from_list([("Z" + "I" * 7, 1)])# we decompose the circuit for the QNN to avoid additional data copying
qnn = EstimatorQNN(circuit=circuit.decompose(),observables=observable,input_params=feature_map.parameters,weight_params=ansatz.parameters,
)

根據量子卷積神經網絡創建分類器

classifier = NeuralNetworkClassifier(qnn,optimizer=COBYLA(maxiter=200),  # Set max iterations here
)

擬合數據,測試結果

x = np.asarray(train_images)
y = np.asarray(train_labels)
classifier.fit(x, y)y_predict = classifier.predict(test_images)
x = np.asarray(test_images)
y = np.asarray(test_labels)
print(f"Accuracy from the test data : {np.round(100 * classifier.score(x, y), 2)}%")

如果將結果可視化的話(詳見Qiskit量子卷積神經網絡),應如下圖

在這里插入圖片描述

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

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

相關文章

【數據庫】簡單連接嵌套查詢

目錄 🎇簡單查詢 🎇連接查詢 🎇嵌套查詢 分析&思考 🎇簡單查詢 --練習簡單查詢 --select * from classes --select * from student --select * from scores --1.按Schedule表的結構要求用SQL語言創建Schedule表 --字段名…

深度學習之全面了解預訓練模型

在本專欄中,我們將討論預訓練模型。有很多模型可供選擇,因此也有很多考慮事項。 這次的專欄與以往稍有不同。我要回答的問題全部源于 MathWorks 社區論壇(ww2.mathworks.cn/matlabcentral/)的問題。我會首先總結 MATLAB Answers …

關于Linux Kernel Panic導致重啟的簡單分析步驟

Linux系統Kernel Panic的檢索 如何判斷是否發生Kernel Panic,以下以 CentOS 7.9系統為例 #查看 /var/crash 路徑下是否有生成文件夾,Kernel Panic后會生成文件夾在此路徑表示產生了Kernel Panic ls /var/crash #/var/crash/127.0.0.1-2023-12-04-08\:5…

HarmonyOS應用開發者基礎認證考試(穩過)

判斷題 ??????? 1. Web組件對于所有的網頁都可以使用zoom(factor: number)方法進行縮放。錯誤(False) 2. 每一個自定義組件都有自己的生命周期正確(True) 3. 每調用一次router.pushUrl()方法,默認情況下,頁面棧數量會加1,頁面棧支持的…

linux redis-cluster ipv6方式

配置文件,具體字段的含義,可以參考其他文檔。 1.單個文件的配置信息 redis_36380.conf requirepass Paas_2024port 36380tcp-backlog 511timeout 0tcp-keepalive 300daemonize yessupervised nopidfile /data/paas/apps/aicache-redis/redis_36380.p…

【STM32】TIM定時器編碼器

1 編碼器接口簡介 Encoder Interface 編碼器接口 編碼器接口可接收增量(正交)編碼器的信號,根據編碼器旋轉產生的正交信號脈沖,自動控制CNT自增或自減,從而指示編碼器的位置、旋轉方向和旋轉速度 接收正交信號&#…

黑豹程序員-EasyExcel實現導出

需求 將業務數據導出到excel中,老牌的可以選擇POI,也有個新的選擇EasyExcel。 有個小坑,客戶要求樣式比較美觀,數字列要求千位符,保留2位小數。 可以用代碼實現但非常繁瑣,用模板就特別方便,模…

C++優秀串口庫

serial::Serial Class Reference #include <serial.h> Data Structures class ScopedReadLockclass ScopedWriteLock Public Member Functions公有成員方法&#xff08;編程用的都在這里了&#xff0c;那些私有的如果不開源一般跟我們沒有關系了&#xff09; Serial …

用chatGPT開發項目:我想的無人的智慧樹網站 流量之神 利用人工智能的算法將人吸引住 GPT4是不是越來越難用了,問一下就要證明一下自己是不是人類

廣度發散&#xff1a;讓AI給出時代或今日或你關注的熱點事件 比如采集新聞頭條&#xff0c;根據內容或標題&#xff0c;以不同的角度&#xff0c;或各種人群的角色&#xff0c;生成50篇簡短的文章。一下就能占傳統的搜索引擎。這是AI最擅長的【千人千面&#xff0c;海量生成】…

【中國海洋大學】操作系統隨堂測試6整理

1. IO系統的層次機構包括&#xff1a;IO硬件、中斷處理程序、&#xff08;&#xff09;程序、設備獨立性軟件、用戶層軟件。 答&#xff1a;設備驅動 2. IO設備和控制器之間的接口包括三種類型的信號&#xff1a;數據信號線、控制信號線和&#xff08;&#xff09;&#xff1…

qt反射基礎

最近研究了一下QT的反射機制&#xff0c; Qt的元對象系統除了提供信號/槽機制的特性之外&#xff0c;它還提供了以下特性: QObject::metaObject() 返回關聯的元對象 QMetaObject::className() 在運行時狀態下返回類名 QObject::inherits() 判斷類的繼承關系 QObject::tr()&…

鴻蒙開發之封裝優化

面向對象開發離不開封裝&#xff0c;將重復的可以復用的代碼封裝起來&#xff0c;提高開發效率。 基于之前的List&#xff0c;對代碼進行封裝。 1、抽取component 將List的頭部抽離出來作為一個新的component。可以創建一個新的ArkTS文件&#xff0c;寫我們的頭部代碼 為了…

代理模式:解析對象間的間接訪問與控制

目錄 引言 理解代理模式 不同類型的代理模式 代理模式的應用場景 代理模式的優缺點 優點 缺點 實際案例&#xff1a;Java中的代理模式應用 結語 引言 代理模式是軟件設計模式中的一種結構型模式&#xff0c;旨在為其他對象提供一種代理以控制對這個對象的訪問。它允許你…

消息隊列使用指南

介紹 消息隊列是一種常用的應用程序間通信方法&#xff0c;可以用來在不同應用程序或組件之間傳遞數據或消息。消息隊列就像一個緩沖區&#xff0c;接收來自發送方的消息&#xff0c;并存儲在隊列中&#xff0c;等待接收方從隊列中取出并處理。 在分布式系統中&#xff0c;消…

死鎖問題,4個必要條件+避免死鎖

目錄 引入 死鎖 概念 示例 多把鎖 單鎖 4個必要條件 用途 引入 我們用加鎖的方式保證了多個線程訪問臨界資源時,不會出現數據紊亂的問題 但是,鎖的引入,會導致出現其他的問題 死鎖 概念 在多線程或多進程的并發環境中&#xff0c;兩個或多個進程或線程被永久阻塞&…

esxi全稱“VMware ESXi

esxi全稱“VMware ESXi”&#xff0c;是可直接安裝在物理服務器上的強大的裸機管理系統&#xff0c;是一款虛擬軟件&#xff1b;ESXi本身可以看做一個操作系統&#xff0c;采用Linux內核&#xff0c;安裝方式為裸金屬方式&#xff0c;可直接安裝在物理服務器上&#xff0c;不需…

數據結構算法-希爾排序算法

引言 在一個普通的下午&#xff0c;小明和小森決定一起玩“誰是老板”的撲克牌游戲。這次他們玩的可不僅僅是娛樂&#xff0c;更是要用撲克牌來決定誰是真正的“大老板”。 然而&#xff0c;小明的牌就像剛從亂麻中取出來的那樣&#xff0c;毫無頭緒。小森的牌也像是被小丑擲…

Agent學習筆記

背景&#xff1a;LLM → \to → Agent ChatGPT為代表的大語言模型就不用過多的介紹了&#xff0c;ChatGPT很強大&#xff0c;但是也有做不到的東西。例如&#xff1a; 實時查詢問題&#xff1a;實時的天氣&#xff0c;地理位置&#xff0c;最新新聞報道&#xff0c;現實世界…

十年婚姻·總結八

十年婚姻總結八 女人一生的合伙人不能只是帥哥哥 女人一生的合伙人不能只是帥哥哥 浪漫的本質還是你的籌碼。 比如你送男人5萬的手表&#xff0c;但你沒什么其他籌碼&#xff08;皮膚粗糙蠟黃、沒人脈金錢資源、長的胖&#xff09;。 那個男人會覺得你胡鬧&#xff0c;你送的…

分類預測 | SSA-HKELM-Adaboost麻雀算法優化混合核極限學習機的數據分類預測

分類預測 | SSA-HKELM-Adaboost麻雀算法優化混合核極限學習機的數據分類預測 目錄 分類預測 | SSA-HKELM-Adaboost麻雀算法優化混合核極限學習機的數據分類預測分類效果基本描述程序設計參考資料 分類效果 基本描述 1.SSA-HKELM-Adaboost麻雀算法優化混合核極限學習機的數據分類…