예제 #1
0
    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
예제 #2
0
    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()