Kiến trúc CNN cho hồi quy?


32

Tôi đã làm việc với một vấn đề hồi quy trong đó đầu vào là một hình ảnh và nhãn là giá trị liên tục trong khoảng từ 80 đến 350. Hình ảnh là một số hóa chất sau khi xảy ra phản ứng. Màu sắc cho thấy nồng độ của một hóa chất khác còn sót lại, và đó là những gì mô hình tạo ra - nồng độ của hóa chất đó. Các hình ảnh có thể được xoay, lật, nhân đôi và đầu ra dự kiến ​​vẫn giống nhau. Loại phân tích này được thực hiện trong các phòng thí nghiệm thực tế (các máy rất chuyên dụng tạo ra nồng độ của các hóa chất sử dụng phân tích màu giống như tôi đang đào tạo mô hình này để làm).

Cho đến nay, tôi chỉ thử nghiệm với các mô hình dựa trên VGG (nhiều chuỗi khối khối đối lưu). Trước khi thử nghiệm các kiến ​​trúc gần đây hơn (Inception, ResNets, v.v.), tôi nghĩ tôi nên nghiên cứu nếu có các kiến ​​trúc khác thường được sử dụng để hồi quy bằng hình ảnh.

Bộ dữ liệu trông như thế này:

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

Bộ dữ liệu chứa khoảng 5.000 mẫu 250x250, mà tôi đã thay đổi kích thước thành 64x64 để việc đào tạo dễ dàng hơn. Khi tôi tìm thấy một kiến ​​trúc đầy hứa hẹn, tôi sẽ thử nghiệm với hình ảnh có độ phân giải lớn hơn.

Cho đến nay, các mô hình tốt nhất của tôi có lỗi bình phương trung bình trên cả hai tập huấn luyện và xác nhận khoảng 0,3, không thể chấp nhận được trong trường hợp sử dụng của tôi.

Mô hình tốt nhất của tôi cho đến nay trông như thế này:

// pseudo code
x = conv2d(x, filters=32, kernel=[3,3])->batch_norm()->relu()
x = conv2d(x, filters=32, kernel=[3,3])->batch_norm()->relu()
x = conv2d(x, filters=32, kernel=[3,3])->batch_norm()->relu()
x = maxpool(x, size=[2,2], stride=[2,2])

x = conv2d(x, filters=64, kernel=[3,3])->batch_norm()->relu()
x = conv2d(x, filters=64, kernel=[3,3])->batch_norm()->relu()
x = conv2d(x, filters=64, kernel=[3,3])->batch_norm()->relu()
x = maxpool(x, size=[2,2], stride=[2,2])

x = conv2d(x, filters=128, kernel=[3,3])->batch_norm()->relu()
x = conv2d(x, filters=128, kernel=[3,3])->batch_norm()->relu()
x = conv2d(x, filters=128, kernel=[3,3])->batch_norm()->relu()
x = maxpool(x, size=[2,2], stride=[2,2])

x = dropout()->conv2d(x, filters=128, kernel=[1, 1])->batch_norm()->relu()
x = dropout()->conv2d(x, filters=32, kernel=[1, 1])->batch_norm()->relu()

y = dense(x, units=1)

// loss = mean_squared_error(y, labels)

Câu hỏi

Kiến trúc thích hợp cho đầu ra hồi quy từ đầu vào hình ảnh là gì?

Chỉnh sửa

Tôi đã đọc lại lời giải thích của mình và loại bỏ đề cập về tính chính xác.

Chỉnh sửa 2

Tôi đã cấu trúc lại câu hỏi của mình để hy vọng nó rõ ràng những gì tôi đang theo đuổi


4
Độ chính xác không phải là một biện pháp có thể được áp dụng trực tiếp cho các vấn đề hồi quy. Ý bạn là gì khi bạn nói độ chính xác của bạn là 30%? Độ chính xác thực sự chỉ áp dụng cho các nhiệm vụ phân loại, không phải hồi quy.
Hạt nhân Wang

