Sử dụng PCA trên bộ dữ liệu hình ảnh trước khi phân loại với mạng thần kinh


7

Tôi có ma trận dữ liệu hình ảnh trong đó là số ví dụ hình ảnh và là số pixel hình ảnh: , vì mỗi hình ảnh là hình ảnh 3 kênh . Hơn nữa, mỗi trong số 50000 hình ảnh thuộc về 1 trong 10 lớp có thể. Đó là, có 5000 hình ảnh của lớp ' ', 5000 hình ảnh, của lớp ' ', v.v ... và có tổng số 10 lớp. Đây là một phần của bộ dữ liệu CIFAR-10.XN x pN=50000p=3072p=3072=32×32×332×32carbird

Mục tiêu cuối cùng ở đây là thực hiện phân loại trên tập dữ liệu này. Để kết thúc này, giáo sư đã đề cập để thử PCA về điều này, và sau đó đặt các tính năng đó vào một bộ phân loại. Là phân loại của tôi, tôi đang sử dụng một mạng thần kinh được kết nối đầy đủ với một lớp ẩn và đầu ra softmax.

Vấn đề của tôi là tôi tin rằng tôi đã thực hiện PCA theo cách chính xác , nhưng tôi nghĩ rằng cách của tôi có thể có thể được áp dụng sai .

Đây là những gì tôi đã làm:

Để tính toán PCA dữ liệu của tôi, đây là những gì tôi đã làm cho đến nay:

Đầu tiên, tôi tính toán hình ảnh trung bình . Hãy là 'th dãy . Sau đó,μ1xpxnnX

μ=1Nn=1Nxn

Tính toán ma trận hiệp phương sai của dữ liệu hình ảnh của tôi:Cpxp

C=1N1(Xμ)T(Xμ)

Thực hiện phân rã vectơ riêng của , thu được , và , trong đó ma trận mã hóa các hướng chính (hàm riêng) dưới dạng cột. (Ngoài ra, giả sử rằng các giá trị eigen đã được sắp xếp theo thứ tự giảm dần). Như vậy:CUSVU

[U,S,V]=eig(C)

Cuối cùng, thực hiện PCA: tức là tính toán ma trận dữ liệu mới , trong đó là số lượng thành phần chính mà chúng ta muốn có. Đặt - nghĩa là một ma trận chỉ có các cột đầu tiên . Như vậy:PNxkkUkpxkk

P=XUk

Câu hỏi:

Tôi nghĩ rằng phương pháp thực hiện PCA của tôi trên dữ liệu này được áp dụng sai, bởi vì cách tôi đã thực hiện nó, về cơ bản, cuối cùng tôi đã giải mã các pixel của tôi. (Giả sử tôi đã đặt ). Đó là, các hàng kết quả của trông giống như nhiễu. Đó là trường hợp, câu hỏi của tôi như sau:k=pP

  • Tôi đã thực sự khử tương quan các pixel? Đó là, trên thực tế tôi đã loại bỏ bất kỳ khớp nối nào giữa các pixel mà trình phân loại tương lai có thể hy vọng sẽ sử dụng chưa?
  • Nếu câu trả lời ở trên là đúng, thì tại sao chúng ta lại làm PCA theo cách này?
  • Cuối cùng, liên quan đến điểm cuối cùng, làm thế nào sẽ chúng ta làm chiều giảm qua PCA trên hình ảnh, nếu trên thực tế, phương pháp này tôi đã sử dụng nó sai?

BIÊN TẬP:

Sau khi nghiên cứu sâu hơn và có nhiều phản hồi, tôi đã tinh chỉnh câu hỏi của mình để: Nếu một người sử dụng PCA như một bước xử lý trước để phân loại hình ảnh, thì tốt hơn:

  • Thực hiện phân loại trên k thành phần chính của hình ảnh? (Ma trận ở trên, vì vậy bây giờ mỗi hình ảnh có độ dài thay vì gốc )Xnew=XUkkp
  • HOẶC tốt hơn là thực hiện phân loại trên các hình ảnh được dựng lại từ k-eigenvector , (sau đó sẽ là , vì vậy mặc dù mỗi hình ảnh đều VẪN có độ dài ban đầu , nhưng thực tế nó là được xây dựng lại từ eigenvector).Xnew=XUkUkTpk

Theo kinh nghiệm, tôi đã thấy rằng độ chính xác xác nhận mà không có PCA> độ chính xác xác thực với tái cấu trúc PCA> độ chính xác xác thực với PCA PC.

