Ошибка построения модели CNN, размер цели отличается от размера выборки - PullRequest
0 голосов
/ 27 февраля 2019

Я пытаюсь использовать существующее руководство по модели CNN со своим собственным набором данных, так как я новичок в углубленном изучении и хочу понять концепцию.

То, что я не получаю, это метка y значений.Как приучить Модель давать метку y каждому образцу x?Есть ли лучший способ загрузить мои данные с метками в CNN, чем использовать для LOP?

У меня есть набор данных из 5 животных, состоит из 1725 (в целом).например, собака = 3 изображения.кошки = 54 изображения.

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

ValueError: Input arrays should have the same number of samples as target arrays. Found 5172 input samples and 1725 target samples.

Это входные данные

import numpy as np
import matplotlib.pyplot as plt
import os 
import cv2
import tensorflow as tf
import tensorflow.keras as keras
from keras.utils import to_categorical


IMG_SIZE = 64

PATH = os.getcwd()
data_path = PATH + '\image'
data_dir_list = os.listdir(data_path)

num_classes = 5
img_data_list = []
num_channel=1



for dataset in data_dir_list:
    img_list=os.listdir(data_path+'/'+ dataset)
    print ('Loaded the images of dataset-'+'{}\n'.format(dataset))
    for img in img_list:
        input_img=cv2.imread(data_path + '/'+ dataset + '/'+ img )
        input_img=cv2.cvtColor(input_img, cv2.COLOR_BGR2GRAY)
        input_img_resize=cv2.resize(input_img,(64,64))
        img_data_list.append(input_img_resize)

img_data = np.array(img_data_list)
img_data = img_data.astype('float32')
img_data /= 255
print(img_data.size)
print (img_data.shape)

после того, как я запустил ее

Loaded the images of dataset-0

Loaded the images of dataset-1

Loaded the images of dataset-2

Loaded the images of dataset-3

Loaded the images of dataset-4

7065600
(1725, 64, 64) 

если я проверяю список img_data

print(len(img_data))
print(img_data)
1725
[[[0.8784314  0.32941177 0.22745098 ... 0.13333334 0.06666667 0.05490196]
  [0.03137255 0.16862746 0.14901961 ... 0.18431373 0.20784314 0.16470589]
  [0.1764706  0.42745098 0.26666668 ... 0.42352942 0.05882353 0.00784314]
  ...
  [0.42352942 0.4        0.2901961  ... 0.3647059  0.4392157  0.4392157 ]
  [0.38431373 0.4        0.4392157  ... 0.4392157  0.3019608  0.32941177]
  [0.20784314 0.41568628 0.40392157 ... 0.42745098 0.21176471 0.3372549 ]]

Здесь после изменения формы img_data

#num_of_samples = 1725 

from sklearn.model_selection import train_test_split
import random 
from sklearn.utils import shuffle


num_of_samples = img_data.shape[0]

# convert class labels to on-hot encoding
#Y = np_utils.to_categorical(labels, 5)
#train_labels = keras.utils.to_categorical(labels, num_classes)
nb_train_samples = 1725
train_labels = np.array([0] * (195) + [1] * (120) + [2] * (380) + [3] * (144) + [4] * (886))
train_labels = keras.utils.to_categorical(train_labels, num_classes = 5)

#Shuffle the dataset
x = [] # for images 
y = [] # for labels 
print(train_labels.shape)


x = shuffle(img_data)
print(x.shape)

y = shuffle(train_labels)
print(y.shape)
# Split the dataset
y_train = y.reshape((1725,5))


X_train,X_test, y_train, y_test = train_test_split(X, y)

X_train = np.array(X_train).reshape(-1, 32,32, 1)
print (X_train.size)

X_test = np.array(X_test).reshape(-1, 32,32, 1)


print (y_train.size)


print (train_labels)
print (train_labels.size)

output

(1725, 5)
(1725, 64, 64)
(1725, 5)

ValueError: Найдены входные переменные с несогласованныминомера образцов: [5175, 1725]

#Set Model Parameters

batch_size = 15
epochs = 50
num_classes = 5

input_shape=img_data[0].shape


#Build Model 

Model = Sequential()
Model.add(Conv2D(32, kernel_size=(3,3), input_shape=(32,32,1)))
Model.add(Activation('relu'))
Model.add(MaxPooling2D(pool_size=(2, 2)))
Model.add(Conv2D(64, (3, 3)))
Model.add(Activation('relu'))
Model.add(Flatten())
Model.add(Dense(1024))
Model.add(Activation('relu'))
Model.add(Dropout(0.4))
Model.add(Dense(num_classes))
Model.add(Activation('softmax'))



# Model Compiling 

Model.compile(loss = "categorical_crossentropy", optimizer = "Adam", metrics=['accuracy'])

1 Ответ

0 голосов
/ 27 февраля 2019

Относительно 5175, 1725 * 3 = 5175, поэтому некоторая операция по изменению формы объединяет цветовые каналы RGB (3) и количество выборок (1725)?Хотя в приведенных выше фрагментах кода это не так, поскольку изображение преобразуется в оттенки серого.

Да, существует более простой способ загрузки данных изображения в Keras.Просто поместите изображения каждого класса в свою собственную подпапку, такую ​​как собака, кошка и т. Д., И используйте метод flow_from_directory в ImageDataGenerator.Другое преимущество - поддержка увеличения, нормализации и т. Д.

https://keras.io/preprocessing/image/

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