Mạng thần kinh c ++

Genann là một thư viện tối thiểu, đã được thử nghiệm kỹ lưỡng để đào tạo và sử dụng các mạng thần kinh nhân tạo chuyển tiếp (ANN) trong C. Trọng tâm chính của nó là đơn giản, nhanh chóng, đáng tin cậy và có thể hack được. Nó đạt được điều này bằng cách chỉ cung cấp các chức năng cần thiết và thêm một chút

Đặc trưng

  • C99 không phụ thuộc
  • Chứa trong một mã nguồn duy nhất và tệp tiêu đề
  • Đơn giản
  • Nhanh chóng và chủ đề an toàn
  • Dễ dàng mở rộng
  • Thực hiện đào tạo lan truyền ngược
  • Tương thích với các phương pháp đào tạo thay thế (tối ưu hóa cổ điển, thuật toán di truyền, v.v.)
  • Bao gồm các ví dụ và bộ thử nghiệm
  • Được phát hành theo giấy phép zlib - miễn phí cho hầu hết mọi mục đích sử dụng

Xây dựng

Genann độc lập trong hai tệp. genann.cgenann.h. Để sử dụng Genann, chỉ cần thêm hai tệp đó vào dự án của bạn

Mã ví dụ

Bốn chương trình ví dụ được bao gồm trong mã nguồn

  • example1.c - Huấn luyện ANN trên hàm XOR bằng cách sử dụng lan truyền ngược
  • example2.c - Huấn luyện ANN trên hàm XOR bằng tìm kiếm ngẫu nhiên
  • example3.c - Tải và chạy ANN từ một tệp
  • genann *genann_init(int inputs, int hidden_layers, int hidden, int outputs);
    genann *genann_copy(genann const *ann);
    void genann_free(genann *ann);
    0 - Huấn luyện ANN trên bộ dữ liệu IRIS bằng cách sử dụng lan truyền ngược

Ví dụ nhanh

Chúng tôi tạo một ANN lấy 2 đầu vào, có 1 lớp gồm 3 nơ-ron ẩn và cung cấp 2 đầu ra. Nó có cấu trúc như sau

Mạng thần kinh c ++

Sau đó, chúng tôi đào tạo nó trên một tập hợp dữ liệu được gắn nhãn bằng cách sử dụng lan truyền ngược và yêu cầu nó dự đoán trên một điểm dữ liệu thử nghiệm

#include "genann.h"

/* Not shown, loading your training and test data. */
double **training_data_input, **training_data_output, **test_data_input;

/* New network with 2 inputs,
 * 1 hidden layer of 3 neurons each,
 * and 2 outputs. */
genann *ann = genann_init(2, 1, 3, 2);

/* Learn on the training set. */
for (i = 0; i < 300; ++i) {
    for (j = 0; j < 100; ++j)
        genann_train(ann, training_data_input[j], training_data_output[j], 0.1);
}

/* Run the network and see what it predicts. */
double const *prediction = genann_run(ann, test_data_input[0]);
printf("Output for the first test data point is: %f, %f\n", prediction[0], prediction[1]);

genann_free(ann);

Ví dụ này là để hiển thị cách sử dụng API, nó không hiển thị các kỹ thuật học máy tốt. Trong một ứng dụng thực tế, bạn có thể muốn tìm hiểu dữ liệu thử nghiệm theo thứ tự ngẫu nhiên. Bạn cũng muốn giám sát quá trình học để ngăn chặn quá khớp

Cách sử dụng

Tạo và giải phóng ANN

genann *genann_init(int inputs, int hidden_layers, int hidden, int outputs);
genann *genann_copy(genann const *ann);
void genann_free(genann *ann);

Việc tạo ANN mới được thực hiện bằng hàm

genann *genann_init(int inputs, int hidden_layers, int hidden, int outputs);
genann *genann_copy(genann const *ann);
void genann_free(genann *ann);
1. Các đối số của nó là số đầu vào, số lớp ẩn, số nơ ron trong mỗi lớp ẩn và số đầu ra. Nó trả về một con trỏ cấu trúc
genann *genann_init(int inputs, int hidden_layers, int hidden, int outputs);
genann *genann_copy(genann const *ann);
void genann_free(genann *ann);
2

Gọi

genann *genann_init(int inputs, int hidden_layers, int hidden, int outputs);
genann *genann_copy(genann const *ann);
void genann_free(genann *ann);
3 sẽ tạo một bản sao sâu của cấu trúc
genann *genann_init(int inputs, int hidden_layers, int hidden, int outputs);
genann *genann_copy(genann const *ann);
void genann_free(genann *ann);
2 hiện có

Gọi cho

genann *genann_init(int inputs, int hidden_layers, int hidden, int outputs);
genann *genann_copy(genann const *ann);
void genann_free(genann *ann);
5 khi bạn hoàn thành ANN do
genann *genann_init(int inputs, int hidden_layers, int hidden, int outputs);
genann *genann_copy(genann const *ann);
void genann_free(genann *ann);
1 trả lại

Đào tạo ANN

void genann_train(genann const *ann, double const *inputs,
        double const *desired_outputs, double learning_rate);

