2

私はテンソルフローバックエンドのケラスを使って2つのクラスの画像分類のコードを書いています。私の画像はコンピュータのフォルダに保存されていて、私はこれらの画像をケラスモデルの入力として与えたいと思っています。 load_imgは1つの入力イメージしか取らないので、flow(x,y)またはflow_from_directory(directory)のいずれかを使用する必要がありますが、flow(x,y)には、長さタスクというラベルを付ける必要があります。flow_from_directory(directory)を使用しています。私の画像は20 * 40,55 * 43 .....のような可変サイズですが、hereは固定されたtarget_sizeが必要であると言われています。 this解決策では、input_shape=(1, None, None)またはinput_shape =(None、None、3)(チャンネルの最後とカラー画像)を使用して畳み込みレイヤーへの入力として可変サイズの画像を与えることができますが、平坦化レイヤーとmyモデルは畳み込み層と平坦化層の両方から成ります。その記事では、moi90のみが異なるバッチを試すことを提案していますが、すべてのバッチは同じサイズの画像を持つべきですが、データが非常にばらばらであるため同じサイズの画像をグループ化することはできません。私はそれがないので、img_dim_orderingbackendのですが、理由thisの私が持っていると確信しています可変サイズの画像をケラスの入力として与える方法

Traceback (most recent call last): 

    File "<ipython-input-8-4e22d22e4bd7>", line 23, in <module> 
    model.add(Flatten()) 

    File "/home/nd/anaconda3/lib/python3.6/site-packages/keras/models.py", line 489, in add 
    output_tensor = layer(self.outputs[0]) 

    File "/home/nd/anaconda3/lib/python3.6/site-packages/keras/engine/topology.py", line 622, in __call__ 
    output_shape = self.compute_output_shape(input_shape) 

    File "/home/nd/anaconda3/lib/python3.6/site-packages/keras/layers/core.py", line 478, in compute_output_shape 
    '(got ' + str(input_shape[1:]) + '. ' 

ValueError: The shape of the input to "Flatten" is not fully defined (got (None, None, 16). Make sure to pass a complete "input_shape" or "batch_input_shape" argument to the first layer in your model. 

:今

from __future__ import print_function 
from keras.models import Sequential 
from keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D 
from keras import backend as K 
import numpy as np 
from keras.preprocessing.image import ImageDataGenerator 

input_shape = (None,None,3) 

model = Sequential() 
model.add(Conv2D(8, kernel_size=(3, 3), 
       activation='relu', 
       input_shape=input_shape)) 
model.get_weights() 
model.add(Conv2D(16, (3, 3), activation='relu')) 
model.add(MaxPooling2D(pool_size=(2, 2))) 
model.add(Dropout(0.25)) 
model.add(Flatten()) 
model.add(Dense(32, activation='relu')) 
model.add(Dropout(0.5)) 
model.add(Dense(2, activation='softmax')) 

model.compile(loss='binary_crossentropy',optimizer='rmsprop',metrics=['accuracy']) 

train_datagen = ImageDataGenerator() 
test_datagen = ImageDataGenerator() 
train_generator = train_datagen.flow_from_directory('/data/train', target_size=input_shape, batch_size=1,class_mode='binary') 
validation_generator = test_datagen.flow_from_directory('/data/test',target_size=input_shape,batch_size=1,class_mode='binary') 
model.fit_generator(train_generator,steps_per_epoch=1,epochs=2,validation_data=validation_generator,validation_steps=1) 

私は取得しています、次のエラー:だから私はbatch size=1に移動して、次のコードを書くことにしました両方ともチェックされていますthコードを修正したり、モデルに入力できる可変サイズの画像を与える方法を助けてください。

+0

さらに正確な回答を待っています – Hitesh

答えて

2

残念ながら、さまざまなサイズの画像で神経ネットワークをそのまま訓練することはできません。すべての画像を所定のサイズにリサイズする必要があります。幸いなことに、あなたのハードドライブでこれを行う必要はありません。永久にケラスによって、あなたはhteの飛行でこれを行います。あなたはこのようなtarget_sizeを定義する必要がありますあなたのflow_from_directoryインサイド

:あなたがそうするならば

train_generator = train_datagen.flow_from_directory(
    'data/train', 
    target_size=(150, 150), #every image will be resized to (150,150) before fed to neural network 
    batch_size=32, 
    class_mode='binary') 

また、あなたが好きなバッチサイズことができます。

+0

私は同じ次元の画像をグループ化すれば可能ですか?私のコードで何を変えなければならないのか。 – Hitesh

+0

Thnx Ioannis編集用 – Hitesh

2

numpyの配列に可変サイズを入れない限り、可変サイズを調整することができます。

しかし、いくつかのレイヤーは可変サイズをサポートしておらず、Flattenはその1つです。可変サイズのFlattenレイヤーを含むモデルを訓練することは不可能です。

FlattenレイヤーをGlobalMaxPooling2Dまたはレイヤーに置き換えることもできます。しかし、これらのレイヤーは、あまりにも多くの情報を小さなデータに凝縮させる可能性があります。そのため、より多くのチャネルを追加する必要があります。

ジェネレータが同じサイズの画像を含むバッチを生成するようにする必要があります。同じnumpyの配列に異なるサイズの2つ以上の画像を配置しようとすると、ジェネレータが失敗します。

+0

あなたの返信用のThnx Daniel。私は同じサイズの画像のグループを作るだろうが、それを続ける方法は?どのような変更は、私のabobe言及のコードで行う必要があります。 – Hitesh

+0

'model.add(Flatten())'を 'model.add(GlobalMaxPooling2D()) 'に置き換えると、次のエラーが発生します:' File "/home/nd/anaconda3/lib/python3.6/site-packages /keras/utils/data_utils.py "、557行目には、 の6つがあります。raise_from(呼び出すとStopIteration(E)、E)raise_from 呼び出すとStopIterationで ファイル「」、2行目、「NoneType」オブジェクトがinteger' – Hitesh

+0

として解釈することができない私はどこかに、この層の前に、あなたのネットが出力されていることを信じている(または入力としても)「ナノ」値を得る。 'relu'の起動によって、誤ってすべての結果が0になることがあります(したがって、勾配を持たない)可能性があります。あなたはイメージが正の値のみで作られている場合には、初期化子をreluのレイヤーに渡して、すべてのウェイトをプラスにしてみてください。 –

関連する問題