2009-12-04 88 views
24

từ kinh nghiệm của bạn, đó là phương pháp hiệu quả nhất để triển khai các mạng nơron nhân tạo nguyên mẫu? Đó là rất nhiều hype về R (miễn phí, nhưng tôi đã không làm việc với nó) hoặc Matlab (không miễn phí), một lựa chọn khác có thể là sử dụng một ngôn ngữ như C++/Java/C#. Câu hỏi này chủ yếu nhắm vào những người đã thử nghiệm một số kiến ​​trúc mạng thần kinh hoặc thuật toán học tập.Tạo mẫu mạng thần kinh

Nếu bạn chọn sử dụng ngôn ngữ lập trình khác với ba ngôn ngữ được đề cập ở trên, bạn có thể cho tôi biết tên của họ và một số giải thích liên quan đến lựa chọn của bạn không (ngoại trừ: đây là ngôn ngữ duy nhất/được sử dụng nhiều nhất mà tôi biết).

Cảm ơn.

+0

Tôi đề nghị blog của tôi [post] (http://www.parallelr.com/r-deep-neural-network-from-scratch/) giới thiệu cách triển khai NN cơ bản với R và được tăng tốc bằng GPU. Hy vọng hữu ích. – Patric

Trả lời

27

Vì các mạng nơron được các nhà khoa học sử dụng rất nhiều, và không quá nhiều bởi các lập trình viên, hãy chọn ngôn ngữ lập trình nhằm vào các nhà khoa học và cung cấp thư viện tốt cho mạng thần kinh.

Python là lựa chọn hợp lý vì nó được các nhà khoa học sử dụng rộng rãi. Hai phân phối để bắt đầu với những

http://www.pythonxy.com/

http://code.enthought.com/

Những phân phối Python bao gồm rất nhiều add-on module không có trong thư viện Python chuẩn nhưng mà rất hữu ích cho các loại lập trình các nhà khoa học làm. Tìm kiếm chỉ mục gói Python đi kèm với một vài gói mạng thần kinh có thể được chấp nhận nếu bạn chỉ tìm hiểu về mạng thần kinh.

http://pypi.python.org/pypi?:action=search&term=neural&submit=search

Tuy nhiên, nếu bạn đang làm việc nghiêm túc với Neural Networks bạn sẽ muốn một cái gì đó như thư viện nhanh Neural Network. Điều này đi kèm với bindings Python để bạn có thể làm lập trình của bạn trong Python, sử dụng nhiều mô-đun Python cho đồ thị, visualization, thao tác dữ liệu và như vậy. Tuy nhiên, các mạng thần kinh của bạn sẽ chạy bằng cách sử dụng mã được biên dịch được optmised từ thư viện FANN. Tốt nhất của cả hai thế giới.

Nói cách khác, để chạy mã mạng thần kinh thực tế, bạn cần C, không phải Java. Vì các thư viện C không tích hợp tốt với Java, hãy chọn một ngôn ngữ tích hợp trơn tru với các thư viện C. Python làm điều đó và cũng khá hiệu quả hơn Java vì có rất ít dòng mã cần thiết để giải thích các thuật toán của bạn. Một số người đã tìm thấy năng suất tăng gấp 10 lần so với Java.

Bạn đã đề cập R, có lẽ vì nó có chức năng thống kê mà bạn sẽ cần sử dụng hoặc có thể bạn có những người có thể viết mã R. Một lần nữa, việc chọn Python so với R không phải là một trong hai quyết định. Bạn có thể sử dụng cả hai.

Thư viện RPY cho phép các chương trình Python truy cập vào thư viện và mã R. Sử dụng này, bạn sẽ viết chương trình chính của bạn bằng Python và điều trị R như một công cụ để cung cấp các thư viện, trong cùng một cách mà bạn sử dụng các thư viện Fann được viết bằng C.

http://rpy.sourceforge.net/

Có một mô-đun được gọi là RSPython hoạt động theo cả hai cách, sao cho các chương trình R có thể truy cập các thư viện được viết bằng Python. Điều này sẽ hữu ích nếu bạn có một lập trình viên R chuyên gia giúp bạn.

http://www.omegahat.org/RSPython/

Và đó không phải là tất cả. Bạn có thể tận dụng Python để đơn giản hóa lập trình Java. Nếu bạn có một công cụ mạng nơron Java, bạn vẫn có thể viết hầu hết chương trình của mình bằng Python sử dụng phiên bản Jython chạy trên máy ảo Java và cho phép bạn sử dụng bất kỳ thư viện Java và các lớp nào trong mã của bạn. Và bạn vẫn có thể sử dụng thư viện FANN nhanh chóng vì chúng cung cấp các ràng buộc cho các chương trình Java.

Lý do chính mà tôi khuyên dùng Python cho công việc của bạn là nó được sử dụng bởi rất nhiều nhà khoa học, đó là lý do tại sao có hai bản phân phối theo định hướng khoa học.Lý do thứ hai là Python rất dễ lập trình cho người mới bắt đầu, và trong việc khám phá các mạng nơron, bạn có thể bắt đầu với các mô phỏng đơn giản hơn và làm việc với những người phức tạp hơn với thao tác dữ liệu và phân tích kết quả. Python sẽ cho phép bạn xây dựng thư viện mã của riêng bạn, và trở thành một lập trình viên Python chuyên môn để bạn có thể tập trung nhiều hơn sự chú ý của mình vào các vấn đề mạng thần kinh. Nếu bạn tung ra xung quanh với một chút Java, và một chút của C + + và một chút R, sau đó bạn sẽ có thể dành ít thời gian hơn trên các mạng thần kinh. Chiến lược đó có thể tốt cho những ai muốn có sự nghiệp lập trình, nhưng không phải cho người muốn đạt được một số kết quả đáng kể với mạng thần kinh.

Thậm chí nếu công việc mạng thần kinh của bạn kéo dài đến phần cứng chuyên dụng, cái gọi là chip neuromorphic, bạn vẫn có thể tận dụng Python như giấy này từ NIH cho thấy:

http://www.ncbi.nlm.nih.gov/pmc/articles/PMC2701676/

8

Tôi đã sử dụng hộp công cụ mạng thần kinh của Matlab ở một mức độ nào đó và thích nó như một công cụ tạo mẫu do giao diện đồ họa của nó cho phép bạn thiết lập mạng, thử nghiệm với kích cỡ của dữ liệu Nó chỉ có vẻ tốt đẹp và tự nhiên để bắt đầu với ...

Tôi cũng đã thử nghiệm với Joone (Java Object Oriented Neural Engine). Nó được thiết lập khá độc đáo, và tại thời điểm tôi là một chút của một nghiệp dư và vẫn không có vấn đề nhận được mạng khác nhau và chạy, với thử nghiệm. Nó là Java, vì vậy nó có thể không có hiệu suất mà bạn có thể muốn nếu bạn đang đào tạo các hệ thống phức tạp lớn, nhưng API của nó là cực kỳ dễ tiếp cận.

Tôi cũng đã thấy một số công việc được thực hiện với Flood trong C++. Nó có một loạt các lớp được thiết lập với các mạng thích hợp để giải quyết một loạt các vấn đề. Nó đáng để kiểm tra lại.

+1

Tôi đã triển khai các mạng kết nối và liên kết hoàn toàn thông thường từ đầu trong Matlab để hiểu đầy đủ mọi thứ và tạo ra một công cụ tạo mẫu. Tôi thấy rằng giữ một đối tượng tốt thiết kế định hướng mà đối tượng bọc lên vectorised mã, sau đó chuyển tiếp đánh giá và backprop là hợp lý tốt vì nó chỉ là ma trận nhân mà Matlab là [tối ưu hóa cho] (https://uk.mathworks.com/company/ bản tin/bài viết/matlab-kết hợp-lapack.html). – rnoodle

9

Tôi đã thử sử dụng cả hai ngôn ngữ cấp cao trừu tượng hơn (MATLAB, java) và các ngôn ngữ thấp hơn (C). Cả hai đều sử dụng hộp công cụ và thư viện và tự viết mã. Phản ứng tổng thể? Không phải là công cụ hoàn hảo. Hãy ghi nhớ rằng:

  • một nguyên mẫu có thể không đủ: thường bạn cần phải chạy mạng trên mẫu lớn, hoặc nhiều lần trong một tập hợp con của mẫu (trong trường hợp phát triển mạng lưới thần kinh) để có được phong nha các kết quả. Nếu bạn phải chạy mạng một triệu lần, ngay cả một hiệu suất nhỏ có thể là một trợ giúp lớn và tiết kiệm thời gian (ví dụ: C trên MATLAB);

  • nếu, mặt khác, bạn cần mã hóa dễ dàng, bạn có thể muốn sử dụng một trong nhiều thư viện được đóng gói sẵn (javaNN, v.v.);

  • bạn đang sử dụng loại mạng thần kinh nào? mạng nơron định kỳ liên tục (CTRNN)? Backprop? Làm thế nào để bạn đào tạo họ? Làm thế nào để bạn xác minh kết quả của họ? Độ chính xác có quan trọng không? (Ví dụ: bạn có đang chạy chúng trên một thiết bị nhỏ, chẳng hạn như một bảng điều khiển robot bộ nhớ hạn chế, như Arduinos?)

Nếu bạn có thời gian rảnh rỗi, tôi muốn đề nghị

  1. học các khái niệm sử dụng ngôn ngữ cấp cao hơn hoặc thậm chí là mã giả trước;
  2. khi bạn đã quen với tất cả các phức tạp, đặc biệt nếu sử dụng mạng thần kinh đang phát triển, hãy chọn ngôn ngữ họ đã quen thuộc với
  3. thì có thể bạn muốn bắt đầu nghiên cứu cách tối ưu hóa tốc độ, bộ nhớ, v.v.

Hy vọng điều này sẽ hữu ích.

1

Thông thường khi tôi đã mày mò với những các loại thuật toán, tôi thấy rằng sử dụng mã nguồn mở Weka Toolkit là một cách tuyệt vời để thử nghiệm và khám phá toàn bộ các thuật toán học tập khác nhau (không chỉ các mạng nơron nhân tạo). Những ngày này, có vẻ như chúng có các ràng buộc từ một loạt các ngôn ngữ khác nhau, vì vậy bạn không nên gắn với Java nếu bạn muốn tương tác với Weka ở cấp mã. Khi tôi tìm thấy và hiểu một thứ gì đó tuyệt vời/làm một công việc phân loại khá tốt, tôi đã viết thuật toán trong C hoặc C++ một phần để giải trí và một phần để đạt được tốc độ cần thiết để làm việc với các tập dữ liệu lớn hơn.

3

Scilab là một giải pháp thay thế nguồn mở cho Matlab.

Bạn có thể thử nghiệm với mạng thần kinh bằng cách sử dụng ANN Toolbox for Scilab.

Tập trung vào lý thuyết và thử nghiệm. Bạn đã chọn các tính năng phân biệt đối với mẫu của mình chưa? Trạng thái của tập huấn luyện và kiểm tra của bạn là gì. Đối với mỗi thử nghiệm, nghiên cứu ma trận nhầm lẫn. Bạn có một ý tưởng tại sao một mẫu được phân loại sai? Nó có vẻ hợp lý với bạn không? Nếu không, tính năng nào bạn không sử dụng sẽ giúp ích?

Triển khai tiếp theo, sử dụng ngôn ngữ bạn quen thuộc. Một ngôn ngữ được quản lý như Java hoặc C# có thể ít bị lỗi hơn: ít nhất bạn ít có khả năng làm hỏng mọi thứ vì lỗi phân phối con trỏ hoặc bộ nhớ. Tối ưu hóa đến cuối cùng (sau khi một số hồ sơ phong nha như mọi khi).

1

Sử dụng C++ và nếu mạng thần kinh của bạn đủ đơn giản, đừng sử dụng khung công tác lạ ở ngoài đó.

Có lẽ 5 năm trước, tôi đã làm một bộ giải Sokoban bằng cách sử dụng Học tập tăng cường. Vào thời điểm đó, chúng tôi quyết định đi với Java và sử dụng một số khung tác nhân được phát triển bởi một trường đại học Ý.

Quyết định tồi tệ đầu tiên ở đây là sử dụng Khung này. Về cơ bản nó có lỗi ở đây và ở đó đã khiến chúng ta lãng phí thời gian để gỡ lỗi mã của khung công tác.

Khi chúng tôi đến mức mọi thứ ổn định, việc đào tạo Mạng thần kinh chỉ chậm chạp. Chúng tôi để nó chạy qua đêm trong một cỗ máy khá mạnh và vẫn giải quyết được rất ít câu đố. Về cơ bản phân bổ đối tượng Java và thu gom rác thải đã làm tổn hại đến toàn bộ hiệu suất của hệ thống khá kém. Chúng tôi đã chỉnh sửa một chút ứng dụng bằng cách tạo các nhóm đối tượng thay vì phân bổ chúng tất cả thời gian nhưng hiệu suất của chương trình vẫn là một thứ tự độ lớn nhỏ hơn một phép gán tương tự đã được triển khai trong C++ bằng cách sử dụng ổ cắm trực tiếp.

Hy vọng điều này sẽ hữu ích!

5

Điều này tùy thuộc vào thiết lập hiện tại của bạn. Khi tôi từng làm việc với họ trong những ngày đại học, tôi đã phải sử dụng C++ + MPI + công thức nấu ăn số. Điều này đã được thực hiện bởi vì tôi đã phải tải chia sẻ trên cụm beowulf lớn.

Nếu nhu cầu tính toán của bạn không lớn, mọi thứ sẽ làm. Các thư viện được gói sẵn có sẵn trên tất cả các nền tảng (R, Python (numPy, scipy), C/C++ (công thức số) vv. Nếu bạn cảm thấy thoải mái khi lập trình trong bất kỳ một trong số họ, nó không phải là một vấn đề lớn.

Nếu tôi có để chế tạo thử nghiệm bất cứ điều gì bây giờ, tôi có thể đi với Python (chỉ vì tôi tìm thấy nó dễ dàng hơn nhiều cho prototyping)

2

Trong lớp nn của tôi trong trường chúng tôi sử dụng matlab và sau đó tôi sử dụng java cho luận án của tôi.

Tôi sẽ đề xuất java hoặc matlab. Matlab bởi vì nó có thể đã có rất nhiều những gì bạn có thể cần. Và java bởi vì nó nhanh chóng thực hiện những gì có thể bị thiếu trong các dự án mã nguồn mở. Và bao vây vì bên cạnh việc triển khai các mạng thần kinh, bạn có thể cần một số cách để hình dung chúng. Và cho rằng cá nhân tôi tin rằng java hoặc MATLAB là khá dễ dàng.

2

Tôi thích flood. Nó hoàn toàn miễn phí, toàn diện và được viết bằng C++.

6

Tôi cũng rất khuyên bạn nên dùng python. Đối với một nguyên mẫu, python là một lựa chọn tuyệt vời: nó dễ dàng hơn và nhanh hơn để lập trình, có một số lượng lớn các thư viện có sẵn, và nó được sử dụng rộng rãi trong cộng đồng khoa học.

Ngoài ra, nếu bạn đang sử dụng python, bạn cũng có thể tận dụng gói tuyệt vời PyBrain chứa thuật toán cho mạng thần kinh, học tăng cường, học tập không giám sát và các nhiệm vụ học máy khác.

2

Việc triển khai trong Matlab rất phức tạp và đầy đủ. Tôi đã tìm thấy nó đủ để đánh giá các loại mạng khác nhau. Nó cũng rất lập trình bằng cách sử dụng các giao diện bên ngoài. Tuy nhiên, vì việc triển khai các thuật toán không phải là mã nguồn mở, đôi khi khó khăn hơn khi bạn cần chuyển một đoạn mã cụ thể vào một ứng dụng bên ngoài Matlab, vì việc triển khai mã hóa các loại mạng nơron khác nhau được thực hiện bằng tay của tôi. các kết quả khác nhau.

2

Tôi đã bắt đầu viết một thực hiện NN bằng cách sử dụng C++ và thấy rằng tôi không biết đủ về toán học có liên quan ngay từ đầu. Những gì đã kết thúc lên hapenning là nó quá khó để tái cấu trúc mã như tôi đã tinh chỉnh mô hình tính toán.

Cuối cùng tôi đã đưa vào MATLAB vì nó chắc chắn là bạn đồng hành tốt hơn để học cách mạng nơron hoạt động. Tôi đã có thể thực hiện các thay đổi lớn đối với thuật toán bằng cách sử dụng một vài nét chính và vẽ đồ thị các kết quả.

Có lẽ kinh nghiệm của tôi sẽ tốt hơn nếu tôi đã sử dụng một khung tính toán ma trận đã được xây dựng. Xem xét đó là cách bạn làm 3D nên có một vài thư viện thực sự được tối ưu hóa ở đó cho hầu hết các ngôn ngữ. Heck bạn cũng có thể tận dụng Direct3D hoặc OpenGL cho điều đó, nhưng tôi chắc chắn có cái gì đó phù hợp hơn cho mạng Neural ra khỏi đó.

Tôi đoán tôi không cung cấp nhiều thông tin về những việc bạn nên làm. Tuy nhiên tôi có thể nói những gì bạn không nên làm - và đó là cố gắng để viết mã thao tác ma trận cho mình.

2

Bạn có thể muốn cung cấp cho Weka một giao diện.Nó có một số công cụ tích hợp cho những thứ như trực quan hóa dữ liệu và nó đã tồn tại trong nhiều năm nay (some screenshots).

2

Theo quan điểm của tôi khi làm việc với mạng nơron, điều quan trọng là nhận được tập huấn luyện không đúng như thế nào chính mạng được thực hiện trong mã. Tôi sẽ chọn một ngôn ngữ dựa trên loại vấn đề bạn đang cố gắng giải quyết bằng cách sử dụng mạng. Đối với chính mạng C++, C#, python và java đều có thể thực hiện được.

Bạn đang sử dụng điều này liên quan đến sự cố yêu cầu xử lý hình ảnh? Trong trường hợp đó, bạn có thể sẽ muốn một cái gì đó mà treo lên đến một thư viện xử lý hình ảnh như OpenCV dễ dàng. Hoặc có một số xử lý âm thanh liên quan?

Bạn có thể cần dễ dàng hình dung các bộ đào tạo để dễ dàng như thế nào với ngôn ngữ bạn chọn? Bạn có thể làm việc với thư viện OpenGL hoặc DirectX trực tiếp hoặc sử dụng trình bao bọc của một số loại không? Đối với DirectX, các lựa chọn là C++ và C#. Liệu mức trừu tượng cao hơn có nói rằng việc sử dụng WPF có hoạt động không?

Tôi đã sử dụng C# vì tôi quen thuộc với nó và có thể tận dụng nhiều công nghệ xử lý dữ liệu trong .net và sử dụng wpf cho mọi hình ảnh cần thiết.

3

"Encog là mạng neural network và máy học tiên tiến. Encog chứa các lớp để tạo nhiều mạng khác nhau, cũng như hỗ trợ các lớp để chuẩn hóa và xử lý dữ liệu cho các mạng nơron này. cũng có thể sử dụng GPU để tăng tốc thời gian xử lý. Bàn làm việc dựa trên GUI cũng được cung cấp để giúp mô hình hóa và đào tạo mạng nơron. Encog đã phát triển tích cực từ năm 2008. "

Encog khả dụng cho Java, C# .Net và Silverlight.

http://www.heatonresearch.com/encog

1

Vâng, nếu bạn thích nguyên mẫu nhanh thì python hoặc MATLAB có vẻ tốt nhất. Có rất nhiều thư viện có sẵn cho các mạng thần kinh. Một số thư viện được thiết kế theo cách mà chúng cung cấp cho bạn số lượng tối thiểu phạm vi điều chỉnh nhưng các thư viện như Theano cực kỳ nhanh khi hàm được biên dịch nội bộ trong C (tôi đoán là nhanh nhất cho đến ngày) và nó cung cấp cho bạn đầy đủ chức năng nội bộ tinh chỉnh. Theano là điển hình để sử dụng lúc đầu nhưng cực kỳ mạnh mẽ. Và sau đó nếu bạn muốn di chuyển từ thần kinh đến thần kinh sâu thì không có nhiều khác biệt. Kagglers chuyên nghiệp cũng có xu hướng sử dụng thư viện này. Thư viện này cũng có hỗ trợ GPU. Trong tất cả các thư viện tôi đã sử dụng, tôi thấy theano là hữu ích và mạnh mẽ nhất. Một số khung công tác nghệ thuật khác để học sâu như Caffe được phát triển trên theano.

Hy vọng điều này sẽ hữu ích.

0

Tôi đã triển khai một số nguyên mẫu mạng nơron trong Java và C/C++. Khi các vấn đề về hiệu năng, hãy sử dụng với C/C++.

Một trong những thực hiện của tôi (không được vectơ hóa) của Perceptron Multilayer cơ bản thực hiện một triệu lần lặp (với thiết lập 2 đầu vào, 4 nút ẩn và 1 đầu ra) trong chưa đầy một phút. Việc thực hiện gần như giống hệt nhau của tôi trong Java mất rất nhiều thời gian để làm điều này. Bạn cũng có thể sử dụng thư viện đại số tuyến tính như Eigen để tạo phiên bản vectơ để cải thiện tốc độ xử lý.

Hãy tưởng tượng bạn sẽ sử dụng máy của bạn cho bất kỳ loại xử lý hình ảnh nào (Nhận dạng khuôn mặt, OCR, v.v.) với, ví dụ: hình ảnh pixel 28x28.Bạn sẽ có 784 đơn vị đầu vào và ít nhất là nhiều đơn vị ẩn. Việc này tốn rất nhiều thời gian để tập luyện, vì vậy nó có ích để tiết kiệm số phút, giờ hoặc ngày quý giá.

Các vấn đề liên quan