基于PyTorch与Qiskit的多参数混合经典量子神经网络报错解决
解决Qiskit混合经典量子神经网络多可训练参数的TypeError问题
问题分析
你遇到的TypeError: object of type 'float' has no len(),本质是原Hybrid类的逻辑只适配单个标量参数,当传入多参数张量时,参数绑定逻辑错误地将整个张量当成单个浮点数处理,触发了需要遍历参数长度的操作失败。手动设置(1,2)张量无效,是因为forward方法没有正确处理二维输入的维度拆分。
修改方案
1. 适配多参数的量子电路定义
用ParameterVector批量定义可训练参数,替代单个Parameter,方便后续参数绑定:
from qiskit import QuantumCircuit, Aer, execute from qiskit.circuit import ParameterVector import torch def build_quantum_circuit(): # 创建包含2个可训练参数的向量 params = ParameterVector('θ', 2) qc = QuantumCircuit(1, 1) # 给量子门绑定不同的可训练参数 qc.rx(params[0], 0) qc.ry(params[1], 0) qc.measure(0, 0) return qc, params
2. 修改Hybrid类的forward方法
调整输入处理逻辑,拆分二维输入张量的每个样本参数,逐一绑定到量子电路:
class Hybrid(torch.nn.Module): def __init__(self, backend, shots): super().__init__() self.backend = backend self.shots = shots self.qc, self.trainable_params = build_quantum_circuit() def forward(self, x): # 输入x形状要求为(N, 2):N是样本数,2是可训练参数个数 output = [] for sample in x: # 绑定当前样本的2个参数到量子电路对应位置 bound_circuit = self.qc.bind_parameters({ self.trainable_params[0]: sample[0].item(), self.trainable_params[1]: sample[1].item() }) # 执行量子电路并计算期望输出 job = execute(bound_circuit, self.backend, shots=self.shots) counts = job.result().get_counts() expectation = counts.get('0', 0) / self.shots output.append(expectation) # 转换为PyTorch张量返回,保持维度匹配 return torch.tensor(output, dtype=torch.float32).view(-1, 1)
3. 验证多参数输入
构造符合维度要求的输入张量,测试模型运行:
# 初始化模拟器和模型 backend = Aer.get_backend('qasm_simulator') model = Hybrid(backend, shots=1024) # 构造3个样本,每个样本含2个可训练参数 input_tensor = torch.tensor([[0.1, 0.2], [0.3, 0.4], [0.5, 0.6]], dtype=torch.float32) result = model(input_tensor) print(result)
关键修改点
- 用
ParameterVector统一管理多可训练参数,避免单个参数定义的冗余。 - 在forward方法中遍历输入的每个样本,拆分出对应参数逐一绑定,确保每个量子门获取正确的参数值。
- 严格保证输入张量为二维结构(样本数×参数数),避免标量或一维输入导致的维度不匹配问题。
内容的提问来源于stack exchange,提问作者Sreetama Das
相关产品推荐
相关产品推荐

