Изучение функции греха - PullRequest
0 голосов
/ 29 июня 2018

Я новичок в машинном обучении Я строю простую модель, которая сможет предсказать простую sin функцию

Я сгенерировал некоторые sin значения и добавил их в свою модель.

from math import sin

xs = np.arange(-10, 40, 0.1)
squarer = lambda t: sin(t)
vfunc = np.vectorize(squarer)
ys = vfunc(xs)

model= Sequential()
model.add(Dense(units=256, input_shape=(1,), activation="tanh"))
model.add(Dense(units=256, activation="tanh"))
..a number of layers here
model.add(Dense(units=256, activation="tanh"))
model.add(Dense(units=1))
model.compile(optimizer="sgd", loss="mse")
model.fit(xs, ys, epochs=500, verbose=0)

Затем я генерирую некоторые тестовые данные, которые накладываются на мои данные обучения, но также вводит некоторые новые данные

test_xs = np.arange(-15, 45, 0.01)
test_ys = model.predict(test_xs)
plt.plot(xs, ys)
plt.plot(test_xs, test_ys)

Прогнозируемые данные и данные обучения выглядят следующим образом. Чем больше слоев я добавляю, тем больше кривых сеть способна освоить, но процесс обучения увеличивается. Есть ли способ заставить его предсказать sin для любого числа кривых? Желательно с небольшим количеством слоев. enter image description here

1 Ответ

0 голосов
/ 29 июня 2018

Полностью подключенная сеть, я думаю, вы не сможете получить произвольно длинные последовательности, но с RNN похоже, что люди достигли этого. В поиске Google появится много таких попыток, я быстро нашел это: http://goelhardik.github.io/2016/05/25/lstm-sine-wave/

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

Я подозреваю, что ограничение, которое вы наблюдали, сродни полиномиальной подгонке. Если вы увеличите степень полинома, вы можете лучше подобрать функцию, подобную этой, но полином может представлять только фиксированное количество точек перегиба в зависимости от выбранной вами степени. Ваше наблюдение здесь выглядит так же. По мере увеличения слоев вы добавляете больше нелинейных переходов. Однако вы ограничены фиксированным количеством слоев, которые вы выбрали в качестве архитектуры в полностью подключенной сети.

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

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