本人学生刚接触量子,各位大佬能不能帮忙看下代码,做的10比特量子卷积神经网络代码,但不知道为啥损失函数在震荡
收藏回复举报
本人学生刚接触量子,各位大佬能不能帮忙看下代码,做的10比特量子卷积神经网络代码,但不知道为啥损失函数在震荡
t('forum.solved') 已解决
新人帖
发表于2024-03-25 09:09:21
0 查看

采用的数据集是乳腺癌细胞集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)

标签与数据分离

list1 = ['id','diagnosis'] 
cancer_file2_y = cancer_file2.diagnosis 
cancer_file2_x = cancer_file2.drop(list1,axis = 1 ) 
cancer_file3_y = cancer_file3.diagnosis 
cancer_file3_x = cancer_file3.drop(list1,axis = 1 )

之后就是构建网络

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

cke_42342.png

卷积层构建

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

cke_56633.png

池化层

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

cke_72885.png

生成卷积块与池化块索引

def split_qlist(qlist):     
 n=len(qlist)     
 flist=[]     
 slist=[]     
 if n>1:         
  for i in range(int(n/2)):             
   flist.append(qlist[2*i])             
   slist.append(qlist[2*i+1])     
 if n%2==1:         
  slist.append(qlist[-1])      

 return flist,slist

生成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()

cke_163438.pngcke_167402.pngcke_177151.pngcke_186412.png

构建哈密顿量测量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个特征,前十列为均值,这里选取数据前十列特征均值部分

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)

数据标准化

cancer_file2_x=(cancer_file2_x - cancer_file2_x.mean()) / (cancer_file2_x.std())#标准化
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'])
monitor = LossMonitor(16) 
acc = StepAcc(model, test_loader) 
model.train(20, train_loader, callbacks=[monitor, acc], dataset_sink_mode=False)

之后就是监控的时候发现损失函数一直在震荡,如图

cke_690877.png

大佬们求求!

我要发帖子