首页 > 解决方案 > 如何创建权重数组(即作弊)以找到最佳精度

问题描述

我是一名数据科学家,我一直在想,当我训练一个模型时,它会通过梯度方向的学习率来调整它的权重,以找到我的指标的最佳准确度......所以从技术上讲,所有这些调整后的权重可以手动生成并用于找到我给定问题的最佳准确性。

所以我尝试创建一个函数来接收给定模型中所有数字的差异(例如学习率 0.0001)和节点的数量(也就是数组的大小)(可以为每一层创建权重可能性,尽管它也可以是一个参数)。

(为此,我只会使用一层。)

我自己尝试过创建它,但一开始就惨败,因为它背后的逻辑正在打破我的大脑 XD:

num = 1
lr=0.01
nodes = 100
all_posib = []
for a in range(nodes):
    llist = []
    for b in range(nodes):
        llist.append((num)*lr)
    for c in range(nodes):
        for d in range(nodes):
            llist2 = llist.copy()
            llist2[c] = ((num)*lr+(num+d)*lr)
            llist2 = [np.array([llist2])]
            all_posib.append(llist2)

所以首先这并不完整,但它应该让我大致了解我想要做什么。

其次,这需要以某种方式进行矢量化,或者可能有一个函数可以做得更好,因为它已经花费了相当多的时间来加载。

第三,我知道在任何情况下这都需要很长时间才能加载重量,但我可能会离开它几个晚上。

这是我可能会使用的模型示例:P,我最喜欢将其放在一个循环中并检查哪个权重组提供最佳精度:

def build_model():
    model = models.Sequential()
    model.add(layers.Dense(100, activation = "relu", input_shape = (train_data.shape[1], )))
    model.add(layers.Dense(1))
    model.compile(optimizer = 'Adam',loss = 'mse', metrics = ['mae'])
    return model

model = build_model()
model.set_weights(llist_weights)
test_mse_score, test_mae_score = model.evaluate(test_data, test_targets)

因此,如果您不想运行上面的示例,我需要的输出基本上是给定节点/大小的所有可能权重的列表:

例子:

[[0, 0, 0, 0.1], [0, 0, 0, 0.2], [0, 0, 0, 0.3],
 [0, 0, 0.1, 0.1], [0, 0, 0.2, 0.1], [0, 0, 0.3, 0.1],
 [0, 0.1, 0.1, 0.1], [0, 0.2, 0.1, 0.1], [0, 0.3, 0.1, 0.1],
 [0.1, 0.1, 0.1, 0.1], [0.2, 0.1, 0.1, 0.1], [0.3, 0.1, 0.1, 0.1]]

甚至可能列出所有想要的值,例如 [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6] ,然后创建大小为 4 的所有可能组合(我的逻辑问题是想要的值比数组的大小更多,所以我也不知道如何在逻辑上合并它)

如果你能帮我解决这个问题,那真的是一个很大的帮助(对于我的余生XD),当然也对其他人来说也是如此。提前致谢!

标签: pythonkerasneural-networklogicfloating-accuracy

解决方案


我浏览了更多,因为在问了这个问题之后,答案开始让我明白如何处理这个 XD。

def get_all_posib_weights(nodes, lr=0.1, save=''):
    llist = (np.append(np.arange(1/lr)*lr, -np.arange(1, 1/lr)*lr))
    comb = itertools.combinations_with_replacement(llist, nodes)
    llist2 = list(comb)
    print(len(llist2))
    if len(save) > 0:
        for i, l in enumerate(llist2):
            np.save(save+'{}/{}-{}-{}.npy'.format(nodes, nodes, lr, i), l)
    return llist2Exchange/weights/'
list_weights = get_all_posib_weights(10, 0.2)

所以这会起作用,并且正如预期的那样它有无限的可能性,基本上我计划找到最好的权重集并从所选的权重集进一步训练模型:)(我知道非常不切实际)

我正在为实际使用此 XD 的任何人戴上它,也许一些天才会出现并改进代码:P Adios 我会回来检查并告知它是否比使用正常训练方法更好;)


推荐阅读