Керасы рассматривают Image как массив массивов, а не одну картинку - PullRequest
0 голосов
/ 06 января 2020

Итак, у меня есть NN внутри класса

      self.model = Sequential()
      self.model.add(Conv2D(50, (3, 3), activation='relu', input_shape=(240,256,3)))
      self.model.add(Dense(264,activation='relu'))
      self.model.add(Dense(7,activation='relu'))
      self.model.compile(optimizer=Adam(lr=0.001),loss='categorical_crossentropy',metrics=['accuracy'])

, и у меня есть массив в форме (240, 256, 3)

print(picture.shape) #(240, 256, 3)
picture = np.reshape(picture,(1,240,256,3))

, а затем попробуйте

self.model.predict(picture,verbose=1)

но вместо вывода, подобного этому [ 0. 25.21973 0. 0. 0. 1.8569145 0.] я получил что-то вроде

[[[[ 0.         25.21973     0.         ...  0.          1.8569145
     0.        ]
   [ 0.         25.21973     0.         ...  0.          1.8569145
     0.        ]
   [ 0.         25.21973     0.         ...  0.          1.8569145
     0.        ]
   ...
  [[ 0.         14.3257885   0.         ...  1.7455587   0.
     0.        ]
   [ 0.         25.417042    0.         ...  0.          7.501096
     0.        ]
   [ 0.         24.028965    0.         ... 14.10364     0.
     0.        ]
   ...
   [ 0.         17.480661    0.         ...  3.4586341   0.
     0.        ]]

  [[ 0.         21.477276    0.         ...  0.          0.
     0.        ]
   [ 0.         15.683931    0.         ...  0.          0.
     0.        ]
   [ 0.         10.419488    0.         ...  0.          0.29006004
     0.        ]
   ...

   [ 0.          7.038389    0.         ...  0.          0.
     0.        ]]

  [[ 0.         18.099554    0.         ...  0.          0.
     0.        ]
   [ 0.          8.225699    0.         ...  0.751534    0.
     0.        ]
   [ 0.         13.256775    0.         ...  0.          2.1235647
     0.        ]]]]

Можете ли вы сказать мне, в чем проблема?

1 Ответ

2 голосов
/ 06 января 2020

По умолчанию слои Keras 'Dense работают с последним измерением ввода, поэтому при вводе изображения вы получаете другое изображение в качестве вывода. Проблема с вашей моделью. Если вы используете model.summary(), вы увидите, что выходная форма вашей модели на самом деле та, которую вы видите через predict.

Решение простое, добавьте слой Flatten после последнего Conv2D:

self.model = Sequential()
self.model.add(Conv2D(50, (3, 3), activation='relu', input_shape=(240,256,3)))
self.model.add(Flatten())
self.model.add(Dense(264,activation='relu'))
self.model.add(Dense(7,activation='relu'))

Тогда ваша модель будет вести себя как положено.

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