計算結果が合わなかった理由が分かりました。
Kerasに入力させるために画像を読み込んでいるところ。これでxに入力データが入ります。
img = image.load_img(img_file, target_size=(224, 224)) x = image.img_to_array(img) x = np.expand_dims(x, axis=0)
識別のコードがこう。サンプルのまま。
preds = model.predict(preprocess_input[x]) results = decode_predictions(preds, top=5)[0]
一層ずつ確認しているコードがこう。
# 出力するレイヤーを選択 l = 0 get_layer_output = K.function([model.layers[0].input, K.learning_phase()], [model.layers[l].output]) layer_output = get_layer_output([x, 0])
良く見ると、識別時にはpreprocess_inputを通っていて、一層ずつ確認しているところは通ってない。全体を見ているコードと、一層ずつ確認しているコードでは入力データが違っていたのが原因でした。ここを修正すれば、Kerasの出力と一致しています。
ちなみに、preprocess_inputが前回はまったVGGの入力で一律に平均値を引いている処理です。
その処理が入ってるKerasのソースはここ。
https://github.com/fchollet/keras/blob/master/keras/applications/imagenet_utils.py
ちょっとkerasとVGG16に詳しくなった。