Làm cách nào để xử lý hình ảnh có kích thước lớn trong CNN?


15

Giả sử có 10K hình ảnh có kích thước 2400 x 2400 được yêu cầu sử dụng trong CNN.Acc theo quan điểm của tôi, các máy tính thông thường mà mọi người sử dụng sẽ được sử dụng. Bây giờ câu hỏi là làm thế nào để xử lý kích thước hình ảnh lớn như vậy trong đó không có đặc quyền của downsampling.

Đây là yêu cầu hệ thống: -

Ubuntu 16.04 RAM 64 bit GPU 16 GB 8 GB HDD 500 GB

1) Có kỹ thuật nào để xử lý những hình ảnh lớn như vậy sẽ được đào tạo không?
2) Kích thước lô nào là hợp lý để sử dụng?
3) Có biện pháp phòng ngừa nào để thực hiện hoặc tăng giảm tài nguyên phần cứng mà tôi có thể làm không?

Câu trả lời:


14

Bây giờ câu hỏi là làm thế nào để xử lý các kích thước hình ảnh lớn như vậy trong đó không có đặc quyền của downsampling

Tôi giả sử rằng bằng cách lấy mẫu xuống, bạn có nghĩa là thu nhỏ đầu vào trước khi chuyển nó vào CNN. Lớp kết hợp cho phép thu nhỏ hình ảnh trong mạng, bằng cách chọn một bước tiến lớn, sẽ tiết kiệm tài nguyên cho các lớp tiếp theo. Trên thực tế, đó là những gì nó phải làm, nếu không mô hình của bạn sẽ không phù hợp với GPU.

1) Có kỹ thuật nào để xử lý những hình ảnh lớn như vậy sẽ được đào tạo không?

Các nghiên cứu thường quy mô hình ảnh đến một kích thước có thể cộng hưởng. Nhưng nếu đó không phải là một lựa chọn cho bạn, bạn sẽ cần hạn chế CNN của mình. Ngoài việc lấy mẫu xuống ở các lớp đầu, tôi khuyên bạn nên loại bỏ lớp FC (thường lấy hầu hết các tham số) để ủng hộ lớp chập . Ngoài ra, bạn sẽ phải truyền dữ liệu của mình theo từng kỷ nguyên, vì nó sẽ không phù hợp với GPU của bạn.

Lưu ý rằng không có gì trong số này sẽ ngăn tải trọng tính toán nặng ở các lớp đầu, chính xác là do đầu vào quá lớn: tích chập là một hoạt động đắt tiền và các lớp đầu tiên sẽ thực hiện rất nhiều trong số chúng trong mỗi lần chuyển tiếp và lùi. Tóm lại, đào tạo sẽ chậm.

2) Kích thước lô nào là hợp lý để sử dụng?

Đây là một vấn đề khác. Một hình ảnh duy nhất2400x2400x3x4 (3 kênh và 4 byte cho mỗi pixel) là ~ 70Mb, do đó bạn khó có thể mua được ngay cả kích thước lô 10. Thực tế hơn sẽ là 5. Lưu ý rằng hầu hết bộ nhớ sẽ được lấy bởi các tham số CNN. Tôi nghĩ trong trường hợp này, việc giảm kích thước bằng cách sử dụng các giá trị 16 bit thay vì 32 bit có ý nghĩa - theo cách này bạn sẽ có thể nhân đôi các đợt.

3) Có biện pháp phòng ngừa nào để thực hiện hoặc tăng giảm tài nguyên phần cứng mà tôi có thể làm không?

Nút thắt của bạn là bộ nhớ GPU. Nếu bạn có thể mua GPU khác, hãy lấy nó và chia mạng qua chúng. Mọi thứ khác đều không đáng kể so với bộ nhớ GPU.


1
Cảm ơn bạn. Tôi đã làm theo một số gợi ý bạn cung cấp trong câu trả lời này. Câu trả lời tốt.
WaterRocket8236

5

