2017-05-22 11 views
0

VGG 16ではKerasを使用しています。 :ターゲットチェックするときターゲットをチェックするときにエラーが発生しました:dense_20がシェイプ(なし、3)を持つと予想されましたが、シェイプ(1200,1)の配列を持っていました

エラー:

import numpy as np 
from keras.preprocessing.image import ImageDataGenerator 
from keras.models import Sequential 
from keras.layers import Dropout, Flatten, Dense 
from keras import applications 
from keras.optimizers import SGD 
from keras import backend as K 
K.set_image_dim_ordering('tf') 
img_width, img_height = 48, 48 
top_model_weights_path = 'vgg16_1.h5' 
train_data_dir = 'data6/train' 
validation_data_dir = 'data6/validation' 
nb_train_samples = 400 
nb_validation_samples = 100 
epochs = 10 
batch_size = 32 
def save_bottlebeck_features(): 
    datagen = ImageDataGenerator(rescale=1./255) 
    model = applications.VGG16(include_top=False, weights='imagenet', input_shape=(48, 48, 3)) 
    generator = datagen.flow_from_directory(
       train_data_dir, 
       target_size=(img_width, img_height), 
       batch_size=batch_size, 
       class_mode='categorical', 
       shuffle=False) 
    bottleneck_features_train = model.predict_generator(
       generator, nb_train_samples // batch_size) 
    np.save(open('bottleneck_features_train', 'wb'),bottleneck_features_train) 

    generator = datagen.flow_from_directory(
       validation_data_dir, 
       target_size=(img_width, img_height), 
       batch_size=batch_size, 
       class_mode='categorical', 
       shuffle=False) 
    bottleneck_features_validation = model.predict_generator(
       generator, nb_validation_samples // batch_size) 
    np.save(open('bottleneck_features_validation', 'wb'),bottleneck_features_validation) 

def train_top_model(): 
    train_data = np.load(open('bottleneck_features_train', 'rb')) 
    train_labels = np.array(([0]*(nb_train_samples // 3) + [1]*(nb_train_samples // 3) + 
          [2]*(nb_train_samples // 3))) 
    validation_data = np.load(open('bottleneck_features_validation', 'rb')) 
    validation_labels = np.array([0]*(nb_validation_samples // 3) + [1]*(nb_validation_samples // 3) + 
           [2]*(nb_validation_samples // 3)) 
    model = Sequential() 
    model.add(Flatten(input_shape=train_data.shape[1:])) 
    model.add(Dense(128, activation='relu')) 
    model.add(Dropout(0.5)) 
    model.add(Dense(3, activation='softmax')) 
    sgd = SGD(lr=1e-2, decay=0.00371, momentum=0.9, nesterov=False) 
    model.compile(optimizer=sgd, 
     loss='categorical_crossentropy', metrics=['accuracy']) 
    model.fit(train_data, train_labels, 
      epochs=epochs, 
      batch_size=batch_size, 
    validation_data=(validation_data, validation_labels)) 
    model.save_weights(top_model_weights_path) 

save_bottlebeck_features() 
train_top_model() 

がコードを実行すると、私はエラーを取得してい形状を持つことが期待dense_20を(なし、3)が、(1 1200)

形状と 配列を持っていません

私はコードにどのような変更を加えてそれを機能させるかを教えてくださいイオン。私はPython 3.5.2でAnacondaを使用していて、Windowsマシン上で動作しています。

答えて

2

あなたのトレーニング出力は(なし、1)のような形---あるいは(1200、1)、1200個のサンプル、一次元のみですべてのサンプル(各サンプルは数である)

しかし、あなたが存在する場合されますモデルはDense(3)で終わり、(None、3)のようなものが出力されます。つまり、各サンプルには3つの数字があります。

トレーニングデータが正しいと思われる場合は、モデルを調整する必要があります。

提案はもう1層追加Dense(1)層です。結果が0〜1の場合は「sigmoid」の有効化、結果が-1〜1の場合は「tanh」となります。

モデルの寸法を確認するには、常にmodel.summary()を使用してください。

+1

その有益な返信に感謝します。ところで、私は問題の解決策を見つけました。ケラスを使ったマルチクラス分類に必要なラベルを分類するのを忘れてしまった。私がしたことは、トレーニングラベルとバリデーションラベルに "to_categorical"を使用することでした。 – shiva