Как создать массив весов, иначе чит, чтобы найти оптимальную точность - PullRequest
0 голосов
/ 05 ноября 2019

Я - специалист по данным, и некоторое время я думал, что, когда я обучаю модель, она корректирует свои веса в зависимости от скорости обучения в направлении градиента, чтобы найти оптимальную точность моей метрики ... Так что технически всеэти скорректированные веса могут быть сгенерированы вручную и использованы для определения оптимальной точности моей заданной задачи.

Поэтому я попытался создать функцию, которая получает разность всех чисел (например, скорость обучения, например, 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) и, конечно, для других. Заранее спасибо!

1 Ответ

0 голосов
/ 06 ноября 2019

Я стал немного больше путешествовать, потому что после того, как я задал этот вопрос, мне стало понятно, как мне подойти к этому 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 Я проверю и сообщу, работал ли он лучше, чем с обычным методом обучения;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...