Thông thường đối với hình ảnh, bộ tính năng là các giá trị mật độ pixel và trong trường hợp này, nó sẽ dẫn đến một bộ tính năng khá lớn; cũng không nên lấy mẫu hình ảnh vì bạn có thể bị mất (thực tế sẽ) mất dữ liệu quan trọng.

[1] Nhưng có một số kỹ thuật có thể giúp bạn giảm kích thước tập hợp tính năng, các cách tiếp cận như PCA (Phân tích thành phần nguyên tắc) giúp bạn lựa chọn tập hợp tính năng quan trọng.

Để biết thông tin chi tiết, xem liên kết http://spark.apache.org/docs/latest/ml-features.html#pca .

[2] Ngoài ra để giảm chi phí tính toán trong khi đào tạo Mạng thần kinh của bạn, bạn có thể sử dụng Stochastic Gradient Descent, thay vì sử dụng phương pháp Gradient Descent thông thường, điều này sẽ làm giảm kích thước của tập dữ liệu cần thiết cho đào tạo trong mỗi lần lặp. Do đó, kích thước tập dữ liệu của bạn được sử dụng trong một lần lặp sẽ giảm, do đó sẽ giảm thời gian cần thiết để đào tạo Mạng.

Kích thước lô chính xác được sử dụng phụ thuộc vào phân phối của bạn cho tập dữ liệu huấn luyện và tập dữ liệu thử nghiệm, sử dụng chung hơn là 70-30. Nơi bạn cũng có thể sử dụng phương pháp Stochastic đã đề cập ở trên để giảm thời gian cần thiết.

Chi tiết cho Stochastic Gradient Descent http://scikit-learn.org/urdy/modules/sgd.html

[3] Phần cứng có vẻ thích hợp cho việc nâng cấp sẽ được yêu cầu, tuy nhiên nếu được yêu cầu hãy xem các giải pháp đám mây như AWS nơi bạn có thể nhận đăng ký tài khoản miễn phí cho đến giới hạn sử dụng.


Cảm ơn bạn đã trả lời. Cập nhật câu trả lời nếu bạn có thêm thông tin.
WaterRocket8236

Cảm ơn liên kết đó trên Stochastic Gradient Descent và chào mừng bạn đến với AI!
DukeZhou

2

Dữ liệu lớn như vậy không thể được tải vào bộ nhớ của bạn. Hãy chia những gì bạn có thể làm thành hai:

  1. Rescale tất cả các hình ảnh của bạn để kích thước nhỏ hơn. Bạn có thể bán lại chúng thành 112x112 pixel. Trong trường hợp của bạn, vì bạn có một hình ảnh vuông, sẽ không cần phải cắt xén. Bạn vẫn sẽ không thể tải tất cả những hình ảnh này vào RAM của mình tại một mục tiêu.

  2. Tùy chọn tốt nhất là sử dụng chức năng tạo sẽ cung cấp dữ liệu theo lô. Vui lòng tham khảo việc sử dụng fit_generator như được sử dụng trong Keras. Nếu các tham số mô hình của bạn trở nên quá lớn để phù hợp với bộ nhớ GPU, hãy xem xét sử dụng chuẩn hóa hàng loạt hoặc sử dụng mô hình Residual để giảm số lượng tham số của bạn.


3
Tại sao bạn chọn kích thước 112x112 pixel? Nó không có tiềm năng là 2 và không phải là số chia của 2400.
Andi R

@AndiR. Đây là điều. Khi nói đến kích thước đầu vào, người ta có thể tự do chọn kích thước bao giờ. Điều này là do, nếu có bất kỳ sự không tương thích về kích thước nào trong mạng, điều này có thể dễ dàng được giải quyết bằng cách sử dụng phần đệm bằng không. Vì vậy, không có phương pháp cố định cho kích thước của đầu vào. Điều người ta phải cẩn thận là đảm bảo lấy mẫu quá nhiều không ảnh hưởng đến chất lượng đầu vào. Xin hãy xem bài viết này sử dụng kích thước 112x112. ( cv-foundation.org/openaccess/content_iccv_2015/ con / xỉ )
đáyne
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.