Will835 2021-11-12 09:50 采纳率: 0%
浏览 52
已结题

神经网络keras双输入双输出函数拟合问题

最近在学习用kerasd搭建神经网络,有一个简单的二输出二输入函数拟合问题:x1,x2在[-2,2]之间,y1是x1*exp(-x1^2-x2^2),y2是cos(x1^2+x2^2)/x2。结果就遇到了些问题,最后的模型预测结果直接是一个平面,找了好久也看不出来哪里的问题。训练数据集做了归一化处理,到[-1 1]之间。这个真的困扰了我好久,给同学看也没看出来哪里的问题。完整代码在后面,有多个绘图部分,都是检测数据集有效性用的。
我初学机器学习,这个问题本身难度不应该算大。希望同仁可以帮帮我,让我过了这个坎。(我可以私发我的训练集,其实很简单,但不知道怎么加上来)


训练集画出来的散点图 vs 模型测试结果画出来的散点图

img


代码中的模型本体部分

##load the dataset
dataset=loadtxt('Q2.csv',delimiter=',',dtype='float')

##split into input (x) and output(y) variables
x=dataset[0:2,:].T
y=dataset[2:4,:].T
(trainx,testx,trainy,testy)=train_test_split(x,y,test_size=0.05)
print(trainx)
epoch=999
l_r0=1e-2

##define the keras model
model = Sequential() 
regularizer=regularizers.l2(0.01)
initializer=initializers.TruncatedNormal(mean=0.0,stddev=0.5)

input_layer = Dense(units=160, kernel_regularizer=regularizer,input_shape=(2,),kernel_initializer=initializer,activation='tanh',
                    bias_initializer=initializers.Zeros(),name='input_layer')
model.add(input_layer) 

model.add(Dropout(0.5))

output_layer = Dense(units=2,kernel_regularizer=regularizer,kernel_initializer=initializer,activation='relu',
                     bias_initializer=initializers.Zeros(),name='output_layer') 
model.add(output_layer)

model.summary()

##compile the keras model
opt = tf.keras.optimizers.Adam(learning_rate=l_r0)
def root_mean_squared_error(y_true, y_pred):
        return k.sqrt(k.mean(k.square(y_pred - y_true))) 
    
model.compile(loss=root_mean_squared_error, optimizer=opt,metrics=['accuracy'])

#fit the keras model on the dataset
H=model.fit(trainx,trainy,validation_data=(testx,testy),epochs=epoch,batch_size=32)

完整代码


from numpy import loadtxt
from sklearn.preprocessing import LabelBinarizer
from sklearn.metrics import classification_report
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Dropout
from tensorflow.keras.optimizers import SGD
import keras.backend as k
import tensorflow as tf
from keras import initializers
from keras import regularizers
import random
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D

##load the dataset
dataset=loadtxt('Q2.csv',delimiter=',',dtype='float')

##split into input (x) and output(y) variables
x=dataset[0:2,:].T
y=dataset[2:4,:].T
(trainx,testx,trainy,testy)=train_test_split(x,y,test_size=0.05)
print(trainx)
epoch=999
l_r0=1e-2
#opt=SGD(learning_rate=l_r0)
#training set plot
trainy1=tf.slice(trainy,[0,0],[972,1])
trainy2=tf.slice(trainy,[0,1],[972,1])
trainx1=tf.slice(trainx,[0,0],[972,1])
trainx2=tf.slice(trainx,[0,1],[972,1])

testy1=tf.slice(testy,[0,0],[52,1])
testx1=tf.slice(testx,[0,0],[52,1])
testx2=tf.slice(testx,[0,1],[52,1])
testy2=tf.slice(testy,[0,1],[52,1])

figure=plt.figure(1)
ax = Axes3D(figure)
ax.scatter(trainx1,trainx2,trainy1,s=20)
plt.show()

