Keras, питающие одномерный массив изображений, задающие правильную форму ввода - PullRequest
0 голосов
/ 30 марта 2019

Я работаю над моделью классификации кошка против собаки, код загрузки данных ниже. Что я сделал, так это прочитал изображения с помощью OpenCV, затем получил края, используя функцию обнаружения краев, и изменил размеры изображений до 200 200, поэтому в конце я получил черно-белое изображение с белыми цветами в соответствии с обнаруженным контуром.

import os
import sys
import cv2

import random

from tqdm import tqdm

import matplotlib.pyplot as plt

train_images = os.listdir('data/train')
test_images = os.listdir('data/test')

test_images_data = []

for image in tqdm(test_images):
    image_data = cv2.imread('data/test/' + image)

    #Convert to GrayScale
    #gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

    #convert color from BGR to RGB
    image_data = cv2.cvtColor(image_data, cv2.COLOR_BGR2RGB)
    image_data = cv2.resize(image_data, (200, 200))

    #turn to only borders
    edges = cv2.Canny(image_data, 150, 150)

    test_images_data.append(edges)



train_images_data = []
train_images_labels = []

random.shuffle(train_images)

for image in tqdm(train_images):
    image_data = cv2.imread('data/train/' + image)

    #Convert to GrayScale
    #gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

    #convert color from BGR to RGB
    image_data = cv2.cvtColor(image_data, cv2.COLOR_BGR2RGB)
    image_data = cv2.resize(image_data, (200, 200))

    #turn to only borders
    edges = cv2.Canny(image_data, 150, 150)

    train_images_data.append(edges)

    if image.startswith('cat'):
        train_images_labels.append(0)
    else:
        train_images_labels.append(1)



from keras.models import Sequential 
from keras.layers import Conv2D, MaxPooling2D 
from keras.layers import Activation, Dropout, Flatten, Dense


model = Sequential() 
model.add(Conv2D(32, (2, 2), input_shape=train_images_data[0].shape)) 
model.add(Activation('relu')) 
model.add(MaxPooling2D(pool_size=(2, 2))) 

model.add(Conv2D(32, (2, 2))) 
model.add(Activation('relu')) 
model.add(MaxPooling2D(pool_size=(2, 2))) 

model.add(Conv2D(64, (2, 2))) 
model.add(Activation('relu')) 
model.add(MaxPooling2D(pool_size=(2, 2))) 

model.add(Flatten()) 
model.add(Dense(64)) 
model.add(Activation('relu')) 
model.add(Dropout(0.5)) 
model.add(Dense(1)) 
model.add(Activation('sigmoid')) 

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

model.fit(train_images_data, train_images_labels, epochs=150, validation_split=0.2, batch_size=10)

проблема в том, что когда я запускаю его так, я получаю эту ошибку

ValueError: Input 0 is incompatible with layer conv2d_16: expected ndim=4, found ndim=3

Я пробовал другие значения input_shape, такие как

(200, 200, 1)
(200, 200, -1)
(1, 200, 200)
(-1, 200, 200)

Никто не работает.

Ответы [ 2 ]

0 голосов
/ 31 марта 2019

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

train_images_data = np.array(train_images_data)
train_images_data = train_images_data.reshape([-1, 200, 200,1])

С этим теперь это работает

model.add(Conv2D(32, (3, 3), input_shape=(200, 200, 1))) 
0 голосов
/ 30 марта 2019

Форма ввода: (200, 200, 1,), чтобы размер пакета был последним, поэтому ожидается 4dim.

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