Создание пользовательских функций Keras / Tensorflow, использующих массивы NumPy - PullRequest
0 голосов
/ 17 октября 2019

Я тренирую нейронную сеть, чтобы действовать как нелинейный контроллер. В основном, ANN (F *) должен обеспечивать сигнал w = F * (u), который делает B (G (w)) = G (u) для некоторой динамической модели B.

Для моделирования систем и нелинейностейЯ использую Python Control и использую Keras для создания последовательной модели:

# Creating model:
F = Sequential (name = 'compensator')
F.add (Dense (4, input_dim = 1, activation = 'linear', name = 'input_layer'))
F.add (Dense (4, activation =  deadzoneInverse, name = 'dense_layer'))
F.add (Dense (1, activation = 'linear', name = 'output_layer'))

и добавляю еще один слой для симуляции:

F.add (Dense (1, activation = simulation, name = 'simulation_layer'))

, так как simulation - это пользовательская функция, которая использует модули управления Python, в частности control.matlab.lsim, ее вычисления должны выполняться в массивах numpy. Модели / функции и преобразования Keras Tensors можно выполнить следующим образом:

для инверсии B:

# NumPy function:
def _dstar (x):
    y = x
    if (x > 5. * eps) or (x < -5. * eps):
        y = x
    elif (x > eps):
        y = x + a
    elif (x < -eps):
        y = x - a
    else:
        y = x * (1. + a / eps)
    return np.reshape(y, (-1, 1))

# Keras conversion:
def deadzoneInverse (x):
    x_array = K.eval(x)
    y_array = _dstar (x)
    return K.variable (y_array)

и для моделирования:

def _simul (x):
    x_array = x 
    t_array = np.linspace (0, currTime, int (currTime / Ts))

    y_array, _, _ = cm.lsim (G, x_array, t_array)
    y_array = B(y_array, t_array, a)

    return y_array[-1]

def simulation (x):
    x_array = K.eval(x)
    y_value = _simul(x_array)
    return K.variable (y_value)

Но когда я пытаюсьF.compile, я получаю:

InvalidArgumentError: You must feed a value for placeholder tensor 'input_layer_input_14' with dtype float and shape [?,1]
     [[Node: input_layer_input_14 = Placeholder[dtype=DT_FLOAT, shape=[?,1], _device="/job:localhost/replica:0/task:0/device:CPU:0"]()]]

Есть ли лучший способ реализовать эти функции, даже используя Python Control (и, следовательно, оценивать массивы numPy)?

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