Những hình ảnh dưới đây cho thấy theo thứ tự tương tự. Độ chính xác xác nhận 0,5> 0,41> 0,31.

Đào tạo về hình ảnh pixel thô có độ dài :p

nhập mô tả hình ảnh ở đây

Đào tạo về hình ảnh có độ dài nhưng được xây dựng lại với k = 20 eigenvector:p

nhập mô tả hình ảnh ở đây

Và cuối cùng, tự đào tạo về các thành phần chính $ k = 20 *:

nhập mô tả hình ảnh ở đây

Tất cả điều này đã được chiếu sáng. Như tôi đã tìm ra, PCA không đảm bảo rằng các thành phần chính giúp việc phân định ranh giới giữa các lớp khác nhau dễ dàng hơn. Điều này là do các trục chính được tính toán là các trục chỉ cố gắng tối đa hóa năng lượng của phép chiếu trên tất cả các hình ảnh, theo thuyết bất khả tri đối với lớp hình ảnh. Ngược lại, hình ảnh thực tế - dù được tái cấu trúc trung thực hay không, vẫn duy trì một số khía cạnh của sự khác biệt về không gian có thể đi - hoặc nên đi - hướng tới việc phân loại có thể.


1
@amoeba Có, tôi đã sử dụng NN được kết nối đầy đủ làm trình phân loại. Đầu vào là tập dữ liệu NxP gốc hoặc tập dữ liệu NxK. Tất cả mọi thứ đều giống nhau, cái trước làm việc tuyệt vời, cái sau không học được gì cả.
Spacey

1
@amoeba Xin lỗi hãy để tôi làm rõ: Trong thử nghiệm ban đầu, tôi đào tạo trên tất cả các hình ảnh, trong không gian ban đầu. Nghĩa là, ma trận X = NxP, N là số lượng hình ảnh và P là số pixel trên mỗi hình ảnh. Trong thử nghiệm thứ hai, tôi huấn luyện về X_new là ma trận NxK, trong đó mỗi hàng có các thành phần chính K - nghĩa là các hệ số cơ sở k của mỗi hình ảnh. (X_new = X * U [0: k]). Trong này trường hợp, không có học xảy ra.
Spacey

1
@amoeba Vì vậy, trong thí nghiệm của tôi, tôi đã sử dụng K = 10, 50 và thậm chí 100. FYI, trên tập dữ liệu CIFAR-10, phần lớn năng lượng được chứa trong 50 vectơ eigen hàng đầu. (Tôi thậm chí đã đi hết quãng đường tới k = 3072 = P, và vẫn không có việc học nào được thực hiện). (Xin lưu ý rằng điều này đã được thực hiện trên chính các hệ số cơ bản. Nếu tôi, mặt khác đã tái tạo lại hình ảnh từ K = 50 eigenvector, nghĩa là, X_new = X * U [0: k = 50] * U [0 : k = 50] .T, sau đó tôi nhận được kết quả rất hợp lý).
Spacey

1
@amoeba Vâng, tôi có một bộ kiểm tra chưa được xử lý được chạy cuối cùng trên NN đã học. Việc xử lý trước các hình ảnh là một ý nghĩa đơn giản của từng tính năng. (pixel). Tôi chắc chắn rằng tôi thực hiện quá trình tiền xử lý tương tự và có cùng số liệu thống kê sau và trước PC. Vâng, hãy để tôi làm điều này: Tôi quay trở lại mã, và chạy lại và sau đó đăng lại những phát hiện của tôi. Tôi sẽ ping bạn khi tôi làm điều này.
Spacey

2
Tôi nhấn mạnh rằng điều này không được xác nhận bởi các liên kết tôi đã cung cấp. Các liên kết nói rằng 50 PC không nhất thiết phải tách các lớp cũng như tất cả 3072 kích thước; đúng rồi. Nhưng 50 PC và 3072 kích thước được xây dựng lại từ 50 PC tách các lớp thành chính xác cùng một mức độ . Đó là một thực tế toán học đơn giản. Bạn có thể đào tạo NN về tái tạo và chuyển đổi thủ công thành NN hoạt động trên PC và nó sẽ hoạt động tốt. Tôi không thể giải thích lý do tại sao mạng của bạn hoạt động tốt hơn với các bản dựng lại.
amip

Câu trả lời:


1

Tôi đồng ý với tất cả ý kiến ​​của @amoeba. Nhưng sẽ thêm một vài điều.

