在张量流中拟合非线性矢量函数的建议

时间:2018-09-20 16:52:47

标签: python-3.x tensorflow neural-network

我是tensorflow的新手,如果以下代码不是很聪明,请抱歉。我想在安装/训练神经网络时向您提出建议。下面给出一个最小的工作示例,带有实值条目的m维向量x是输入(特征,如果我对术语的理解是正确的),而输出(标签,我认为)是n维向量{ {1}}。

对于即将出现的示例(在python 3.6.5中),让我们使用2d向量f(x)(m = 2)和2d向量x(n = 2),在这里我近似为平方根函数(f的第一部分)和窦函数(第二部分)。

您会建议我做什么以改善模型?有经验法则吗?

稍后我需要处理高维输入x和高维输出f(x),但首先我想知道如何在如下所示的小示例中做得更好。

我一直在研究不同数量的神经元,层数,激活函数,优化器,步长和历元数。有什么建议吗?我已经对输入x和输出f进行了标准化/归一化,即,我计算了它们的均值和标准偏差,并相应地重新缩放了x和f。


python 3.6.5中的示例:

我将需要这些模块

f

以下几行生成一些输入数据x(x1从0到8,x2从0到15,每个方向离散30点)并计算函数f(x)的精确值,并显示函数f1 (x)和f2(x)

#%% Setup

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits import mplot3d
import tensorflow as tf

plots of f1 and f2

以下几行将输入和输出数据标准化/标准化,然后再次绘制数据(检查x和f是否已重新缩放)

#%% Generate data

lx = (8,15)
nx = 30

x = np.array(np.meshgrid(*[l*np.linspace(0,1,nx) for l in lx])).reshape(len(lx),-1).T
f = np.array([[10*np.sqrt(sum(xx)), 10*np.sin(np.sum(xx))+20] for xx in list(x)])

dx = np.shape(x)[1]
df = np.shape(f)[1]

fig = plt.figure(figsize=(7,2))
fig.add_subplot(1,2,1, projection='3d').scatter(x[:,0],x[:,1],f[:,0])
fig.add_subplot(1,2,2, projection='3d').scatter(x[:,0],x[:,1],f[:,1])

x and f rescaled

以下几行是神经网络的设置。您可以更改或增加神经元#%% Standardize data def sdata(x): for i in range(np.shape(x)[1]): x[:,i] = (x[:,i]-np.mean(x[:,i]))/np.std(x[:,i]) return x x = sdata(x) f = sdata(f) fig = plt.figure(figsize=(7,2)) fig.add_subplot(1,2,1, projection='3d').scatter(x[:,0],x[:,1],f[:,0]) fig.add_subplot(1,2,2, projection='3d').scatter(x[:,0],x[:,1],f[:,1]) 中的数目。元组nn的长度自动定义层数。激活函数是nn,优化器af和时期数opt

nep

以下几行开始张量流会话,绘制(f(x)的初始预测值#%% Neural network setup # Number of neurons in layers, activation function, optimizer and number of epochs nn = (16,16,16,df) af = tf.tanh opt = tf.train.AdamOptimizer(0.01) nep = 3000 # Placeholders for input x, output f xp = tf.placeholder(dtype=tf.float32, shape=[None,dx]) fp = tf.placeholder(dtype=tf.float32, shape=[None,df]) # Build sequential model, last call is output model = xp for i in range(len(nn)-1): model = tf.layers.dense(model,nn[i],activation=af) model = tf.layers.dense(model,nn[-1],activation=None) # Loss function (MSE), training step and initializer loss = tf.reduce_mean(tf.square(model-fp)) trainstep = opt.minimize(loss) init = tf.global_variables_initializer() ,计算损失函数的值(均方误差,MSE),进行训练,绘制历时的损失函数,绘制f(x)的最终谓词,并绘制输出数据f(x)和fpred(x)之​​间的绝对差

fpre(x)

这是最初的预测

enter image description here

这是历时的损失函数

enter image description here

这是最终的预测和绝对差异

enter image description here

是否有任何关于如何改善此问题或使代码更高效的想法?谢谢!

0 个答案:

没有答案