Разместите каждый n-й элемент в массиве - PullRequest
2 голосов
/ 16 апреля 2019

Я кодирую простую нейронную сеть с нуля. Нейронная сеть реализована в методе simple_1_layer_classification_NN. Как видно из for loop (в приведенном ниже коде), для каждой Epoch (тренировочного прогона нейронной сети) я добавляю значение cost (error margin) к массиву costs. Дело в том, что количество тренировок может достигать тысяч или даже миллионов. Это означает, что к массиву costs может быть добавлено очень много элементов cost.

Поскольку я не хочу отображать тысячи или миллионы точек данных на графике, я хочу, чтобы независимо от того, сколько элементов в массиве costs, я хочу построить только 100 точек данных. Исходя из этого, распространяется как можно более равномерно. Например. если есть 10 элементов, то вычерчивают все 10 элементов. Если есть 100 элементов, выведите все 100 элементов. Если значение превышает 100, постройте только 100 точек данных с равным интервалом. Например. с 200 сюжетом каждый второй пункт данных. С 500, построить каждый 5-й элемент. Даже если это 102 элемента, то выведите на экран только 100 точек данных с максимально возможным разнесением. Я надеюсь это имеет смысл. Возможно ли это сделать? Обратите внимание, я включаю только часть кода, которая наиболее актуальна для вопроса. Там, где есть комментарии с точками # ...... Я просто указываю, что здесь есть код, но я его не включил, так как он не имеет отношения к вопросу.

Большое спасибо заранее за любую помощь.


 def simple_1_layer_classification_NN(self, dataset_input_matrix, output_data_labels, input_dimension, epochs, activation_func='sigmoid', learning_rate=0.2, cost_func='squared_error'):
        # ...............
        cost = float()
        costs = []
        # ................

        # We perform the training based on the number of epochs specified
        for i in range(epochs):

                 #....................
                 # Cost: the cost function to calculate the prediction error margin
                 cost = chosen_cost_func(pred, output_data_labels[ri])

                costs.append(cost)
        #.....................

    plt.plot(costs)
    plt.show()

1 Ответ

2 голосов
/ 16 апреля 2019

Как насчет

x = xdata[::10]
x = ydata[::10]
plt.plot(x, y)
plt.show()

он будет строить каждые 10-е точки из xdata, ydata

В вашем случае

x = None
y = None
l = len(xdata) 
if l < 100:
    x = xdata[::]
    y = ydata[::]
elif l < 200:
    x = xdata[::2]
    y = ydata[::2]
elif l < 500:
    x = xdata[::5]
    y = ydata[::5]

UPDATE

Не уверен, что это актуально, но вы также можете попробовать использовать пользовательские шаги.Он будет указывать на один и тот же буфер данных, но использовать разные метаданные для пошагового перемещения данных.

Функция, которую нужно посмотреть - https://docs.scipy.org/doc/numpy/reference/generated/numpy.lib.stride_tricks.as_strided.html#numpy.lib.stride_tricks.as_strided,, и она по какой-то причине находится в stride_tricks.получить время, чтобы привыкнуть к этому.Установите для записи значение False, чтобы не мешать исходным данным.Простой пример: здесь .

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