1
Bạn có ý nghĩa gì bởi "dự đoán chính xác 30% thời gian" ? Bạn có thực sự làm hồi quy?
Firebug

1
Tại sao bạn gọi đây là hồi quy vấn đề? Không phải bạn đang cố gắng phân loại thành nhãn? là nhãn hồng y?
Aksakal

2
Tôi không muốn điều tương tự như vgg. Tôi đang làm một cái gì đó giống như vgg, có nghĩa là một loạt các xác nhận theo sau là nhóm tối đa, tiếp theo là kết nối đầy đủ. Có vẻ như một cách tiếp cận chung để làm việc với hình ảnh. Nhưng một lần nữa, đó là toàn bộ câu hỏi ban đầu của tôi. Có vẻ như tất cả những bình luận này, mặc dù sâu sắc đối với tôi, hoàn toàn bỏ lỡ quan điểm của những gì tôi đang hỏi ở nơi đầu tiên.
Rodrigo-silveira

1
Ngoài ra, chúng tôi có thể cung cấp trợ giúp tốt hơn nếu bạn mô tả rõ hơn về vấn đề. 1) những hình ảnh là gì? Nghị quyết của họ là gì? Có mối quan hệ nào giữa hình ảnh và phản hồi của bạn, ? Là mối quan hệ xoay vòng bất biến, tức là, nếu tôi xoay hình ảnh tròn của bạn theo một góc tùy ý , tôi có mong muốn thay đổi không? 2) Bạn có biết rằng 5000 hình ảnh để đào tạo kiến ​​trúc mạng VGG là một sự khốn khổ? Bạn đã tính số lượng tham số của kiến ​​trúc của bạn? Có cách nào bạn có thể nhận được nhiều hình ảnh? Nếu bạn không thể, thì có lẽ bạn cần ...y[80,350]θy
DeltaIV 21/03/18

Câu trả lời:


42

Trước hết là một gợi ý chung: thực hiện tìm kiếm tài liệu trước khi bạn bắt đầu thực hiện các thử nghiệm về một chủ đề mà bạn không quen thuộc. Bạn sẽ tiết kiệm cho mình rất nhiều thời gian.

