Построение начальной архитектуры для классификации изображений. Keras. ValueError - PullRequest
0 голосов
/ 10 января 2019

Я пытаюсь создать начальную архитектуру googleNet для классификации изображений. Я уже прочитал и сохраню свои данные изображения и метки, которые приведены ниже.

print(X_train.shape)
(16016, 224, 224, 3)
print(X_test.shape)
(16016, 1, 163)
print(y_train.shape)
(14939, 224, 224, 3)
print(y_test.shape)
(14939, 1, 163)

С этими данными я пытаюсь обучить свой классификатор. Мой код для этого ниже.

IMG_SIZE = 224
input_image = Input(shape = (IMG_SIZE,IMG_SIZE,3))

tower_1 = Conv2D(64,(1,1),padding='same', activation='relu') (input_image)
tower_1 = Conv2D(64,(3,3), padding='same',activation='relu') (tower_1)

tower_2 = Conv2D(64,(1,1), padding='same',activation='relu')(input_image)
tower_2 = Conv2D(64,(5,5), padding='same', activation='relu')(tower_2)

tower_3 = MaxPooling2D((3,3),strides=(1,1),padding='same')(input_image)
tower_3 = Conv2D(64,(1,1), padding='same',activation='relu')(tower_3)

output = keras.layers.concatenate([tower_1,tower_2,tower_3],axis=3)
output = Flatten()(output)
out = Dense(163, activation='softmax')(output)

model = Model(inputs = input_image, outputs = out)
print(model.summary())

epochs = 30
lrate = 0.01
decay = lrate/epochs

sgd = SGD(lr=lrate, momentum=0.9, decay=decay, nesterov= False)
model.compile(loss='categorical_crossentropy',optimizer=sgd, metrics=['accuracy'])

history = model.fit(X_train,y_train,validation_data=(X_test,y_test), epochs=epochs, batch_size=32)

from keras.models import model_from_json

model_json = model.to_json()
with open("model.json", "w") as json_file:
    json_file.write(model_json)

model.save_weights(os.path.join(os.getcwd(),'model.h5'))

scores = model.evaluate(X_test,y_test, verbose=0)
print("Accuracy: %.2f%%" % (scores[1]*100))

Но каждый раз, когда я запускаю свою программу, она выдает ошибку значения, которая мне непонятна. Я уже пробовал 'y_test= y_test.reshape(14939,IMG_SIZE,IMG_SIZE,3)', но все равно выдает ту же ошибку.

Error

Traceback (most recent call last):
  File "c:/Users/zeele/OneDrive/Desktop/googleNet_Architecture.py", line 149, in <module>
    history = model.fit(X_train,y_train,validation_data=(X_test,y_test), epochs=epochs, batch_size=32)
  File "C:\Users\zeele\Miniconda3\lib\site-packages\keras\engine\training.py", line 1405, in fit
    batch_size=batch_size)
  File "C:\Users\zeele\Miniconda3\lib\site-packages\keras\engine\training.py", line 1299, in _standardize_user_data
    exception_prefix='model target')
  File "C:\Users\zeele\Miniconda3\lib\site-packages\keras\engine\training.py", line 121, in _standardize_input_data
    str(array.shape))
ValueError: Error when checking model target: expected dense_1 to have 2 dimensions, but got array with shape (14939, 224, 224, 3)

Пожалуйста, помогите мне через это.

Спасибо.

1 Ответ

0 голосов
/ 10 января 2019

Что точно, так это то, что формы ваших данных не правильные / непротиворечивые; так

print(X_train.shape)
(16016, 224, 224, 3)

можно было бы ожидать, что X_test.shape качественно аналогично, с разницей только в количестве образцов, т.е. что-то вроде (NUM_TEST_SAMPLES, 224, 224, 3); Но то, что вы сообщаете:

print(X_test.shape)
(16016, 1, 163)

, который больше похож на ожидаемую форму ваших ярлыков (т.е. y_train.shape).

Обратите внимание, что длина ваших данных и меток должна быть одинаковой для обучающих и испытательных наборов, что опять-таки не так: для обучающих и испытательных наборов вы сообщаете 16 016 образцов данных и только 14 939 этикеток.

Моя догадка состоит в том, что, скорее всего, вы допустили (достаточно частую) ошибку, разбивая свои данные на обучающие и тестовые наборы, используя train_test_split scikit-learn (см. документы ). ):

# WRONG ORDER:
X_train, y_train, X_test, y_test = train_test_split(X, y, test_size=0.33, random_state=42)

# CORRECT ORDER:
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)
...