ぱたへね

はてなダイアリーはrustの色分けができないのでこっちに来た

俺俺フレームワークでVGG16動いた

俺俺フレームワークでVGG16がちょっと動いた。の続き

計算結果が合わなかった理由が分かりました。

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に詳しくなった。