numpy - 创建使用 NumPy 数组的自定义 Keras/Tensorflow 函数
问题描述
我正在训练一个神经网络来充当非线性控制器。基本上,ANN (F*) 必须提供一个信号 w = F*(u),它对某些动态模型 B 执行 B(G(w)) = G(u)。
为了模拟系统和非线性,我使用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 模块的自定义函数,特别control.matlab.lsim
是,它的计算需要在 numpy 数组中完成。模型/函数和 Keras 张量转换可以像这样完成:
对于 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 数组评估)?
解决方案
推荐阅读
- javascript - 如何从路由函数外部获取 Nodejs 响应对象?
- c++ - C++ std::string 语法“new (&y) std::string(x);”
- c - 什么是“命名空间清洁度”,glibc 是如何实现的?
- c# - 如何保存 XML 文件而不在空的打开和关闭标签之间添加换行符?
- javascript - 循环检查条件的Javascript
- python - Python:如果存在,则在子字符串之前有 4 个单词
- c++ - 为什么我的替代排序算法不起作用?
- vba - 为 PowerPoint (Office 365) Mac 开发自定义功能区加载项
- c# - 如何在类变量中获取我的 WPF 窗口的实际大小?
- spring-integration - Spring 集成中的 TLS 和客户端身份验证