我是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
以下几行将输入和输出数据标准化/标准化,然后再次绘制数据(检查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])
以下几行是神经网络的设置。您可以更改或增加神经元#%% 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)
这是最初的预测
这是历时的损失函数
这是最终的预测和绝对差异
是否有任何关于如何改善此问题或使代码更高效的想法?谢谢!