Я пытался создать модель ранжирования на основе 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