Храните изображения в многократном массиве и используйте его для обучения модели - PullRequest
0 голосов
/ 07 мая 2019

Я получаю эту ошибку при обучении модели:

ValueError: Error when checking target: 
expected dropout_5 to have shape (33,) but got array with shape (1,).

Я хочу сохранить мои изображения в 33 массиве из папки, используя путь. У меня есть категории изображений в разные папки, которые были 1,2,3,4,5 ... Я использовал этот код, чтобы сделать это, но я не знаю, как сохранить его в другом массиве. Может ли кто-нибудь помочь мне.

datadir = 'C:/Users/user/Desktop/RESIZE' #path of the folder
categories = ['1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y']
img_rows, img_cols = 100, 100
training_data = []
for category in categories:
    path = os.path.join(datadir,category)
    class_num = categories.index(category)
    for img in os.listdir(path):
        img_array = cv2.imread(os.path.join(path,img),cv2.IMREAD_GRAYSCALE)
        new_array = cv2.resize(img_array,(img_rows,img_cols))
        training_data.append([new_array,class_num])

random.shuffle(training_data)

X = []
y = []
for features, label in training_data:
    X.append(features)
    y.append(label)

X = np.array(X).reshape(-1,img_rows,img_cols,1)
X = X.astype("float32")
pickle_out = open("X.pickle","wb")
pickle.dump(X,pickle_out)
pickle_out.close()

pickle_out = open("y.pickle","wb")
pickle.dump(y,pickle_out)
pickle_out.close()

После сохранения файла я использую этот код для обучения модели и хочу получить 33 выходных слоя, но он может работать только тогда, когда мой выходной слой (Плотный) установлен на 1. Я получил эту ошибку:

ValueError: Error when checking target: 
expected dropout_5 to have shape (33,) but got array with shape (1,)

Вот мой тренировочный код.

import tensorflow as tf
from keras import optimizers
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Dropout
from keras.layers import Flatten
from keras.layers.convolutional import Conv2D
from keras.layers.convolutional import MaxPooling2D
from keras.layers import Activation

import cv2
import os
import numpy as np
import pickle
from sklearn.utils import shuffle


X = pickle.load(open("X.pickle","rb"))
y = pickle.load(open("y.pickle","rb"))

X = X/255.0




model = Sequential()
model.add(Conv2D(32,(3,3), input_shape = X.shape[1:]))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size = (2,2)))
model.add(Dropout(0.25))

model.add(Conv2D(64,(3,3)))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size = (2,2)))
model.add(Dropout(0.25))

model.add(Conv2D(128,(3,3)))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size = (2,2)))
model.add(Dropout(0.4))

model.add(Dense(128))
model.add(Activation("relu"))
model.add(Dropout(0.5))

model.add(Flatten())
model.add(Dense(33, activation='softmax'))

model.add(Dropout(0.4))

model.compile(loss = "binary_crossentropy", optimizer = "adam", metrics = ["accuracy"])
model.fit(X, y, batch_size = 2, epochs = 1, validation_split = 0.2)

1 Ответ

0 голосов
/ 07 мая 2019

Вам нужно изменить y как одну горячую закодированную информацию для проведения обучения.

Попробуйте это для y,

from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import OneHotEncoder

# integer encode
label_encoder = LabelEncoder()
integer_encoded = label_encoder.fit_transform(y)
print(label_encoder.classes_) # This is your classes.
print(integer_encoded.shape())
# binary encode
onehot_encoder = OneHotEncoder(sparse=False)
integer_encoded = integer_encoded.reshape(len(integer_encoded), 1)
onehot_encoded = onehot_encoder.fit_transform(integer_encoded)
print(onehot_encoded.shape())

И еще одна вещь, если выхотите классифицировать для 33 класса, чем изменить свой убыток на categorical_crossentropy.

...