web-dev-qa-db-ja.com

conv2dおよび手動でロードされた画像のKeras input_shape

384x286白黒画像の数から手動でデータセットを作成しています。

このような画像をロードします:

x = []
for f in files:
        img = Image.open(f)
        img.load()
        data = np.asarray(img, dtype="int32")
        x.append(data)
x = np.array(x)

これにより、xは配列(num_samples、286、384)になります。

print(x.shape) => (100, 286, 384)

ケラスのドキュメントを読んで、私のバックエンドをチェックして、畳み込みステップに(rows、cols、channels)で構成されるinput_shapeを提供する必要があります

私はサンプルサイズをarbitrarily意的に知らないので、入力サイズとして渡すことを期待していました。

( None, 286, 384, 1 )

モデルは次のように構築されます。

model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=input_shape))
# other steps...

input_shape(286、384、1)として渡すと:

入力チェック時のエラー:conv2d_1_inputは4次元であることが期待されますが、形状(85、286、384)の配列を取得しました

as_input_shape(None、286、384、1)を渡すと:

入力0はレイヤーconv2d_1と互換性がありません:期待されるndim = 4、ndim = 5が見つかりました

私は何が間違っていますか?入力配列を再形成するにはどうすればよいですか?

7
Stormsson

_input_shape_を(286,384,1)に設定します。これで、モデルは4次元の入力を期待します。これは、.reshape(n_images, 286, 384, 1)を使用して画像の形状を変更する必要があることを意味します。これで、データを変更せずに追加のディメンションが追加され、モデルを実行する準備が整いました。基本的に、データを(_n_images_、_x_shape_、_y_shape_、_n_steps_)に再形成する必要があります。

以下の例を確認してください。

クールなのは、RGBイメージを入力として使用できることです。 _n_steps_を3に変更するだけです。

_import numpy as np
from keras.models import Sequential
from keras.layers.convolutional import Convolution2D
from keras.layers.core import Flatten, Dense, Activation
from keras.utils import np_utils

#Create model
model = Sequential()
model.add(Convolution2D(32, kernel_size=(3, 3), activation='relu', input_shape=(286,384,1)))
model.add(Flatten())
model.add(Dense(2))
model.add(Activation('softmax'))

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

#Create random data
n_images=100
data = np.random.randint(0,2,n_images*286*384)
labels = np.random.randint(0,2,n_images)
labels = np_utils.to_categorical(list(labels))

#add dimension to images
data = data.reshape(n_images,286,384,1)

#Fit model
model.fit(data, labels, verbose=1)
_
13

input_shapeの次元が正しい、つまりinput_shape(286、384、1)

input_imageを4Dに変更します[batch_size、img_height、img_width、number_of_channels]

input_image=input_image.reshape(85,286, 384,1)

中に

model.fit(input_image,label)
1
thefifthjack005

次の手順でエラーを解決できると思います。

  1. 最初のconv2d(シーケンシャルモデルの最初のレイヤー)に提供するinput_shapeは、(286,384,1)または(width、height、channels)のようなものでなければなりません。 batch_sizeに「なし」ディメンションは必要ありません。

  2. 入力の形状は(batch_size、286,384,1)にすることができます

これはあなたを助けますか??

0
Harsha Pokkalla