我正在编写一个脚本,从2D数据推断平面。到目前为止,这就是我想到的:
import matplotlib.pyplot as plt
import numpy as np
def interp(dataxy,dataz,prediction,plot):
model=tf.keras.Sequential([tf.keras.layers.Dense(1),
tf.keras.layers.Dense(10,activation=tf.nn.relu),
tf.keras.layers.Dense(1,activation=None)])
model.compile(loss='mean_squared_error',optimizer=tf.keras.optimizers.Adam(0.1))
model.fit(dataxy,dataz,epochs=100,verbose=False)
if plot:
iter_max=10
x=y=np.arange(0,1+1/iter_max,1/iter_max)
Z=np.zeros((iter_max+1,iter_max+1))
for iter_i in x:
for iter_j in y:
ponto = [iter_i,iter_j]
[aux] = model.predict([ponto])
Z[int(iter_max*iter_i)][int(iter_max*iter_j)]=aux
X,Y = np.meshgrid(x,y)
Z=Z.reshape(iter_max+1,iter_max+1)
fig = plt.figure()
ax = fig.gca(projection='3d')
# plt.xlabel('input')
# plt.ylabel("output")
ax.scatter([dataxy[i][0] for i in range(0,len(dataxy))],[dataxy[i][1] for i in range(0,len(dataxy))], zs=dataz, s=20, color='black')
ax.plot_surface(X,Y,Z, label="predictions")
return model.predict([prediction])
训练数据由给出
xx=[[0,0],[0,1],[0,1],[1,0],[0,1],[0,0],[1,1]]
and
yy=[2.6,0.9,1.2,-0.05,1.1,2.3,-1.42]
问题是,它只在整个域([0,1]x[0,1](中返回一个常数值,大约2.4。这里可能有什么问题?
已解决!这是最后的代码。
import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np
def interpv3(dataxy,dataz,prediction,plot):
model=tf.keras.Sequential()
model.add(tf.keras.layers.Dense(10,activation=tf.nn.relu, input_dim = 2))
model.add(tf.keras.layers.Dense(1,activation=None))
model.compile(loss='mean_squared_error',optimizer=tf.keras.optimizers.Adam(0.1))
model.fit(dataxy,dataz,epochs=100,verbose=False)
if plot:
iter_max=10
x=y=np.arange(0,1+1/iter_max,1/iter_max)
Z=np.zeros((iter_max+1,iter_max+1))
for iter_i in x:
for iter_j in y:
ponto = [iter_i,iter_j]
[aux] = model.predict([ponto])
Z[int(iter_max*iter_i)][int(iter_max*iter_j)]=aux
X,Y = np.meshgrid(x,y)
Z=Z.reshape(iter_max+1,iter_max+1)
fig = plt.figure()
ax = fig.gca(projection='3d')
ax.scatter([dataxy[i][0] for i in range(0,len(dataxy))],
[dataxy[i][1] for i in range(0,len(dataxy))],
dataz, s=20, color='black')
ax.plot_surface(X,Y,Z, label="predictions")
return model.predict([prediction])
不同的是,我明确地说input_dim是2,而不是仅仅添加一个包含2个神经元的密集层。不过,需要对隐藏神经元的数量和学习率进行一些修补。
NN无法从您的数据中学习函数。有两个问题:
- 正如您在数据中看到的,两个相同的样本对应于两个不同的期望值
- 数据量不足以让模型学习
我建议先收集更多的数据,或者可以通过在输入中添加一个小的随机噪声来进行简单的数据扩充。