def crossover(parents):
result = copy.deepcopy(parents[0].brain)
for param in result.parameters():
print((param.shape[0] / 2))
if len(param.shape) == 2: # weights of linear layer
for i0 in range(param.shape[0]):
for i1 in range(param.shape[1]):
if i0 < (param.shape[0] / 2) and i1 < (param.shape[1]):
param[i0][i1] = [param[i0][i1] for param in parents[0].brain.parameters() if
len(param.shape) == 2]
# print("x is", x)
# print(f"param{i0}{i1}", param[i0][i1])
# param[i0][i1] = 2
else:
param[i0][i1] = [param[i0][i1] for param in parents[1].brain.parameters() if
len(param.shape) == 2]
我正在使用pytorch库,并尝试为我的项目编写一个交叉函数。最初,为了获得交叉结果,我只是为了轻松而复制了父母之一的大脑。然后我从中间切入,并合并其中两个父母的大脑。问题是此“ param [i0] [i1]的parents [1] .brain.parameters()中的param的输出”出来的是三个张量的列表,不应该这样。输出
x is [tensor(0.0775), tensor(0.0372), tensor(0.2628)]
param07 tensor(0.0775)
我该如何解决?
我试图在此处使用列表理解功能时出现了问题,我认为我仍然还不完全了解。所以我为此写了一个合适的循环,它起作用了。
def crossover(parents):
result = copy.deepcopy(parents[0].brain)
for param in result.parameters():
if len(param.shape) == 2: # weights of linear layer
for i0 in range(param.shape[0]):
for i1 in range(param.shape[1]):
if i0 < (param.shape[0] / 2) and i1 < (param.shape[1]):
for p in parents[0].brain.parameters():
if len(p.shape) == 2 and param.shape == p.shape:
param[i0][i1] = p[i0][i1]
else:
for p in parents[1].brain.parameters():
if len(p.shape) == 2 and param.shape == p.shape:
param[i0][i1] = p[i0][i1]