2017-08-28 26 views
0

現在、KerasとTensorflowの両方でいくつかの作業をしようとしていますが、わたしは理解できない小さな事を見つけました。以下のコードを見ると、Tensorflowセッションを明示的に使用するか、predict_on_batch関数モデルを使用してネットワークの応答を予測しようとしています。KerasとTensorflowの結果が異なる理由を理解する

import os 
import keras 
import numpy as np 
import tensorflow as tf 
from keras import backend as K 
from keras.layers import Dense, Dropout, Flatten, Input 
from keras.models import Model 

# Try to standardize output 
np.random.seed(1) 
tf.set_random_seed(1) 

# Building the model 
inputs = Input(shape=(224,224,3)) 
base_model = keras.applications.vgg16.VGG16(include_top=True, weights='imagenet', \ 
            input_tensor=inputs, input_shape=(224, 224, 3)) 
x = base_model.get_layer("fc2").output 
x = Dropout(0.5, name='model_fc_dropout')(x) 
x = Dense(2048, activation='sigmoid', name='final_fc')(x) 
x = Dropout(0.5, name='final_fc_dropout')(x) 
predictions = Dense(1, activation='sigmoid', name='fcout')(x) 
model = Model(outputs=predictions, inputs=inputs) 

################################################################## 
model.compile(loss='binary_crossentropy', 
      optimizer=tf.train.MomentumOptimizer(learning_rate=5e-4, momentum=0.9), 
      metrics=['accuracy']) 

image_batch = np.random.random((64,224,224,3)) 

# Outputs predicted by TF 
outs = [predictions] 
feed_dict={inputs:image_batch, K.learning_phase():0} 

init_op = tf.global_variables_initializer() 
with tf.Session() as sess: 
    sess.run(init_op) 

    outputs = sess.run(outs, feed_dict)[0] 
    print outputs.flatten() 

# Outputs predicted by Keras 
outputs = model.predict_on_batch(image_batch) 
print outputs.flatten() 

私の問題は、私は1種を設定し、CPU上で操作を実行することにより、ランダム性のソースのいずれかの種類を削除しようとしたにも関わらず、私は2つの異なる結果を得たことです。それでも、私は次のような結果を得る:

[ 0.26079229 0.26078743 0.26079154 0.26079673 0.26078942 0.26079443 
    0.26078886 0.26079088 0.26078972 0.26078728 0.26079121 0.26079452 
    0.26078513 0.26078424 0.26079014 0.26079312 0.26079521 0.26078743 
    0.26078558 0.26078537 0.26078674 0.26079136 0.26078632 0.26077667 
    0.26079312 0.26078999 0.26079065 0.26078704 0.26078928 0.26078624 
    0.26078892 0.26079202 0.26079065 0.26078689 0.26078963 0.26078749 
    0.26078817 0.2607986 0.26078528 0.26078412 0.26079187 0.26079246 
    0.26079226 0.26078457 0.26078099 0.26078072 0.26078376 0.26078475 
    0.26078326 0.26079389 0.26079792 0.26078579 0.2607882 0.2607961 
    0.26079237 0.26078218 0.26078638 0.26079753 0.2607787 0.26078618 
    0.26078096 0.26078594 0.26078215 0.26079002] 

[ 0.25331706 0.25228402 0.2534174 0.25033095 0.24851511 0.25099936 
    0.25240892 0.25139931 0.24948661 0.25183493 0.25104815 0.25164133 
    0.25214729 0.25265765 0.25128496 0.25249782 0.25247478 0.25314394 
    0.25014618 0.25280923 0.2526398 0.25381723 0.25138992 0.25072744 
    0.25069866 0.25307226 0.25063521 0.25133523 0.25050756 0.2536433 
    0.25164688 0.25054023 0.25117773 0.25352773 0.25157067 0.25173825 
    0.25234801 0.25182116 0.25284401 0.25297374 0.25079012 0.25146705 
    0.25401884 0.25111189 0.25192681 0.25252578 0.25039044 0.2525287 
    0.25165257 0.25357804 0.25001243 0.2495154 0.2531895 0.25270832 
    0.25305843 0.25064403 0.25180396 0.25231308 0.25224048 0.25068772 
    0.25212681 0.24812476 0.25027585 0.25243458] 

を誰もが結果を変えることができる、バックグラウンドで起こって何ができるかのアイデアを持っていますか? (これらの結果は、それらを再び実行すると変化しない)

ネットワークがGPU(Titan X)上で動作する場合、その差はさらに大きくなります。第二の出力は、次のとおり

[ 0.3302682 0.33054096 0.32677746 0.32830611 0.32972822 0.32807562 
    0.32850873 0.33161065 0.33009702 0.32811245 0.3285495 0.32966742 
    0.33050382 0.33156893 0.3300975 0.3298254 0.33350074 0.32991216 
    0.32990077 0.33203539 0.32692945 0.33036903 0.33102706 0.32648 
    0.32933888 0.33161271 0.32976636 0.33252293 0.32859167 0.33013415 
    0.33080408 0.33102706 0.32994759 0.33150592 0.32881773 0.33048317 
    0.33040857 0.32924038 0.32986534 0.33131596 0.3282761 0.3292698 
    0.32879189 0.33186096 0.32862625 0.33067161 0.329018 0.33022234 
    0.32904804 0.32891914 0.33122411 0.32900628 0.33088413 0.32931429 
    0.3268061 0.32924181 0.32940546 0.32860965 0.32828435 0.3310211 
    0.33098024 0.32997403 0.33025959 0.33133432] 

最初のもので、差が5後者小数点でのみ起こるのに対し:initializationsが異なるよう

[ 0.26075357 0.26074868 0.26074538 0.26075155 0.260755 0.26073951 
    0.26074919 0.26073971 0.26074231 0.26075247 0.2607362 0.26075858 
    0.26074955 0.26074123 0.26074299 0.26074946 0.26074076 0.26075014 
    0.26074076 0.26075229 0.26075041 0.26074776 0.26075897 0.26073995 
    0.260746 0.26074466 0.26073912 0.26075709 0.26075712 0.26073799 
    0.2607322 0.26075566 0.26075059 0.26073873 0.26074558 0.26074558 
    0.26074359 0.26073721 0.26074392 0.26074731 0.26074862 0.26074174 
    0.26074126 0.26074588 0.26073804 0.26074919 0.26074269 0.26074606 
    0.26075307 0.2607446 0.26074025 0.26074648 0.26074952 0.26073608 
    0.26073566 0.26073873 0.26074576 0.26074475 0.26074636 0.26073411 
    0.2607542 0.26074755 0.2607449 0.2607407 ] 

答えて

1

ここで結果が異なります。

Tfは変数の初期化にthis init_opを使用します。

sess.run(init_op) 

しかしKerasは、あなたのコードで定義されてinit_op、そのモデルクラス内init_op独自のを使用していますありません。

関連する問題