figure=plt.figure(2)
ax = Axes3D(figure)
ax.scatter(trainx1,trainx2,trainy2,s=20)
ax.set_xlim(-1, 1)
ax.set_ylim(-1, 1)
ax.set_zlim(-1, 1)
plt.show()

figure=plt.figure(3)
ax = Axes3D(figure)
ax.scatter(testx1,testx2,testy1,s=20)
plt.show()

figure=plt.figure(3)
ax = Axes3D(figure)
ax.scatter(testx1,testx2,testy2,s=20)
plt.show()

##define the keras model
model = Sequential() 
regularizer=regularizers.l2(0.01)
initializer=initializers.TruncatedNormal(mean=0.0,stddev=0.5)

input_layer = Dense(units=160, kernel_regularizer=regularizer,input_shape=(2,),kernel_initializer=initializer,activation='tanh',
                    bias_initializer=initializers.Zeros(),name='input_layer')
model.add(input_layer) 

model.add(Dropout(0.5))

output_layer = Dense(units=2,kernel_regularizer=regularizer,kernel_initializer=initializer,activation='relu',
                     bias_initializer=initializers.Zeros(),name='output_layer') 
model.add(output_layer)

model.summary()

##compile the keras model
opt = tf.keras.optimizers.Adam(learning_rate=l_r0)
def root_mean_squared_error(y_true, y_pred):
        return k.sqrt(k.mean(k.square(y_pred - y_true))) 
    
model.compile(loss=root_mean_squared_error, optimizer=opt,metrics=['accuracy'])

#fit the keras model on the dataset
H=model.fit(trainx,trainy,validation_data=(testx,testy),epochs=epoch,batch_size=32)

##loss graph
N=np.arange(0,epoch)
plt.style.use("ggplot")
plt.figure(1)
plt.plot(N,H.history["loss"],label="train_loss")
plt.title("train_loss")
plt.figure(2)
plt.plot(N,H.history["val_loss"],label="val_loss")
plt.title("val_loss")
plt.figure(3)
plt.plot(N,H.history["accuracy"],label="train_accuracy")
plt.title("train_accuracy")
plt.figure(4)
plt.plot(N,H.history["val_accuracy"],label="val_accuracy")
plt.title("val_accuracy")
plt.ylabel("Loss/Accuracy")
plt.legend()

#predict plot vs train set plot
predict = model.predict(x)
predicty1=tf.slice(predict,[0,0],[1024,1])
predicty2=tf.slice(predict,[0,1],[1024,1])
predictx1=tf.slice(x,[0,0],[1024,1])
predictx2=tf.slice(x,[0,1],[1024,1])
figure=plt.figure(1)
ax = Axes3D(figure)
ax.scatter(trainx1,trainx2,trainy1,s=20)
plt.show()

figure=plt.figure(2)
ax = Axes3D(figure)
ax.scatter(predictx1,predictx2,predicty1,s=20)
plt.show()

figure=plt.figure(2)
ax = Axes3D(figure)
ax.scatter(trainx1,trainx2,trainy2,s=20)
ax.set_xlim(-1, 1)
ax.set_ylim(-1, 1)
ax.set_zlim(-1, 1)
plt.show()

figure=plt.figure(4)
ax = Axes3D(figure)
ax.scatter(predictx1,predictx2,predicty2,s=20)
ax.set_xlim(-1, 1)
ax.set_ylim(-1, 1)
ax.set_zlim(-5, 5)
plt.show()
  • 写回答

1条回答 默认 最新

  • 有问必答小助手 2021-11-15 10:34
    关注

    你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,技术专家团超时未为您做出解答


    本次提问扣除的有问必答次数,将会以问答VIP体验卡(1次有问必答机会、商城购买实体图书享受95折优惠)的形式为您补发到账户。


    因为有问必答VIP体验卡有效期仅有1天,您在需要使用的时候【私信】联系我,我会为您补发。

    评论

报告相同问题?

问题事件

  • 系统已结题 11月20日
  • 创建了问题 11月12日

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题