2017-08-06 7 views
0

私は最近、機械学習を研究しています。だからケラスやテンソルフロー(ケラスを使わない)でいくつかのcnnモデルを作ってスキルを鍛える。しかし、kerasとtensorflowの結果は同じではありません。それは非常に混乱しています。CNNの結果はケラスとテンソルの流れが異なります

keras結果は68%とtensorflowあり、ここで66.6パーセント

はtensorflowコードです:

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 

損失と精度がで構成されています

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)) 

私はいくつかを作りました間違い? 多くのありがとうございます。

答えて

0

あなたのコードにドロップアウト層がある可能性があります。ランダムに層出力をサンプリングし、テンソルフローコードを2回再実行しようとすると、別の結果も得られます。

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

再実行を取得するためにsoftmaxを使用してnoptあるようだが、結果は(データセットが大きいので、それが動作)とほぼ同じです。しかし、私はドロップアウト層がランダムに層出力に何らかの問題を引き起こすかもしれないことに同意します。だから私はそれを確認します。ありがとう! –

+0

私はドロップアウト層は問題ではないと思う –

0

それはあなたが確率

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を使用していないという意味ですか? 。私は 'loss' name scopeにsoftmaxを使用します。 –

+0

私はこのコードを書いていません:prob = self.convolution(inputs)。しかし、とにかく私はsoftmaxを使用しています –

関連する問題