Trong trường hợp này, nhìn vào các giấy tờ hiện có bạn có thể nhận thấy rằng

  1. Các CNN đã được sử dụng nhiều lần để hồi quy: đây là một tác phẩm kinh điển nhưng nó đã cũ (vâng, 3 năm tuổi là DL). Một bài báo hiện đại hơn sẽ không sử dụng AlexNet cho nhiệm vụ này. Đây là vấn đề gần đây hơn, nhưng nó là một vấn đề phức tạp hơn nhiều (xoay 3D) và dù sao tôi cũng không quen với nó.
  2. Hồi quy với CNN không phải là một vấn đề nhỏ. Nhìn lại bài báo đầu tiên, bạn sẽ thấy rằng họ có một vấn đề về cơ bản họ có thể tạo ra dữ liệu vô hạn. Mục tiêu của họ là dự đoán góc quay cần thiết để chỉnh sửa hình ảnh 2D. Điều này có nghĩa là về cơ bản tôi có thể lấy tập huấn luyện của mình và tăng cường nó bằng cách xoay từng hình ảnh theo các góc tùy ý và tôi sẽ có được một tập huấn luyện lớn hơn, hợp lệ. Do đó, vấn đề có vẻ tương đối đơn giản, theo như các vấn đề của Deep Learning. Nhân tiện, lưu ý các thủ thuật tăng dữ liệu khác mà họ sử dụng:

    Chúng tôi sử dụng các bản dịch (tối đa 5% chiều rộng hình ảnh), điều chỉnh độ sáng trong phạm vi [.20.2, 0.2], điều chỉnh gamma với ∈ [.50.5, 0.1] và nhiễu pixel Gaussian với độ lệch chuẩn trong phạm vi [0 , 0,02].

    Tôi không biết rõ vấn đề của bạn đủ để nói nếu có ý nghĩa khi xem xét các biến thể về vị trí, độ sáng và nhiễu gamma cho ảnh của bạn, cẩn thận chụp trong phòng thí nghiệm. Nhưng bạn luôn có thể thử và xóa nó nếu nó không cải thiện mất bộ kiểm tra của bạn. Trên thực tế, bạn thực sự cần sử dụng một bộ xác nhận hoặc gấp chéo xác nhận cho các loại thí nghiệm, và không nhìn vào các thiết lập thử nghiệm cho đến khi bạn đã xác định thiết lập của bạn, nếu bạn muốn mất kiểm tra các thiết lập để đại diện cho các lỗi tổng quát hóa.k

    Dù sao, ngay cả trong điều kiện lý tưởng của họ, cách tiếp cận ngây thơ cũng không hiệu quả (phần 4.2 ). Họ đã loại bỏ lớp đầu ra (lớp softmax) và thay thế nó bằng một lớp có hai đơn vị dự đoán sin và cosine của góc xoay. Góc thực tế sau đó sẽ được tính là . Mạng nơ-ron cũng được xử lý trước trên ImageNet (đây được gọi là học chuyểnyxα=atan2(y,x)). Tất nhiên, việc đào tạo trên ImageNet là cho một nhiệm vụ khác (phân loại), nhưng vẫn đào tạo mạng lưới thần kinh từ đầu phải có kết quả khủng khiếp đến mức họ quyết định không công bố chúng. Vì vậy, bạn đã có tất cả các thành phần để tạo ra một món trứng tráng tốt: dữ liệu đào tạo có khả năng vô hạn, một mạng lưới được xử lý trước và một vấn đề hồi quy rõ ràng đơn giản (dự đoán hai số từ -1 đến 1). Tuy nhiên, cách tốt nhất họ có thể nhận được với phương pháp này là lỗi 21 °. Không rõ đây có phải là lỗi RMSE, lỗi MAD hay không, nhưng vẫn không có gì đáng kể: vì lỗi tối đa bạn có thể mắc phải là 180 °, lỗi trung bình là lỗi tối đa có thể xảy ra. Họ đã làm tốt hơn một chút bằng cách sử dụng hai mạng nối tiếp: mạng đầu tiên sẽ thực hiện phân loại (dự đoán liệu góc sẽ nằm trong>11%[180°,90°],[90°,0°],[0°,90°] hoặc lớp), sau đó là hình ảnh, được xoay theo số lượng dự đoán của mạng đầu tiên , sẽ được đưa đến một mạng thần kinh khác (để hồi quy, lần này), dự đoán vòng quay bổ sung cuối cùng trong phạm vi .[90°,180°][45°,45°]

    Trong một vấn đề đơn giản hơn (xoay vòng MNIST), bạn có thể nhận được một cái gì đó tốt hơn , nhưng bạn vẫn không đi dưới một lỗi RMSE, đó là lỗi tối đa có thể.2.6%

Vậy, chúng ta có thể học được gì từ điều này? Trước hết, 5000 hình ảnh đó là một tập dữ liệu nhỏ cho nhiệm vụ của bạn. Bài báo đầu tiên sử dụng một mạng được xử lý trước trên các hình ảnh tương tự như mạng mà họ muốn học tác vụ hồi quy: không chỉ bạn cần học một nhiệm vụ khác với kiến ​​trúc được thiết kế (phân loại), mà tập huấn luyện của bạn không Tất cả đều không giống bất kỳ tập huấn luyện nào mà các mạng này thường được đào tạo (CIFAR-10/100 hoặc ImageNet). Vì vậy, bạn có thể sẽ không nhận được bất kỳ lợi ích từ việc học chuyển nhượng. Ví dụ MATLAB có 5000 hình ảnh, nhưng chúng có màu đen và trắng và về mặt ngữ nghĩa đều rất giống nhau (tốt, đây cũng có thể là trường hợp của bạn).

