Функция изучения синуса, кажется, принимает слишком много параметров в ANN (Keras) - PullRequest
0 голосов
/ 19 февраля 2019

Я пытался провести небольшое исследование о различных методах приближения функций, и первым, что я попробовал, является использование ANN (Искусственная Нейронная Сеть).Код следующий -

import tensorflow as tf
import matplotlib.pyplot as plt
%matplotlib inline
import numpy as np
from tensorflow.keras.layers import Input, Dense, Flatten, Dropout
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.models import Model
from sklearn.preprocessing import MinMaxScaler

X = np.linspace(0.0 , 2.0 * np.pi, 20000).reshape(-1, 1)
Y = np.sin(X)

x_scaler = MinMaxScaler()
y_scaler = MinMaxScaler()

X = x_scaler.fit_transform(X)
Y = y_scaler.fit_transform(Y)

plt.plot(X, Y)
plt.show()


inp = Input(shape=(20000, 1))

x = Dense(32, activation='relu')(inp)
x = Dense(64, activation='relu')(x)
x = Dense(128, activation='relu')(x)
x = Dense(256, activation='relu')(x)
predictions = Dense(1, activation='linear')(x)

model = Model(inp, predictions)

model.compile(loss='mse', optimizer='adam')
model.summary()

X = X.reshape((-1, 20000, 1))
Y = Y.reshape((-1, 20000, 1))

history = model.fit(X, Y, epochs=500, batch_size=32, verbose=2)

X_test = np.linspace(0.0 , 2.0 * np.pi, 20000).reshape(-1, 1)
X_test.shape
X_test = x_scaler.transform(X_test)
X_test = X_test.reshape((-1, 20000, 1))
res = model.predict(X_test, batch_size=32)

res = res.reshape((20000, 1))
res_rscl = y_scaler.inverse_transform(res)

Y_rscl = y_scaler.inverse_transform(Y.reshape(20000, 1))

plt.subplot(211)
plt.plot(res_rscl, label='ann')
plt.plot(Y_rscl, label='train')
plt.xlabel('#')
plt.ylabel('value [arb.]')
plt.legend()
plt.subplot(212)
plt.plot(Y_rscl - res_rscl, label='diff')
plt.legend()
plt.show()

Графики похожи на следующие -

Training Graphs

Как мы видим, он действительно приближен к синусукривой очень хорошо с этой архитектурой.Однако я не совсем уверен, что поступаю правильно.Мне кажется странным, что мне нужны 43,777 параметры, чтобы соответствовать синусоиде.Может я не прав.Однако, глядя на этот код R (я вообще не знаю R, но я предполагаю, что ANN намного меньше, чем у меня), я удивляюсь больше.

Мой вопрос- Правильно ли подходит мой подход?Стоит ли что-то менять, чтобы количество параметров стало меньше?Или это нормально, что синус является сложной функцией, и для ANN требуется достаточное количество параметров для ее аппроксимации?

Это может быть несколько открытый вопрос, но я был бы очень признателен за любое направление, на которое вы можете указать мне, и за любую ошибку, которую я совершаю, чтобы вы могли показать мне.

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

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