2017-09-14 16 views
0

これまでの約24時間はこれを解決しようとしていましたが、残念ながら何かを考え出すことはできませんでした。トレーニングKeras CNNモデル(RGBチャンネルのグリーンチャンネル)

質問は簡単です:2つのサブディレクトリに2つのカテゴリがあり、サブディレクトリの画像はRGB形式ですが、私は緑色のチャンネルだけに興味があります。

def get_model_bw(input_shape=(3,224,224), classes = 2, lr=1e-4): 
    model = Sequential([ 
     Lambda(lambda x: x[:,1,:,:], input_shape=input_shape, output_shape=(1,224,224)), 
     BatchNormalization(axis=1), 
     Conv2D(32,(3,3), activation='relu',padding='same'), 
     BatchNormalization(axis=1), 
     Conv2D(32,(3,3), activation='relu',padding='same'), 
     BatchNormalization(axis=1), 
     Conv2D(32,(3,3), activation='relu',padding='same'), 
     BatchNormalization(axis=1), 
     MaxPooling2D(), 
     Conv2D(64,(3,3), activation='relu',padding='same'), 
     BatchNormalization(axis=1), 
     Conv2D(64,(3,3), activation='relu',padding='same'), 
     BatchNormalization(axis=1), 
     Conv2D(64,(3,3), activation='relu',padding='same'), 
     BatchNormalization(axis=1), 
     MaxPooling2D(), 
     Conv2D(128,(3,3), activation='relu',padding='same'), 
     BatchNormalization(axis=1), 
     Conv2D(128,(3,3), activation='relu',padding='same'), 
     BatchNormalization(axis=1), 
     MaxPooling2D(), 
     Conv2D(256,(3,3), activation='relu',padding='same'), 
     BatchNormalization(axis=1), 
     Conv2D(256,(3,3), activation='relu',padding='same'), 
     BatchNormalization(axis=1), 
     MaxPooling2D(), 
     Conv2D(512,(3,3), activation='relu',padding='same'), 
     BatchNormalization(axis=1), 
     Conv2D(512,(3,3), activation='relu',padding='same'), 
     BatchNormalization(axis=1), 
     MaxPooling2D(), 
     Flatten(), 
     Dense(1000, activation='relu'), 
     BatchNormalization(), 
     Dense(1000, activation='relu'), 
     BatchNormalization(), 
     Dense(classes, activation='softmax') 
     ]) 
    model.compile(Adam(lr=lr), loss='categorical_crossentropy', metrics=['accuracy']) 
    return model 

model_bw = get_model_bw(input_shape=(3,224,224), classes=2) 

しかし、それだけでは動作することを拒否...:私は、私は次のようにラムダ層を使用してグリーンチャンネルを抽出しようとしている(画像サイズ(3224224)@)flow_from_directory機能を使用して画像のバッチを読みます それは投げというエラーがある:

とValueErrorトレースバック(最新の呼び出しの最後) とValueError:入力0は層batch_normalization_181と互換性がありません:期待ndim = 4は、任意の提案ndim = 3

を見つけましたか? P.P.私はTheanoバックエンドと最新のケラスバージョンを使用しています。

ご協力いただければ幸いです。

+0

は「働くことを拒否」であなたは何を意味するかについての詳細を教えてください。考えられるエラーメッセージを含める。 –

+0

何が起こっているのかを人々が理解できるように、エラーメッセージを投稿する必要があります。 –

+0

ありがとう、私はエラーメッセージを追加しました。ありがとう。 –

答えて

0

データフォーマットchannels_firstまたはchannels_lastを使用しているかどうかを最初に確認する必要があります。 (あなたが入力した形で最初にチャンネルを使用しているようです)

Kerasのデフォルトはchannels_lastです。あなたのユーザーフォルダにあるkeras.jsonファイルには、<user>\.keras\keras.jsonが含まれています。また、各レイヤーごとに個別に設定することもできます。

ラムダ層

このようなinput_shape=(3,224,224)などの層の外側形状を使用する場合には、バッチサイズ(画像の数)を指定しません。

しかし、(あなたがテンソルで直接作業している時はいつでも)ラムダ層の内部

は、バッチサイズは、最初の次元として表示されますので、あなたのチャンネルは最初の次元ではなく、第二中:

Lambda(lambda x: x[:,1,:,:], input_shape=input_shape, output_shape=outputshape) 
もちろん

、あなたの出力形状は、それが(1,224,224)

以下の層である必要があり、入力形状と同じにすることはできません。

はを追加しないでください210を他の層に、第1の層(これはラムダ層)にのみ適用する。


何か問題が生じた場合にエラーメッセージを表示する。

+0

ありがとうございます。私はchannel_firstを使用しています。元の投稿を編集してエラーメッセージを追加しました。それはまだ動作しません –

0

私は信じることができないが、私は解決策を見つけた:

ラムダ層:

from keras import backend as K 
Lambda(lambda x: K.expand_dims(x[:,1,:,:],1), input_shape=input_shape, output_shape=(1,224,224)), 
関連する問題