как я могу использовать нейтральную сеть с серыми изображениями в керасе - PullRequest
0 голосов
/ 08 апреля 2019

Я пытаюсь тренироваться на серых изображениях. batch_size = 32, image size = (48*48). Я определяю свою сеть input_shape = (48,48,1). Я получаю сообщение об ошибке, как показано ниже, когда тренируюсь в сети.

Ошибка:

ValueError: Ошибка при проверке ввода: ожидалось, что conv2d_17_input будет иметь 4 измерения, но получит массив с формой (32, 48, 48)

model.add(Conv2D(32, kernel_size=(5, 5),
                 activation='relu',
                 input_shape=(48,48,1)
                )
         )

Ответы [ 3 ]

1 голос
/ 08 апреля 2019

Допустим, у вас есть 1000 обучающие изображения, где каждое изображение 48x48 в оттенках серого. После того, как вы загрузили изображения в массив numpy, вы получите форму: (1000, 48, 48).

Это означает, что у вас есть 1000 элементов в вашем массиве, и каждый элемент представляет собой 48x48 матрицу.

Теперь, чтобы передать эти данные для обучения CNN, вы должны изменить этот список на (1000, 48, 48, 1), где 1 обозначает размерность канала. Поскольку у вас есть изображения в оттенках серого, вы должны использовать 1. Если это был RGB, это будет 3.

Рассмотрим пример игрушки, приведенный ниже,

x_train = np.random.rand(1000, 48, 48) #images
y_train = np.array([np.random.randint(0, 2) for x in range(1000)]) # labels

# simple model

model = Sequential()

model.add(Conv2D(32, kernel_size=(5, 5),
                 activation='relu',
                 input_shape=(48,48,1)
                )
         )

model.add(Flatten())

model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam')

# fitting model
model.fit(x_train, y_train, epochs=10, batch_size=32)

Это выдаст ошибку,

Ошибка при проверке ввода: ожидалось, что conv2d_3_input будет иметь 4 измерения, но получил массив с формой (1000, 48, 48)

Чтобы исправить это, измените x_train следующим образом,

x_train = x_train.reshape(x_train.shape[0], x_train.shape[1], x_train.shape[2], 1)

Теперь подгоняем модель,

model.fit(x_train, y_train, epochs=10, batch_size=32)

Epoch 1/10
1000/1000 [==============================] - 1s 1ms/step - loss: 0.7177
Epoch 2/10
1000/1000 [==============================] - 1s 882us/step - loss: 0.6762
Epoch 3/10
1000/1000 [==============================] - 1s 870us/step - loss: 0.5882
Epoch 4/10
1000/1000 [==============================] - 1s 888us/step - loss: 0.4588
Epoch 5/10
1000/1000 [==============================] - 1s 906us/step - loss: 0.3272
Epoch 6/10
1000/1000 [==============================] - 1s 910us/step - loss: 0.2228
Epoch 7/10
1000/1000 [==============================] - 1s 895us/step - loss: 0.1607
Epoch 8/10
1000/1000 [==============================] - 1s 879us/step - loss: 0.1172
Epoch 9/10
1000/1000 [==============================] - 1s 886us/step - loss: 0.0935
Epoch 10/10
1000/1000 [==============================] - 1s 888us/step - loss: 0.0638
0 голосов
/ 08 апреля 2019

Ваши изображения должны быть преобразованы в (sample_length, 48, 48, 1), а ваши input_shape = (48, 48, 1)

    x_train = x_train.reshape(x_train.shape[0], 48, 48, 1)
    x_test = x_test.reshape(x_test.shape[0], 48, 48, 1)
    input_shape = (48, 48, 1)

Вы можете посмотреть пример MNIST здесь , который похож на ваш случай.

0 голосов
/ 08 апреля 2019

Ваш ввод должен иметь 4 измерения, даже если это серая шкала.Таким образом, вы можете использовать np.reshape(input,(32,48,48,1)) или np.expand_dims(input,axis=3).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...