Sau đó, làm thế nào thực tế là làm tốt hơn 0,3? Trước hết chúng ta phải hiểu ý của bạn khi mất trung bình 0,3. Bạn có nghĩa là lỗi RMSE là 0,3,

1Ni=1N(h(xi)yi)2

Trong đó là kích thước của tập huấn luyện của bạn (do đó, ), là đầu ra của CNN của bạn cho hình ảnh và là nồng độ tương ứng của hóa chất? Vì , sau đó giả sử rằng bạn cắt các dự đoán về CNN của mình trong khoảng từ 80 đến 350 (hoặc bạn chỉ sử dụng một logit để làm cho chúng phù hợp trong khoảng đó), bạn sẽ nhận được ít hơn . Nghiêm túc mà nói, bạn mong đợi điều gì? Tôi dường như không phải là một lỗi lớn.NN<5000h(xi)xiyiyi[80,350]0.12%

Ngoài ra, chỉ cần thử tính toán số lượng tham số trong mạng của bạn: Tôi đang vội và tôi có thể đang mắc phải những lỗi ngớ ngẩn, vì vậy, bằng mọi cách hãy kiểm tra kỹ các tính toán của tôi với một số summarychức năng từ bất kỳ khuôn khổ nào bạn có thể đang sử dụng. Tuy nhiên, đại khái tôi sẽ nói bạn có

9×(3×32+2×32×32+32×64+2×64×64+64×128+2×128×128)+128×128+128×32+32×32×32=533344

