Реализация PCA в сверточной нейронной сети - PullRequest
0 голосов
/ 05 января 2019

После применения PCA к данным MNIST я определил модель и слои CNN. После подгонки модели CNN (X_train_PCA, Y_train) у меня возникает проблема с размерами на этапе оценки. Вот сообщение Msgstr "ValueError: Ошибка при проверке ввода: ожидалось, что conv2d_1_input будет иметь форму (1, 10, 10), но получил массив с формой (1, 28, 28)". Когда я пытаюсь преобразовать X_test в формат 10X10, я получил очень низкий балл

Сначала я применил min-max регуляризацию, а затем PCA к X_train. Затем я создал данные проверки из X_train. Проблема в; Я могу разместить данные в формате 100 измерений (после применения PCA), мои входные данные становятся 10X10. Когда я пытаюсь получить оценку от подходящей модели, используя X_test, который все еще (10000, 1, 28, 28)). Я получаю ошибки, как указано выше. Как я могу решить проблему измерения. Я также пытался преобразовать X_test с помощью minmaxscaler и PCA. Без изменений в балле

pca_3D = PCA(n_components=100)
X_train_pca = pca_3D.fit_transform(X_train)
X_train_pca.shape  
cnn_model_1_scores = cnn_model_1.evaluate(X_test, Y_test, verbose=0)

# Split the data into training, validation and test sets
X_train1 = X_pca_proj_3D[:train_size]
X_valid = X_pca_proj_3D[train_size:]
Y_train1 = Y_train[:train_size]
Y_valid = Y_train[train_size:]

# We need to convert the input into (samples, channels, rows, cols) format
X_train1 = X_train1.reshape(X_train1.shape[0], 1, 10, 
10).astype('float32')
X_valid = X_valid.reshape(X_valid.shape[0], 1, 10, 10).astype('float32')
X_test = X_test.reshape(X_test.shape[0], 1, 28, 28).astype('float32')
X_train1.shape, X_valid.shape, X_test.shape  
((51000, 1, 10, 10), (9000, 1, 10, 10), (10000, 1, 28, 28))

#create model
cnn_model_1=Sequential()

#1st Dense Layer
cnn_model_1.add(Conv2D(32, kernel_size=(5,5),
                  data_format="channels_first",
                  input_shape=(1,10,10),
                  activation='relu'))
#Max-Pooling
cnn_model_1.add(MaxPooling2D(pool_size=(2,2)))
#Max pooling is a sample-based discretization process. The objective is to 
down-sample an input representation (image, hidden-layer output matrix, 
etc.), reducing its dimensionality
# the number of layers, remains unchanged in the pooling operation
#cnn_model_1.add(BatchNormalization()) 
#Dropout
cnn_model_1.add(Flatten())
#cnn_model_1.add(BatchNormalization()) 
#2nd Dense Layer
cnn_model_1.add(Dense(128, activation='relu'))

#final softmax layer
cnn_model_1.add(Dense(10, activation='softmax'))

# print a summary and check if you created the network you intended
cnn_model_1.summary()

#Compile Model
cnn_model_1.compile(loss='categorical_crossentropy', optimizer='adam', 
     metrics=['accuracy'])

 #Fit the model
cnn_model_1_history=cnn_model_1.fit(X_train1, Y_train1, 
validation_data=(X_valid, Y_valid), epochs=5, batch_size=100, verbose=2)

# Final evaluation of the model
cnn_model_1_scores = cnn_model_1.evaluate(X_test, Y_test, verbose=0)
print("Baseline Test Accuracy={0:.2f}%   (categorical_crossentropy) loss= 
{1:.2f}".format(cnn_model_1_scores[1]*100, cnn_model_1_scores[0]))
cnn_model_1_scores

1 Ответ

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

Я решил проблему, обновив пост, чтобы дать другим программистам интуицию для отладки их кода. Сначала я применил PCA к данным X_test и, получив низкий балл, попробовал без применения. Как предположил @Scott, это было неправильно. После тщательной проверки моего кода я обнаружил, что забыл изменить X_test на X_test_pca после применения PCA к тестовым данным при построении модели CNN. Я также установил PCA на X_train, применяя PCA к данным X_test.

...