2016-07-13 12 views
1

私はthisに従って、事前に訓練されたVGGモデルをロードして実行しました。しかし、私は隠れたレイヤーからフィーチャマップを抽出し、 "任意のフィーチャマップの抽出"セクションhereの結果を複製しようとしていました。私のコードは次のとおりです。しかし、私はこのエラーを取得したKeras訓練されたVGGエラー

#!/usr/bin/python 

import matplotlib.pyplot as plt 
import theano 
from scipy import misc 
from PIL import Image 
import PIL.ImageOps 
from keras.models import Sequential 
from keras.layers.core import Flatten, Dense, Dropout 
from keras.layers.convolutional import Convolution2D, MaxPooling2D, ZeroPadding2D 
from keras.optimizers import SGD 
import numpy as np 
from keras import backend as K 

def get_features(model, layer, X_batch): 
    get_features = K.function([model.layers[0].input, K.learning_phase()], [model.layers[layer].output,]) 
    features = get_features([X_batch,0]) 
    return features 

def VGG_16(weights_path=None): 
    model = Sequential() 
    model.add(ZeroPadding2D((1,1),input_shape=(3,224,224))) 
    model.add(Convolution2D(64, 3, 3, activation='relu')) 
    model.add(ZeroPadding2D((1,1))) 
    model.add(Convolution2D(64, 3, 3, activation='relu')) 
    model.add(MaxPooling2D((2,2), strides=(2,2))) 

    model.add(ZeroPadding2D((1,1))) 
    model.add(Convolution2D(128, 3, 3, activation='relu')) 
    model.add(ZeroPadding2D((1,1))) 
    model.add(Convolution2D(128, 3, 3, activation='relu')) 
    model.add(MaxPooling2D((2,2), strides=(2,2))) 

    model.add(ZeroPadding2D((1,1))) 
    model.add(Convolution2D(256, 3, 3, activation='relu')) 
    model.add(ZeroPadding2D((1,1))) 
    model.add(Convolution2D(256, 3, 3, activation='relu')) 
    model.add(ZeroPadding2D((1,1))) 
    model.add(Convolution2D(256, 3, 3, activation='relu')) 
    model.add(MaxPooling2D((2,2), strides=(2,2))) 

    model.add(ZeroPadding2D((1,1))) 
    model.add(Convolution2D(512, 3, 3, activation='relu')) 
    model.add(ZeroPadding2D((1,1))) 
    model.add(Convolution2D(512, 3, 3, activation='relu')) 
    model.add(ZeroPadding2D((1,1))) 
    model.add(Convolution2D(512, 3, 3, activation='relu')) 
    model.add(MaxPooling2D((2,2), strides=(2,2))) 

    model.add(ZeroPadding2D((1,1))) 
    model.add(Convolution2D(512, 3, 3, activation='relu')) 
    model.add(ZeroPadding2D((1,1))) 
    model.add(Convolution2D(512, 3, 3, activation='relu')) 
    model.add(ZeroPadding2D((1,1))) 
    model.add(Convolution2D(512, 3, 3, activation='relu')) 
    model.add(MaxPooling2D((2,2), strides=(2,2))) 

    model.add(Flatten()) 
    model.add(Dense(4096, activation='relu')) 
    model.add(Dropout(0.5)) 
    model.add(Dense(4096, activation='relu')) 
    model.add(Dropout(0.5)) 
    model.add(Dense(1000, activation='softmax')) 

    if weights_path: 
     model.load_weights("/home/srilatha/Desktop/Research_intern/vgg16_weights.h5") 

    return model 

if __name__ == "__main__": 
    #f="/home/srilatha/Desktop/Research_intern/Data_sets/Data_set_2/FGNET/male/007A23.JPG" 
    f="/home/srilatha/Desktop/Research_intern/Data_sets/Cropped_data_set/1/7.JPG" 
    image = Image.open(f) 
    new_width = 224 
    new_height = 224 
    im = image.resize((new_width, new_height), Image.ANTIALIAS) 
    im=np.array(im) 
    im=np.tile(im[:,:,None],(1,1,3)) 
    #imRGB = np.repeat(im[:, :, np.newaxis], 3, axis=2) 
    print(im) 
    #print(type(im)) 
    im = im.transpose((2,0,1)) 
    im = np.expand_dims(im, axis=0) 


    # Test pretrained model 
    model = VGG_16('/home/srilatha/Desktop/Research_intern/vgg16_weights.h5') 
    sgd = SGD(lr=0.1, decay=1e-6, momentum=0.9, nesterov=True) 
    model.compile(optimizer=sgd, loss='categorical_crossentropy') 
    out = model.predict(im) 
    #get_feature = theano.function([model.layers[0].input], model.layers[3].get_output(train=False), allow_input_downcast=False) 
    #feat = get_feature(im) 
    #get_activations = theano.function([model.layers[0].input], model.layers[1].get_output(train=False), allow_input_downcast=True) 
    #activations = get_activations(model, 1, im) 
    #plt.imshow(activations) 
    #plt.imshow(im) 
    features=get_features(model,15,im) 
    plt.imshow(features[0][13]) 
    #out = model.predict(im) 
    #plt.plot(out.ravel()) 
    #plt.show() 
    print np.argmax(out) 

File "VGG_Keras.py", line 98, in <module> 
    plt.imshow(features[0][13]) 
IndexError: index 13 is out of bounds for axis 0 with size 1 

が、私はこれをどのように修正することができますか?

答えて

1

まず、次回は、より洗練されたバージョンのコードを更新して、他の人があなたをより簡単に支援できるようにします。

第二に、デバッグにあなたの関数を変更します。

def get_features(model, layer, X_batch): 
    print model.layers[layer] 
    print model.layers[layer].output_shape 
    get_features = K.function([model.layers[0].input, K.learning_phase()], [model.layers[layer].output,]) 
    features = get_features([X_batch,0]) 
    print features.shape 
    return features 

あなたはfeaturesが実際にlistであることがわかります:K.function

  1. 出力、すなわち、get_features[model.layers[layer].output,]の結果である、リストです。
  2. get_features[0]従ってmodel.layers[layer].output
  3. get_features[0][0]
  4. (1, 256, 56, 56)==>(batch_size, channel, W, H)形状であるが、バッチ内の最初の画像の特徴です。
  5. 私はあなたが探しているものはget_features[0][0][13]と信じています。
関連する問題