Lý do PCA được sử dụng trên hình ảnh là vì nó hoạt động như 'lựa chọn tính năng': các đối tượng trải rộng trên nhiều pixel, do đó, các thay đổi tương quan trên nhiều pixel là biểu thị của các đối tượng. Vứt bỏ các thay đổi Pixel không tương quan sẽ loại bỏ 'nhiễu' có thể dẫn đến việc khái quát hóa kém.

Nói chung, nns (sử dụng độ dốc giảm dần) làm tốt hơn với các đầu vào hình cầu (nghĩa là các đầu vào chuẩn hóa không tương quan), điều này là do bề mặt lỗi của bạn sẽ đối xứng hơn và do đó tốc độ học đơn lẻ hoạt động tốt hơn (bạn cần một tốc độ học tập nhỏ ở độ cong cao phương hướng và tỷ lệ học tập lớn theo hướng nông).

Bạn đã bình thường hóa đầu vào của bạn (tốt) là tốt hay chỉ là giải mã?

Bạn đã sử dụng l2 thường xuyên? Điều này có tác dụng tương tự như chính quy PCA. Đối với các đầu vào tương quan, nó nhấn mạnh các trọng số tương tự nhỏ (nghĩa là lấy trung bình nhiễu, xử phạt các trọng số lớn để các pixel đơn lẻ không thể có tác động không tương xứng đến phân loại) (ví dụ: các yếu tố của sách học thống kê), vì vậy có lẽ bạn thấy không có lợi cho PCA vì l2 chính quy hóa đã có hiệu quả. Hoặc có lẽ nn quá nhỏ để vượt qua.

Cuối cùng, bạn đã mở lại các tham số ... Tôi hy vọng bạn sẽ cần tốc độ học tập khác nhau và các tham số khác sau khi thay đổi thành k thành phần chính đầu tiên.


0

Theo định nghĩa, PCA loại bỏ mối tương quan giữa các biến. Nó được sử dụng trước khi phân loại vì không phải tất cả các bộ phân loại có thể xử lý tốt dữ liệu chiều cao (nhưng mạng lưới thần kinh có thể) và không phải tất cả các bộ phân loại có thể xử lý tốt với các biến tương quan (nhưng mạng lưới thần kinh có thể). Đặc biệt với hình ảnh, bạn thường không muốn loại bỏ mối tương quan và bạn cũng muốn nhiều lớp sao cho các pixel lân cận có thể được tổng hợp thành các tính năng hình ảnh. Kết quả thử nghiệm của bạn phản ánh sự lựa chọn kém của kỹ thuật này cho nhiệm vụ cụ thể này.


0

Nếu hình ảnh của bạn (hình ảnh mà bạn vectơ sao cho mỗi hình ảnh bây giờ là một hàng đơn với cột M trong đó M là tổng số pixel x 32 x 32 x 3) chứa ít hoặc không có tương quan, thì số lượng thành phần nguyên tắc cần có giải thích hầu hết các phương sai (ví dụ> 95%) trong dữ liệu của bạn tăng. Để xác định PCA "khả thi" như thế nào, kiểm tra phương sai được giải thích là một ý tưởng tốt. Trong trường hợp của bạn, do ma trận dữ liệu của bạn có kích thước NxM trong đó M> N, số lượng thành phần tối đa là N. Nếu số lượng PC cần thiết là gần 50000, thì sử dụng PCA không có ý nghĩa gì. Bạn có thể tính toán phương sai được giải thích bằng cách:

explained variance = 
sum of the eigenvalues that correspond to the PCs you use / 
sum of ALL eigenvalues

Tôi sẽ chọn số lượng các thành phần nguyên tắc giải thích ít nhất hơn 90% phương sai. Một phương pháp khác để chọn đúng số lượng PC là vẽ số lượng PC so với biểu đồ phương sai tích lũy được giải thích. Trong cốt truyện, bạn có thể chọn số mà phương sai được giải thích không tăng đáng kể nữa.

Vì vậy, tôi nghĩ rằng vấn đề của bạn có thể là chọn một số lượng lớn PC.

Một vấn đề khác có thể liên quan đến việc chiếu các mẫu thử. Khi bạn chia các mẫu của mình để xây dựng NN và để kiểm tra NN, bạn cần phải chiếu bộ dữ liệu thử nghiệm bằng cách sử dụng các hàm riêng có được từ tập dữ liệu huấn luyện.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.