采用的数据集是乳腺癌细胞集https://www.kaggle.com/datasets/uciml/breast-cancer-wisconsin-data
选择的是均值部分前十列,一共十个特征,M为恶性共212个,B为良性共357个,训练集选择了170个M与200个B组成
之后将癌症分类数值化(代码如下)
标签与数据分离
之后就是构建网络
encoder选择的是用RY门,角度编码10个量子比特上都放入RY门

卷积层构建

池化层

生成卷积块与池化块索引
生成Ansatz层




构建哈密顿量测量q9比特
搭建网络
因为数据集中一共有30个特征,前十列为均值,这里选取数据前十列特征均值部分
cancer_file2_x=cancer_file2_x.drop(['radius_se', 'texture_se', 'perimeter_se', 'area_se', 'smoothness_se', 'compactness_se', 'concavity_se', 'concave points_se', 'symmetry_se', 'fractal_dimension_se', 'radius_worst', 'texture_worst', 'perimeter_worst', 'area_worst', 'smoothness_worst', 'compactness_worst', 'concavity_worst', 'concave points_worst', 'symmetry_worst', 'fractal_dimension_worst'],axis=1)
cancer_file3_x=cancer_file3_x.drop(['radius_se', 'texture_se', 'perimeter_se', 'area_se', 'smoothness_se', 'compactness_se', 'concavity_se', 'concave points_se', 'symmetry_se', 'fractal_dimension_se', 'radius_worst', 'texture_worst', 'perimeter_worst', 'area_worst', 'smoothness_worst', 'compactness_worst', 'concavity_worst', 'concave points_worst', 'symmetry_worst', 'fractal_dimension_worst'],axis=1)
数据标准化
定义每一步的回调函数
之后就是监控的时候发现损失函数一直在震荡,如图

大佬们求求!
采用的数据集是乳腺癌细胞集https://www.kaggle.com/datasets/uciml/breast-cancer-wisconsin-data
选择的是均值部分前十列,一共十个特征,M为恶性共212个,B为良性共357个,训练集选择了170个M与200个B组成
之后将癌症分类数值化(代码如下)
cancer_file2=pd.read_csv(cancer_train_file) cancer_file3=pd.read_csv(cancer_test_file) diagnosis_mapping={'M':0,'B':1} cancer_file2['diagnosis']=cancer_file2['diagnosis'].map(diagnosis_mapping) cancer_file3['diagnosis']=cancer_file3['diagnosis'].map(diagnosis_mapping)标签与数据分离
之后就是构建网络
encoder选择的是用RY门,角度编码10个量子比特上都放入RY门
def Encoder(qubits): prg = PRGenerator('alpha') encoder = Circuit() for i in range(qubits): encoder += RY(prg.new()).on(i) encoder = encoder.no_grad() return encoder卷积层构建
def convolution(label,qubits): count=0 circ=Circuit() for i in range(2): circ+=RY(f'cov_{label}_{count}').on(qubits[i]) count+=1 circ+=X.on(qubits[1],qubits[0]) return circ池化层
def pooling(label,qubits,last=False): count=0 circ=Circuit() for i in range(1): circ+=RZ(f'p_{label}_{count}').on(qubits[1],qubits[0]) count+=1 circ+=RX(f'p_{label}_{count}').on(qubits[1],qubits[0]) count+=1 return circ生成卷积块与池化块索引
生成Ansatz层
def Ansatz(qubits): assert qubits%2==0 qlist=list(range(qubits)) circ=Circuit() flist,slist=split_qlist(qlist) count=0 while len(flist)>0: if len(flist)==1 and len(slist)==1: last=True else: last=False for i in range(len(flist)): q=[flist[i],slist[i]] circ+=convolution('blo_%s'%count,q) count+=1 circ+=pooling('blo_%s'%count,q,last) count+=1 flist,slist=split_qlist(slist) return circ ansatz=Ansatz(10) encoder=Encoder(10) circuit=encoder.as_encoder()+ansatz.as_ansatz()构建哈密顿量测量q9比特
ham = Hamiltonian(QubitOperator(f'Z{9}'))搭建网络
ms.set_context(mode=ms.PYNATIVE_MODE, device_target="CPU") ms.set_seed(1) sim = Simulator('mqvector', circuit.n_qubits) grad_ops = sim.get_expectation_with_grad(ham, circuit, parallel_worker=5) QuantumNet = MQLayer(grad_ops)因为数据集中一共有30个特征,前十列为均值,这里选取数据前十列特征均值部分
数据标准化
loss = SoftmaxCrossEntropyWithLogits(sparse=True, reduction='mean') opti = Adam(QuantumNet.trainable_params(), learning_rate=20) model = Model(QuantumNet, loss, opti, metrics={'Acc': Accuracy()}) train_loader = NumpySlicesDataset({'features': cancer_file2_x, 'labels': cancer_file2_y}, shuffle=True).batch(10) test_loader = NumpySlicesDataset({'features': cancer_file3_x, 'labels': cancer_file3_y}).batch(10)定义每一步的回调函数
class StepAcc(ms.Callback): def __init__(self,model,test_loader): self.model=model self.test_loader=test_loader self.acc=[] def on_train_step_end(self, run_context): self.acc.append(self.model.eval(self.test_loader, dataset_sink_mode=False)['Acc'])之后就是监控的时候发现损失函数一直在震荡,如图
大佬们求求!