Ответы пользователя по тегу Нейронные сети
  • Как тренировать нейронную сеть, если размер модели больше, чем имеющийся объём памяти устройства?

    FerroPanda
    @FerroPanda Автор вопроса
    В моём случае актуальным является PyTorch и там я нашёл как использовать параллелизм модели.
    Single-Machine Model Parallel Best Practices
    Если по простому, то раскидываем слои модели по разным устройствам и они поочереди считаются. Для ускорения процесса используется поточность - пока вторая карта считает последние слои, первая уже начинает считать первые слои на следующем примере.
    Ответ написан
    Комментировать
  • Где происходит ввод вывод и проверка данных?

    FerroPanda
    @FerroPanda
    Если до сих пор не разобрался, то добро пожаловать в PyTorch.)))
    https://proglib.io/p/generativno-sostyazatelnaya-n...
    Ответ написан
    Комментировать
  • Как правильно оформить функцию потерь в torch?

    FerroPanda
    @FerroPanda Автор вопроса
    Сам разобрался.
    В итоге всё сводится к тому, чтобы в своей какой-то функции обработать ответы сети, оценить их и самостоятельно высчитать ошибку. Потом взять любой ответ сети, на его основе создать свой правильный ответ, в сравнении с которым будет ошибка нужного нам размера, и потом это всё запихнуть в функцию потерь. Вся фишка в том, что к ответам сети привязаны графы их получения, т.е. в тензоре ответа сети есть вся последовательность как он получен. И на основании правильного ответа, ответа сети и этого графа, привязанного к ответу сети, выполняется обратное распространение ошибки. Нет графа - нет обучения. ))
    Ещё один момент - если в сети используется какой-то не типовой не дифференцируемый слой, то штатная оптимизация тоже не будет работать, но при этом никаких ошибок не покажет.
    В моём случае с выходной активацией softmax это оказалось не очень удачным вариантом, потому что допустим при ошибке 0,2 я не смог придумать как правильно создать целевой ответ.
    Условный код как это работает:
    optimizer.zero_grad()
    answers = agent.forward(train_data)
    #вычисляем ошибку на основе ответов сети в какой-то своей функции f(). 
    #Получаем например 0,2 - типа ошибка 20%
    nn_error = f(answers)
    #берём первый из ответов сети, который содержит граф расчётов
    nn_ans = answers[0]
    #тут нам нужно создать правильный ответ - возможны вариант и нужно придумать правильно
    #чтобы получить правильный можно как прибавить 20%, так и вычесть. Я прибавил.
    target_ans = nn_ans * (1 + nn_error)
    #функцию потерь можно сделать как свою, так и использовать штатную
    f_loss = nn.L1Loss()
    loss = f_loss(nn_ans, target_ans)
    loss.backward()
    optimizer.step()
    #print(list(agent.parameters()))
    Ответ написан
  • Какими алгоритмами обучения можно воспользоваться, с нестандартной функцией ошибки, которые на прямую не используют выходы обьучающих данных?

    FerroPanda
    @FerroPanda
    Я тоже не профессионал, но попробовал бы в данном случае генетический алгоритм - отбирать лучшего из пачки, немного мутировать, не забывая об исследователях, и дальше.
    Ответ написан
    Комментировать
  • Нужен пример кода на Питоне обучения НС с подкреплением. Есть у кого?

    FerroPanda
    @FerroPanda Автор вопроса
    Вот нашёл ещё хороший пример для разбора и обучения на нём
    https://www.machinelearningmastery.ru/reinforcemen...
    Ответ написан
    Комментировать
  • Правильно ли я понимаю разницу между нейронной сетью и компьютерной программой?

    FerroPanda
    @FerroPanda
    Если совсем упрощённо.
    Программа это чётка последовательность действий Если-То-Иначе (Если высоко, то отойти назад, иначе прыгнуть).
    Нейронная сеть это сложная подгонка под ответ, ответ не бывает точным. Даже если он на 100% правильный, то это случайность. В примитивно варианте, НС это среднее арифметическое между примерами на которых учили эту НС.
    Если сеть учили на командах "ходить", а вы ей скажите "взлетай", то ответ она тоже выдаст, но он скорее всего будет абсурдным, но при этом не очевидно ошибочным, т.е. будет похож на правду.
    Ответ написан
    Комментировать
  • С какими ограничениями я могу столкнуться, если буду писать на чистом Keras?

    FerroPanda
    @FerroPanda
    На Keras вам будет недоступно обучение с подкреплением.
    Но лучше всё-таки начать с Keras - понять основы, набить пару шишек. И когда придёт осознание того, что вам нужно либо остаться на Keras, либо уйти в pytorch ... либо всё бросить.
    Ответ написан
    Комментировать
  • Матрица. Как правильно подать данные для обучения нейронной сети?

    FerroPanda
    @FerroPanda Автор вопроса
    Для keras при обучении LSTM, RNN или свёрточных сетей такие данные нужно подавать в виде тензора, т.е. делать матрицу трёхмерной или больше. Любую двухмерную матрицу M(Х, Y) можно представить как трёхмерную M(X, Y, Z), где Z=1.
    Делается это с помощью reshape - изменяется размерность массива при сохранении данных.
    M =np.reshape(M, (X, Y, Z)) или M =np.reshape(M, (X, Z, Y))
    В моём же случае если Х количество обучающих выборок, то графики в эксельку сохраняем как матрицу М(Х, 400), а потом после загрузки данных делаем M =np.reshape(M, (X, 4, 100)).
    В итоге получается Х наборов двухмерных матриц 4х100.
    В принципе, для загрузки в питон, в файл можно сохранить все данные в одну строчку, а потом с помощью reshape нарезать их в нужный формат (2d, 3d, 4d и т.д.).
    Ответ написан
    Комментировать
  • Как посчитать сколько нужно видеопамяти для тренировки нейронной сети?

    FerroPanda
    @FerroPanda Автор вопроса
    Сам отвечу. Необходимый объём памяти равен объёму обучающей выборки +ещё чуть-чуть. Если данных больше, чем объём памяти видеокарты, то падает производительность ядра, т.к. начинается постоянная подкачка данных из оперативной памяти в память видеокарты. Загрузка процессора видеокарты в таком случае падает в 2-3 раза, иногда больше.
    Если у вас обучающая выборка 10+ Гб, то на 1060 возможно загрузка карты будет постоянная приближённая к максимуму. Т.е. проц не быстрый и успевает обработать то, что подгрузилось. Карта 1080 и выше в такой ситуации будет постоянно простаивать в ожидании данных, т.е. время обучения НС окажется условно одинаковым.
    Если же объём выборки будет в районе 5-6 Гб или меньше, то 1080 окажется существенно быстрее.
    Ответ написан
    Комментировать
  • Как прогнозировать многомерные временные ряды в Keras?

    FerroPanda
    @FerroPanda
    Я так понял, что это возможно только в LSTM и подобных структурах.
    Создаёшь трехмерный массив data(x, y, z) где -
    x - количество обучающих выборок
    y - количество векторов в одной обучающей выборке
    z - количество данных в одном векторе.

    Потом создаёшь слой LSTM
    model.add(LSTM(units=32, input_shape=(y, z)))
    x указывать не нужно сеть сама поймёт что к чему.
    units - это количество выходов на следующий слой (32 как пример).

    Если моё представление ошибочно, то думаю меня поправят, но вроде работает.
    Ответ написан
    Комментировать