Тензор потока сердечных сокращений, как график затрат. Не сходится - PullRequest
0 голосов
/ 02 апреля 2020

Я пытался создать модель ранжирования на основе CNN. Ниже приведена общая структура моей модели.

Общая структура

Проверено, что все графики и градиенты хорошо связаны, но модель не обучается должным образом ... Особенно график затрат кажется странным. Это взорвалось каждую эпоху, как показано ниже. Кто-нибудь знает, почему он это делает и как решить эту проблему?

Стоимость за эпоху

Стоимость по времени

К вашему сведению, это мой код. Версия Tensorflow 1.14.

import tensorflow as tf

class cnn:
    def __init__(self,maxq,maxa,embedim=300,epoch=10,lr=0.01):
        self.epoch=epoch
        self.graph = tf.Graph()
        best_fsize=4

        with self.graph.as_default():
            # Q: [?,150,300,1]
            # A: [?,300,300,1]
            self.Q = tf.placeholder("float",[None,maxq,embedim,1],name="BR")
            self.A = tf.placeholder("float",[None,maxa,embedim,1],name="SF")
            self.Y = tf.placeholder("float",[None,1],name="Y")  # 0 or 1
            #---------------------QueryCNN---------------------------------------------#
            # Query feature extraction
            fsize=best_fsize
            self.QCW1 = tf.Variable(tf.truncated_normal([fsize,embedim,1,100],stddev=0.1),name='QCW1')
            QC1 = tf.nn.conv2d(self.Q,self.QCW1,strides=[1,1,1,1],padding='VALID',name='QC1')
            QC1 = tf.nn.relu(QC1)
            QC1 = tf.nn.max_pool(QC1, ksize=[1,maxq-fsize+1,1,1],strides=[1,1,1,1],
                                padding='VALID',name='maxpool_QC1')
            FQ = tf.reshape(QC1,[-1,1,100,1])
            #---------------------AnswerCNN---------------------------------------------#
            # Answer feature extraction
            fsize=best_fsize
            ACW1 = tf.Variable(tf.truncated_normal([fsize,embedim,1,100],stddev=0.1),name='ACW1')
            AC1 = tf.nn.conv2d(self.A,ACW1,strides=[1,1,1,1],padding='VALID',name='AC1')
            AC1 = tf.nn.relu(AC1)
            AC1 = tf.nn.max_pool(AC1, ksize=[1,maxa-fsize+1,1,1],strides=[1,1,1,1],
                                padding='VALID',name='maxpool_AC1')

            FA = tf.reshape(AC1,[-1,1,100,1])
            #---------------------FeatureExtractionCNN---------------------------------#
            # combined feature extraction
            IN=tf.concat([FQ,FA],1)            
            CW1 = tf.Variable(tf.truncated_normal([2,2,1,100],stddev=0.1),name='CW1')
            C1 = tf.nn.conv2d(IN,CW1,strides=[1,1,1,1],padding='SAME',name='C1')
            C1 = tf.nn.max_pool(C1, ksize=[1,2,100,1],strides=[1,1,1,1],
                                 padding='VALID',name='maxppol_C1')
            #--------------------FCN-----------------------------------------------#
            # Input shape: [?,100], Output shape: [?,1]
            innode = int(C1.shape[3])
            hnode = innode
            outnode = 1
            FIN = tf.reshape(C1,[-1,innode])
            W1 = tf.Variable(tf.random_uniform([innode,hnode],-1.,1.),name="W1")
            b1 = tf.Variable(tf.zeros([innode]),name="b1")
            W2 = tf.Variable(tf.random_uniform([hnode,outnode],-1.,1.),name="W2")
            b2 = tf.Variable(tf.zeros([outnode]),name="b2")
            L1 = tf.add(tf.matmul(FIN,W1),b1)
            L1 = tf.nn.relu(L1)

            # use self.model as score for ranking
            self.model = tf.add(tf.matmul(L1,W2),b2,'model_result') 
            self.distribution=tf.nn.sigmoid(self.model)

            weight=tf.constant([1.0])
            self.cost=tf.reduce_mean(tf.nn.weighted_cross_entropy_with_logits(
                    labels=self.Y,logits=self.model,pos_weight=weight),name='cost')

            self.optimizer = tf.train.AdamOptimizer(learning_rate=0.01)
            self.train_op = self.optimizer.minimize(self.cost)

            with tf.name_scope('predict') as scope:
                self.prediction = tf.argmax(self.model,1,name='predict')

            init = tf.global_variables_initializer()            
            self.sess = tf.Session()
            self.sess.run(init)
            self.saver = tf.train.Saver()
    def train(self,labels,brs,sfs,name,epoch,save):
        s,_,c = self.sess.run([self.summary_op,self.train_op,self.cost], 
                                feed_dict={self.BR:brs,self.SF:sfs,self.Y:labels})
        self.tw.add_summary(s,global_step=epoch) 

        # Saving model every epoch at last batch
        if save:
            file_path = '.\\FCN\\'+name+'\\'
            name=file_path+'model'
            if not os.path.exists(file_path):
                os.mkdir(file_path)
            self.saver.save(self.sess, name)
            print(name, 'Training Done, Model Saved')
        return c
...