python - 如何为遗传算法编写交叉函数
问题描述
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] for param in parents[1].brain.parameters()”的输出结果是一个不应该的3个张量的列表。输出
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]
推荐阅读
- android - android清除radiogroup onclick按钮(清除)
- sql - SQL:计算行数,直到满足条件
- corda - 限制 Corda 网络上的最大节点数
- java - 请告诉我为什么错了(LCM & GCD)
- android - RecyclerView 的自定义侦听器未检测到点击
- javascript - JavaScript 中存储构造函数的变量
- javascript - if 语句未返回预期结果 Javascript
- javascript - jquery 不能在 Angular 2 中工作?
- android - 颤振资产包在哪里?
- python-3.x - 在 DataFrame 上进行 Data Wrangling 时,这个错误是什么意思?