2017-08-06 39 views
0

我最近正在学习机器学习。所以我在keras和张量流(不使用keras)来制作一些cnn模型来练习技巧。但是由keras和tensorflow导致的cnn结果并不相同。这很混乱。CNN结果在keras和tensorflow中是不同的

的keras结果是68%和tensorflow为66.6%

这里是tensorflow代码:

with tf.name_scope('loss'): 
     cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=prob, labels=self.y)) 

    with tf.name_scope('train'): 
     global_step = tf.Variable(0, name="tr_global_step", trainable=False) 
     optimizer = tf.train.AdadeltaOptimizer(learning_rate=self.learning_rate).minimize(cost, global_step=global_step) 

    with tf.name_scope('predict'): 
     correct_pred = tf.equal(tf.argmax(prob, 1), tf.argmax(self.y, 1)) 
     # accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32)) 
     accuracy = tf.reduce_sum(tf.cast(correct_pred, tf.int32)) 

我都做了一些:

def convolution(self, inputs_fw): 

    inputs_fw = tf.nn.dropout(inputs_fw, keep_prob=self.dropout_keep_prob) 

    with tf.name_scope('forward_conv'): 
     fil1 = 2 
     fil2 = 3 

     conv1_fw = tf.layers.conv1d(inputs_fw,filters=100,kernel_size=fil1,padding="VALID",activation=tf.nn.tanh)#tanh 
     print "print conv1" 
     print conv1_fw 
     conv1_fw = conv1_fw + self.cbiases['convolution1'] 
     pool_fw = tf.layers.max_pooling1d(inputs=conv1_fw,pool_size=self.max_sentence_len-fil1+1,strides=self.max_sentence_len-fil1+1) 
     print pool_fw 

     pool_fw_flat =tf.reshape(pool_fw, [-1,1*100]) 

     conv1_fw2 = tf.layers.conv1d(inputs_fw,filters=100,kernel_size=fil2,padding="VALID",activation=tf.nn.tanh)#tanh 
     print "print conv12" 
     conv1_fw2 = conv1_fw2 + self.cbiases['convolution2'] 
     print conv1_fw2 
     pool_fw2 = tf.layers.max_pooling1d(inputs=conv1_fw2,pool_size=self.max_sentence_len-fil2+1,strides=self.max_sentence_len-fil2+1) 
     print pool_fw2 

     pool_fw_flat2 =tf.reshape(pool_fw2, [-1,1*100]) 


    output = tf.concat([pool_fw_flat,pool_fw_flat2],1) 

    predict = tf.matmul(output, self.weights['softmax_conv']) + self.biases['softmax_conv'] 

    print predict.get_shape() 
    return predict 

损失和准确性由制造错误? 非常感谢。

回答

0

原因可能是代码中的dropout层,它会随机采样图层输出,尝试重新运行tensorflow代码两次,您也会得到不同的结果。

inputs_fw = tf.nn.dropout(inputs_fw, keep_prob=self.dropout_keep_prob) 
+0

重新运行,其结果几乎是相同的(数据集大,所以它的工作原理)。但我同意dropout层可能会引发一些问题随机分层输出。所以我会检查一下。谢谢! –

+0

我认为dropout层不是问题 –

0

看来你是用n工作来softmax获得概率

logits = tf.matmul(output, self.weights['softmax_conv']) + self.biases['softmax_conv'] 
predict = tf.nn.softmax(tf.matmul(output, self.weights['softmax_conv']) + self.biases['softmax_conv']) 
# is training True/False 
inputs_fw = tf.nn.dropout(inputs_fw, keep_prob=self.dropout_keep_prob, is_training=is_training) 
+0

意味着我不使用softmax? 。我在“损失”名称范围中使用softmax –

+0

sry我不写这段代码:prob = self.convolution(inputs)。但无论如何,我使用softmax –