genann *genann_init(int inputs, int hidden_layers, int hidden, int outputs);
genann *genann_copy(genann const *ann);
void genann_free(genann *ann);
7 sẽ thực hiện một lần cập nhật bằng cách sử dụng lan truyền ngược tiêu chuẩn. Nó nên được gọi bằng cách chuyển vào một mảng đầu vào, một mảng đầu ra dự kiến ​​và tốc độ học tập. Xem ví dụ1. c để biết ví dụ về học với backpropagation

Mục tiêu thiết kế chính của Genann là lưu trữ tất cả các trọng số mạng trong một khối bộ nhớ liền kề. Điều này giúp đào tạo trọng số mạng dễ dàng và hiệu quả bằng cách sử dụng các thuật toán tối ưu hóa số tìm kiếm trực tiếp, chẳng hạn như Leo đồi, Thuật toán di truyền, Luyện kim mô phỏng, v.v. Các phương pháp này có thể được sử dụng bằng cách tìm kiếm trực tiếp trọng số của ANN. Mỗi cấu trúc

genann *genann_init(int inputs, int hidden_layers, int hidden, int outputs);
genann *genann_copy(genann const *ann);
void genann_free(genann *ann);
2 chứa các thành viên
genann *genann_init(int inputs, int hidden_layers, int hidden, int outputs);
genann *genann_copy(genann const *ann);
void genann_free(genann *ann);
9 và
void genann_train(genann const *ann, double const *inputs,
        double const *desired_outputs, double learning_rate);
0.
void genann_train(genann const *ann, double const *inputs,
        double const *desired_outputs, double learning_rate);
1 trỏ đến một mảng có kích thước
void genann_train(genann const *ann, double const *inputs,
        double const *desired_outputs, double learning_rate);
2 chứa tất cả các trọng số được sử dụng bởi ANN. Xem ví dụ2. c để biết ví dụ về đào tạo sử dụng tìm kiếm leo đồi ngẫu nhiên

Lưu và tải ANN

genann *genann_read(FILE *in);
void genann_write(genann const *ann, FILE *out);

Genann cung cấp các hàm

void genann_train(genann const *ann, double const *inputs,
        double const *desired_outputs, double learning_rate);
3 và
void genann_train(genann const *ann, double const *inputs,
        double const *desired_outputs, double learning_rate);
4 để tải hoặc lưu ANN ở định dạng dựa trên văn bản

đánh giá

double const *genann_run(genann const *ann, double const *inputs);

Gọi

void genann_train(genann const *ann, double const *inputs,
        double const *desired_outputs, double learning_rate);
5 trên ANN được đào tạo để chạy chuyển tiếp nguồn cấp dữ liệu trên một tập hợp đầu vào nhất định.
void genann_train(genann const *ann, double const *inputs,
        double const *desired_outputs, double learning_rate);
5 sẽ cung cấp một con trỏ tới mảng đầu ra dự đoán (có độ dài
void genann_train(genann const *ann, double const *inputs,
        double const *desired_outputs, double learning_rate);
7)

gợi ý

  • Tất cả các chức năng bắt đầu với
    void genann_train(genann const *ann, double const *inputs,
            double const *desired_outputs, double learning_rate);
    8
  • Mã rất đơn giản. Đào sâu và thay đổi mọi thứ

Tài nguyên bổ sung

máy tính. ai. Câu hỏi thường gặp về mạng nơ-ron là một tài nguyên tuyệt vời để giới thiệu về mạng nơ-ron nhân tạo

Nếu bạn cần một thư viện mạng thần kinh thậm chí còn nhỏ hơn, hãy xem thư viện một lớp ẩn tuyệt vời tinn

Nếu bạn đang tìm kiếm một thư viện mạng nơ-ron nặng hơn, cố chấp hơn trong C, tôi khuyên dùng thư viện FANN. Một thư viện tốt khác là Mạng nơ-ron nhẹ của Peter van Rossum, mặc dù tên của nó nặng hơn và có nhiều tính năng hơn Genann

Bạn có thể tạo một mạng lưới thần kinh trong C không?

Là một phần trong quá trình tìm hiểu sâu hơn về các khái niệm máy học, tôi quyết định viết một mạng thần kinh đơn giản từ đầu bằng C mà không cần sự trợ giúp của bất kỳ thư viện ma trận hoặc vectơ nào.

3 loại mạng lưới thần kinh khác nhau là gì?

Mạng nơ-ron nhân tạo (ANN) Mạng nơ-ron tích chập (CNN) Mạng nơ-ron tái phát (RNN)

Mạng lưới thần kinh trong CS là gì?

Mạng nơ-ron là một phương pháp trong trí tuệ nhân tạo dạy máy tính xử lý dữ liệu theo cách lấy cảm hứng từ bộ não con người . Đó là một loại quy trình học máy, được gọi là học sâu, sử dụng các nút hoặc tế bào thần kinh được kết nối với nhau trong một cấu trúc phân lớp giống như bộ não con người.

Chúng ta có thể viết mã máy học bằng C không?

Nó giúp các lập trình viên chạy các thuật toán một cách nhanh chóng. Có rất nhiều thư viện hiện diện trong lĩnh vực học máy và học sâu, giúp các nhà nghiên cứu dễ tiếp cận hơn khi làm việc với các dự án phức tạp. Trong bài viết này, chúng tôi liệt kê 10 thư viện hàng đầu trong C và C++ cho máy học