dark_ruby
dark_ruby

Reputation: 7865

Learning a Sin function

I'm new to Machine Learning I' building a simple model that would be able to predict simple sin function

I generated some sin values, and feeding them into my model.

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)

I then generate some test data, which overlays my learning data, but also introduces some new data

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

Predicted data and learning data looks as follows. The more layers I add, the more curves network is able to learn, but the training process increases. Is there a way to make it predict sin for any number of curves? Preferably with a small number of layers. enter image description here

Upvotes: 3

Views: 718

Answers (1)

David Parks
David Parks

Reputation: 32081

With a fully connected network I guess you won't be able to get arbitrarily long sequences, but with an RNN it looks like people have achieved this. A google search will pop up many such efforts, I found this one quickly: http://goelhardik.github.io/2016/05/25/lstm-sine-wave/

An RNN learns a sequence based on a history of inputs, so it's designed to pick up these kinds of patterns.

I suspect the limitation you observed is akin to performing a polynomial fit. If you increase the degree of polynomial you can better fit a function like this, but a polynomial can only represent a fixed number of inflection points depending on the degree you choose. Your observation here appears the same. As you increase layers you add more non-linear transitions. However, you are limited by a fixed number of layers you chose as the architecture in a fully connected network.

An RNN does not work on the same principals because it maintains a state and can make use of the state being passed forward in the sequence to learn the pattern of a single period of the sine wave and then repeat that pattern based on the state information.

Upvotes: 6

Related Questions