def __init__(self, rateTrain=0.0, lr=1e-3, index=0, size=0, dataMode='test'): # parameter ---- if dataMode == 'large': self.xDim = 20 self.yDim = 20 elif dataMode == 'middle': self.xDim = 15 self.yDim = 15 elif dataMode == 'small': self.xDim = 10 self.yDim = 10 self.tDim = 71 self.index = index self.paramDim = 2 # ---- # Dataset ---- self.myData = burgers2Ddata.Data(pdeMode='burgers2d', dataMode=dataMode) self.alltestX, self.alltestY, self.testT, self.testX, self.testY, self.testU, self.testV, self.testNU, self.idx, self.idy = self.myData.traintest( size=size) # ---- # Placeholder ---- # u self.inobsu = tf.compat.v1.placeholder( tf.float32, shape=[None, self.xDim, self.yDim, 1]) self.inobsv = tf.compat.v1.placeholder( tf.float32, shape=[None, self.xDim, self.yDim, 1]) self.inobs = tf.concat([self.inobsu, self.inobsv], -1) self.outobsu = tf.compat.v1.placeholder( tf.float64, shape=[None, self.xDim, self.yDim, self.tDim]) self.outobsv = tf.compat.v1.placeholder( tf.float64, shape=[None, self.xDim, self.yDim, self.tDim]) self.initu = tf.compat.v1.placeholder( tf.float64, shape=[None, self.alltestX.shape[0], self.alltestY.shape[0], 1]) self.initv = tf.compat.v1.placeholder( tf.float64, shape=[None, self.alltestX.shape[0], self.alltestY.shape[0], 1]) # param nu self.y = tf.compat.v1.placeholder(tf.float32, shape=[None, self.paramDim]) # ---- #pdb.set_trace() # Restore neural network ---- # pred nu [ndata,] self.predparam = self.lambdaNN(self.inobs) # ---- # for predparam self.placeparam = tf.compat.v1.placeholder(tf.float64, shape=[None, self.paramDim]) # optimizer ---- config = tf.compat.v1.ConfigProto(gpu_options=tf.compat.v1.GPUOptions( per_process_gpu_memory_fraction=0.1, allow_growth=True)) self.saver = tf.compat.v1.train.Saver() self.sess = tf.compat.v1.Session(config=config) # ---- #pdb.set_trace() # Restore model ---- ckptpath = os.path.join('model', f'{dataMode}burgers2d_d{size}') ckpt = tf.train.get_checkpoint_state(ckptpath) lastmodel = ckpt.model_checkpoint_path self.saver.restore(self.sess, lastmodel) print('>>> Restore train model') # ---- # float32 -> float64 self.predparam = tf.cast(self.predparam, tf.float64) # for predparam self.placeparam = tf.compat.v1.placeholder(tf.float64, shape=[None, self.paramDim]) # PDE ---- # output: u,v self.preduv = pdeburgers2D.burgers2d(self.placeparam[:, None, 0], self.placeparam[:, None, 1], self.initu, self.initv) self.preduv_first = pdeburgers2D.burgers2d(self.predparam[:, None, 0], self.predparam[:, None, 1], self.initu, self.initv) # ---- #pdb.set_trace() # space data -> [none, self.xDim, t] ---- self.indx = tf.compat.v1.placeholder(tf.int32, shape=[self.xDim, 1]) self.indy = tf.compat.v1.placeholder(tf.int32, shape=[self.yDim, 1]) # [x,data,y,t] trans_predu = tf.transpose(self.preduv[0], perm=[1, 0, 2, 3]) trans_predu_first = tf.transpose(self.preduv_first[0], perm=[1, 0, 2, 3]) trans_predv = tf.transpose(self.preduv[1], perm=[1, 0, 2, 3]) trans_predv_first = tf.transpose(self.preduv_first[1], perm=[1, 0, 2, 3]) # [100(x),data,y,t] gather_predu = tf.gather_nd(trans_predu, self.indx) gather_predu_first = tf.gather_nd(trans_predu_first, self.indx) gather_predv = tf.gather_nd(trans_predv, self.indx) gather_predv_first = tf.gather_nd(trans_predv_first, self.indx) # for v trans_predu_ = tf.transpose(gather_predu, perm=[2, 1, 0, 3]) trans_predu_first_ = tf.transpose(gather_predu_first, perm=[2, 1, 0, 3]) trans_predv_ = tf.transpose(gather_predv, perm=[2, 1, 0, 3]) trans_predv_first_ = tf.transpose(gather_predv_first, perm=[2, 1, 0, 3]) gather_predu_ = tf.gather_nd(trans_predu_, self.indy) gather_predu_first_ = tf.gather_nd(trans_predu_first_, self.indy) gather_predv_ = tf.gather_nd(trans_predv_, self.indy) gather_predv_first_ = tf.gather_nd(trans_predv_first_, self.indy) # [data,self.xDim,t] trans_u = tf.transpose(gather_predu_, perm=[1, 0, 2, 3]) trans_u_first = tf.transpose(gather_predu_first_, perm=[1, 0, 2, 3]) trans_v = tf.transpose(gather_predv_, perm=[1, 0, 2, 3]) trans_v_first = tf.transpose(gather_predv_first_, perm=[1, 0, 2, 3]) space_predu = tf.transpose(trans_u, perm=[0, 2, 1, 3]) space_predu_first = tf.transpose(trans_u_first, perm=[0, 2, 1, 3]) space_predv = tf.transpose(trans_v, perm=[0, 2, 1, 3]) space_predv_first = tf.transpose(trans_v_first, perm=[0, 2, 1, 3]) # ---- #pdb.set_trace() # loss param ---- self.loss1 = tf.reduce_mean( tf.square( tf.cast(self.y[:, 0], tf.float64) - self.placeparam[:, 0])) self.loss2 = tf.reduce_mean( tf.square( tf.cast(self.y[:, 1], tf.float64) - self.placeparam[:, 1])) self.loss1_first = tf.reduce_mean( tf.square( tf.cast(self.y[:, 0], tf.float64) - self.predparam[:, 0])) self.loss2_first = tf.reduce_mean( tf.square( tf.cast(self.y[:, 1], tf.float64) - self.predparam[:, 1])) # ---- # loss uv ---- self.lossu = tf.reduce_mean(tf.square(self.outobsu - space_predu)) self.lossu_first = tf.reduce_mean( tf.square(self.outobsu - space_predu_first)) self.lossv = tf.reduce_mean(tf.square(self.outobsv - space_predv)) self.lossv_first = tf.reduce_mean( tf.square(self.outobsv - space_predv_first)) # loss uv ---- self.lossuv = self.lossu + self.lossv self.lossuv_first = self.lossu_first + self.lossv_first # ---- # gradient ---- self.alpha = tf.compat.v1.placeholder(tf.float64, shape=[1]) self.grad = tf.gradients(self.lossuv, self.placeparam)[0] # only lambda2 self.grad_lambda2 = tf.gradients(self.lossuv, self.placeparam)[0][:, 1] self.grad_first = tf.gradients( self.lossuv_first, self.predparam)[0] # for first time(use predict parameter) #pdb.set_trace() self.nextparam1 = self.placeparam[:, 0] - (tf.reduce_sum(self.grad) * self.alpha) self.nextparam2 = self.placeparam[:, 1] - (tf.reduce_sum(self.grad) * self.alpha) self.nextparam_lambda2 = self.placeparam[:, 1] - (self.grad_lambda2 * self.alpha) self.nextparam1_first = self.predparam[:, 0] - ( tf.reduce_sum(self.grad_first) * self.alpha) # for first time self.nextparam2_first = self.predparam[:, 1] - ( tf.reduce_sum(self.grad_first) * self.alpha) # for first time
def __init__(self, rateTrain=0.0, lr=1e-3, nBatch=100, trialID=0, size=0, dataMode='test'): # parameter ---- if dataMode == 'large': self.xDim = 20 self.yDim = 20 elif dataMode == 'middle': self.xDim = 15 self.yDim = 15 elif dataMode == 'small': self.xDim = 10 self.yDim = 10 self.tDim = 71 self.nBatch = nBatch self.trialID = trialID self.lambdaDim = 2 self.size = size # ---- # for plot self.myPlot = burgers2Dplot.Plot(dataMode=dataMode, trialID=trialID) # Dataset ---- self.myData = burgers2Ddata.Data(pdeMode='burgers2d', dataMode=dataMode) # all x,y[51,1] t[201,1] & x,y,t[xdim or ydim,1] u,v[data,xdim,ydim,tdim] nu[data,] self.alltestX, self.alltestY, self.testT, self.testX, self.testY, self.testU, self.testV, self.testNU, self.idx, self.idy = self.myData.traintest( size=size) #pdb.set_trace() # ---- # Placeholder ---- # input u, v (one time) [xdim, ydim, t1] self.inobsu = tf.compat.v1.placeholder( tf.float32, shape=[None, self.xDim, self.yDim, self.tDim]) self.inobsv = tf.compat.v1.placeholder( tf.float32, shape=[None, self.xDim, self.yDim, self.tDim]) self.inobs = tf.concat([self.inobsu, self.inobsv], -1) # output param b self.y = tf.compat.v1.placeholder(tf.float32, shape=[None, self.lambdaDim]) # ---- # neural network ---- self.predy = self.lambdaNN(self.inobs, rate=rateTrain) self.predy_test = self.lambdaNN(self.inobs, reuse=True) # ---- # loss ---- # param loss self.loss1 = tf.reduce_mean(tf.square(self.y[:, 0] - self.predy[:, 0])) self.loss2 = tf.reduce_mean(tf.square(self.y[:, 1] - self.predy[:, 1])) self.loss1_test = tf.reduce_mean( tf.square(self.y[:, 0] - self.predy_test[:, 0])) self.loss2_test = tf.reduce_mean( tf.square(self.y[:, 1] - self.predy_test[:, 1])) # ---- self.loss = self.loss1 + self.loss2 # Optimizer ---- self.opt = tf.compat.v1.train.AdamOptimizer(lr).minimize(self.loss) # ---- # ---- config = tf.compat.v1.ConfigProto(gpu_options=tf.compat.v1.GPUOptions( per_process_gpu_memory_fraction=0.1, allow_growth=True)) self.sess = tf.compat.v1.Session(config=config) self.sess.run(tf.compat.v1.global_variables_initializer()) self.saver = tf.compat.v1.train.Saver()