如何在Qiskit的ADAM优化器中获取优化过程的中间步骤?
获取Qiskit v0.45.2 ADAM优化器训练VQC的中间步骤
在Qiskit v0.45.2中,虽然官方文档未专门提及,但可以通过两种方式实现类似PyTorch/TensorFlow的回调功能,获取优化过程的中间训练信息:
方法1:利用Optimizer.minimize的callback参数
Qiskit所有优化器(包括内置ADAM)的minimize方法都支持callback参数。你可以定义一个自定义函数,每次迭代后该函数会被自动调用,传入当前迭代次数、参数值、损失值等关键数据。
示例代码:
from qiskit.algorithms.optimizers import ADAM from qiskit_machine_learning.algorithms import VQC from qiskit.circuit.library import TwoLocal from qiskit.primitives import Sampler import numpy as np # 假设已准备好数据集X(特征)、y(标签) X = np.random.rand(10, 2) y = np.random.randint(0, 2, 10) # 定义量子电路与VQC核心组件 ansatz = TwoLocal(num_qubits=2, rotation_blocks='ry', entanglement_blocks='cz') sampler = Sampler() vqc = VQC( sampler=sampler, ansatz=ansatz, loss='cross_entropy' ) # 自定义损失函数,复用VQC的内部计算逻辑 def loss_func(params): predictions = vqc._neural_network.forward(X, params) return vqc._loss(y, predictions) # 初始化训练历史记录容器 training_history = [] # 定义回调函数:记录/打印每一步的训练信息 def callback(eval_count, params, value, meta): training_history.append({ 'iteration': eval_count, 'params': params.tolist(), 'loss': float(value) }) print(f"Iteration {eval_count}: Loss = {value:.4f}") # 初始化ADAM优化器与初始参数 adam = ADAM(maxiter=100, lr=0.01) initial_params = ansatz.random_parameters() # 启动优化并传入回调函数 optim_result = adam.minimize( fun=loss_func, x0=initial_params, callback=callback ) # 训练完成后,training_history中存储了所有中间步骤数据 # print(training_history)
方法2:手动实现优化循环(更高灵活性)
如果需要对每一步优化做精细控制,可以手动循环执行优化步骤,自行计算损失、更新参数并记录中间状态。ADAM优化器提供了step方法支持单次参数更新:
示例代码:
from qiskit.algorithms.optimizers import ADAM # 初始化ADAM优化器与状态 adam = ADAM(maxiter=100, lr=0.01) optimizer_state = adam.init_state() current_params = ansatz.random_parameters() training_history = [] # 手动执行100次优化迭代 for iter_num in range(1, 101): # 计算当前参数下的损失值 current_loss = loss_func(current_params) # 记录当前训练状态 training_history.append({ 'iteration': iter_num, 'params': current_params.tolist(), 'loss': float(current_loss) }) print(f"Iteration {iter_num}: Loss = {current_loss:.4f}") # 执行单次优化步骤,更新参数与优化器状态 current_params, optimizer_state = adam.step( fun=loss_func, x=current_params, state=optimizer_state ) # 记录最终训练状态 final_loss = loss_func(current_params) training_history.append({ 'iteration': 101, 'params': current_params.tolist(), 'loss': float(final_loss) })
两种方法均能满足需求:方法1简洁高效,适合常规场景;方法2适合需要插入自定义逻辑(如早停、参数校验)的复杂训练流程。
内容的提问来源于stack exchange,提问作者user23385971
相关产品推荐
相关产品推荐