(lưu ý tôi đã bỏ qua các tham số của các lớp định mức hàng loạt, nhưng chúng chỉ là 4 tham số cho lớp để chúng không tạo ra sự khác biệt). Bạn có nửa triệu thông số và 5000 ví dụ ... bạn mong đợi điều gì? Chắc chắn, số lượng tham số không phải là một chỉ số tốt cho khả năng của mạng thần kinh (đó là mô hình không thể nhận dạng), nhưng vẫn ... Tôi không nghĩ bạn có thể làm tốt hơn thế này, nhưng bạn có thể thử vài điều:

  • chuẩn hóa tất cả các đầu vào (ví dụ: điều chỉnh lại cường độ RGB của từng pixel trong khoảng từ -1 đến 1 hoặc sử dụng tiêu chuẩn hóa) và tất cả các đầu ra. Điều này đặc biệt sẽ giúp nếu bạn có vấn đề hội tụ.
  • đi tới thang độ xám: điều này sẽ làm giảm các kênh đầu vào của bạn từ 3 xuống 1. Tất cả các hình ảnh của bạn dường như (với con mắt không được kiểm soát chặt chẽ của tôi) có màu tương đối giống nhau. Bạn có chắc chắn đó là màu sắc cần thiết để dự đoán , và không phải là sự tồn tại của các vùng tối hơn hoặc sáng hơn? Có thể bạn chắc chắn (tôi không phải là chuyên gia): trong trường hợp này bỏ qua đề xuất này.y
  • tăng dữ liệu: vì bạn đã nói rằng lật, xoay theo một góc tùy ý hoặc phản chiếu hình ảnh của bạn sẽ dẫn đến cùng một đầu ra, bạn có thể tăng kích thước của tập dữ liệu của mình lên rất nhiều . Lưu ý rằng với một tập dữ liệu lớn hơn, lỗi trên tập huấn luyện sẽ tăng lên: điều chúng tôi đang tìm kiếm ở đây là một khoảng cách nhỏ hơn giữa mất tập huấn luyện và mất tập kiểm tra. Ngoài ra, nếu tổn thất tập huấn tăng lên rất nhiều, đây có thể là tin tốt: điều đó có nghĩa là bạn có thể đào tạo một mạng lưới sâu hơn trên tập huấn luyện lớn hơn này mà không có nguy cơ bị thừa. Hãy thử thêm nhiều lớp hơn và xem bây giờ bạn có được một tập huấn luyện nhỏ hơn mất tập kiểm tra không. Cuối cùng, bạn cũng có thể thử các thủ thuật tăng dữ liệu khác mà tôi đã trích dẫn ở trên, nếu chúng có ý nghĩa trong ngữ cảnh của ứng dụng của bạn.
  • sử dụng thủ thuật hồi quy phân loại-sau đó: một mạng đầu tiên chỉ xác định xem có nên ở một trong số 10 thùng không, chẳng hạn như , v.v. Sau đó, một mạng thứ hai sẽ tính toán hiệu chỉnh : định tâm và chuẩn hóa cũng có thể giúp ở đây. Không thể nói mà không thử.y[80,97],[97,124][0,27]
  • hãy thử sử dụng một kiến ​​trúc hiện đại (Inception hoặc ResNet) thay vì kiến ​​trúc cổ điển. ResNet thực sự có ít tham số hơn VGG-net. Tất nhiên, bạn muốn sử dụng các ResNets nhỏ ở đây - Tôi không nghĩ ResNet-101 có thể giúp trên bộ dữ liệu 5000 hình ảnh. Bạn có thể tăng dữ liệu rất nhiều, mặc dù ....
  • Do đầu ra của bạn là bất biến đối với phép quay, nên một ý tưởng tuyệt vời khác là sử dụng các CNN tương đương nhóm , có đầu ra (khi được sử dụng làm phân loại) là bất biến đối với các phép quay rời rạc hoặc CNN có thể điều khiển đượccó đầu ra là bất biến đối với các phép quay liên tục. Thuộc tính bất biến sẽ cho phép bạn có được kết quả tốt với việc tăng dữ liệu ít hơn nhiều, hoặc lý tưởng là không có gì cả (đối với những gì nó liên quan đến xoay vòng: tất nhiên bạn vẫn cần các loại da khác). Các CNN tương đương nhóm trưởng thành hơn các CNN có thể điều khiển theo quan điểm triển khai, vì vậy trước tiên tôi nên thử các CNN nhóm. Bạn có thể thử phân loại hồi quy-sau đó, sử dụng G-CNN cho phần phân loại hoặc bạn có thể thử nghiệm phương pháp hồi quy thuần túy. Hãy nhớ thay đổi lớp trên cùng cho phù hợp.
  • thử nghiệm với kích thước lô (vâng, vâng, tôi biết siêu đường kính - hack không thú vị, nhưng đây là cách tốt nhất tôi có thể đi kèm trong khung thời gian giới hạn & miễn phí :-)
  • cuối cùng, có những kiến ​​trúc đã được phát triển đặc biệt để đưa ra dự đoán chính xác với các tập dữ liệu nhỏ. Hầu hết trong số họ đã sử dụng các cấu trúc giãn nở : một ví dụ nổi tiếng là mạng lưới thần kinh tích chập dày đặc quy mô hỗn hợp . Việc thực hiện không phải là nhỏ, mặc dù.

3
Cảm ơn bạn đã trả lời chi tiết. Tôi đã và đang làm tăng dữ liệu quan trọng. Đã thử một vài biến thể của mô hình khởi động (trong đó một biến thể có nghĩa là số lượng bộ lọc được chia tỷ lệ bằng nhau trên toàn bộ mô hình). Saw cải tiến đáng kinh ngạc. Vẫn có cách để đi. Tôi sẽ thử một vài gợi ý của bạn. Cảm ơn một lần nữa.
Rodrigo-silveira

@ Rodrigo-silveira bạn được chào đón, hãy cho tôi biết mọi chuyện diễn ra như thế nào. Có lẽ chúng ta có thể nói chuyện trong khi trò chuyện khi bạn có kết quả.
DeltaIV

1
Câu trả lời tuyệt vời, xứng đáng hơn ^
Gilly

1
Sáng tác rất tốt!
Karthik Thiagarajan

1
Tôi sẽ cho bạn 10k điểm cho việc này nếu tôi có thể. Câu trả lời tuyệt vời
Boppity Bop
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.