2017-12-17 5 views
0

GPU対応のTensorflowバックエンドでKerasを使用して3層の密なニューラルネットワークのモデルをトレーニングしようとしています。高密度レイヤーのケラスエラー、予想される4つのディメンションが形状(1024,2)で配列を取得

私が持っているデータセットは、自分が属しているカテゴリの名前を持つディレクトリに置いた400万本の20x40ピクセルの画像です。

大量のデータがあるため、すべてをRAMにロードしてモデルにフィードすることはできませんので、Keras's ImageDataGeneratorを使用すると思います。具体的には、関数flow_from_directory()がそのトリックを行います。これは、(x、y)のタプルを生成する。ここで、xは画像のnumpy配列であり、yは画像のラベルである。

私のモデルの入力として与えられるnumpy配列へのアクセスをモデルが知っていることを期待していたので、入力形状を次のように設定しました:(None、20,40,3)Noneはバッチサイズ、20および40は画像のサイズ、3は画像内のチャンネル数である。ターゲットチェックする際にエラー: とValueError:私は私のモデルを訓練しようとすると、私はエラーを取得しておくようしかし、これは動作しません4次元を持つことが期待dense_3を、しかし形状(1024、2)の配列を得た

私は原因がflow_from_directoyからタプルを取得していることを知っていますが、入力シェイプを一致させるために入力シェイプを変更できると思いますが、これを使用するとモデルが役に立たなくなる恐れがあります。タプル。だから私の質問は、私はどのように私のモデルに画像を供給し、それの訓練を検証するためにタプルを使用するflow_from_directoryを得ることができますですか?私はここで何か誤解していますか?参考のため

は、ここに私のコードは次のとおりです。

from keras.models import Model 
from keras.layers import * 
from keras.preprocessing.image import ImageDataGenerator 
from keras.callbacks import TensorBoard 

# Prepare the Image Data Generator. 
train_datagen = ImageDataGenerator() 
test_datagen = ImageDataGenerator() 

train_generator = train_datagen.flow_from_directory(
    '/path/to/train_data/', 
    target_size=(20, 40), 
    batch_size=1024, 
) 

test_generator = test_datagen.flow_from_directory(
    '/path/to/test_data/', 
    target_size=(20, 40), 
    batch_size=1024, 
) 

# Define input tensor. 
input_t = Input(shape=(20,40,3)) 

# Now create the layers and pass the input tensor to it. 
hidden_1 = Dense(units=32, activation='relu')(input_t) 
hidden_2 = Dense(units=16)(hidden_1) 
prediction = Dense(units=1)(hidden_2) 

# Now put it all together and create the model. 
model = Model(inputs=input_t, outputs=prediction) 
model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy']) 

# Prepare Tensorboard callback and start training. 
tensorboard = TensorBoard(log_dir='./graph', histogram_freq=0, write_graph=True, write_images=True) 
print(test_generator) 
model.fit_generator(
    train_generator, 
    steps_per_epoch=2000, 
    epochs=100, 
    validation_data=test_generator, 
    validation_steps=800, 
    callbacks=[tensorboard] 
) 

# Save trained model. 
model.save('trained_model.h5') 

答えて

1

あなたの入力形状が緻密層のために間違っています。

高密度レイヤーは、形状の入力(なし、長さ)を期待しています。

あなたは、彼らがベクトルになるように、あなたの入力を再構築する必要があります、次のいずれか

imageBatch=imageBatch.reshape((imageBatch.shape[0],20*40*3)) 

または畳み込み層を使用し、それがのように入力形状の種類(なし、NROWS、NCOLS、nChannelsを)期待テンソルフロー

関連する問題