Premier apprentissage profond en C # -Imitation de l'implémentation en Python-

Apprentissage profond en C # (calcul matriciel)

Cette fois, j'ai créé uniquement un programme qui calcule la matrice nécessaire à l'apprentissage profond. Le livre auquel j'ai fait référence était "Make from scratch Deep Learning". Je recommande ce livre car il est très facile à comprendre et je pense que c'est un bon livre. Ce n'est pas un manga, mais ça ne s'arrête pas ... J'étais tellement intéressé. Je n'en ai encore lu que la moitié environ, donc il y a beaucoup de parties que je ne comprends pas bien, mais cette fois j'ai fait un programme de calcul matriciel en C #.

C #, pas Python?

Ce livre explique également la théorie, donc je voulais le faire ** à partir de zéro ** en C # sans compter sur la bibliothèque Python. J'essaierai de l'implémenter en F # et Haskell plus tard.

Pourquoi avez-vous commencé l'apprentissage en profondeur?

J'ai récemment commencé à étudier des langages fonctionnels tels que F # et Haskell, et je ne comprends toujours pas la signification de l'utilisation des langages fonctionnels. "Au fait, les langages fonctionnels se sont rapprochés des idées mathématiques." Ensuite, l'apprentissage en profondeur! (Le motif était que je ne savais pas comment utiliser le langage fonctionnel.) Pour le moment, je l'ai fait en C #.

Code source C

Matrix.cs


namespace Matrix
{
    class Mat
    {
        private int r = 0;
        public int R
        {
            get { return r; }
        }
        private int c = 0;
        public int C
        {
            get { return c; }
        }
        private bool err = false;
        public bool Err
        {
            get { return err; }
        }
        private double[][] matrix_data;
        public double[][] Matrix_data
        {
            get {
                double[][] a = new double[2][];
                a[0] = new double[] { 0, 0 };
                a[1] = new double[] { 0, 0 };
                if (err) return a;
                else return matrix_data;
            }
            set
            {
                matrix_data = value;
            }
        }
        public Mat(params double[][] vs)
        {
            int len = vs[0].Length;

            for (int i = 0; i < vs.Length; i++)
            {
                if (i != 0 && len != vs[i].Length)
                {
                    err = true;
                }
            }
            if (!err)
            {
                r = vs.Length;
                c = vs[0].Length;
                matrix_data = vs;
            }
        }
        public static double[][] operator +(Mat p1, Mat p2)
        {
            double[][] d = new double[p1.R][];

            if (p1.C == p2.C && p1.R == p2.R)
            {
                for (int i = 0; i < p1.R; i++)
                {
                    d[i] = new double[p1.C];
                    for (int j = 0; j < p1.C; j++)
                    {
                        d[i][j] = p1.Matrix_data[i][j] + p2.Matrix_data[i][j];
                    }
                }
            }
            else
            {
                for (int k = 0; k < p1.R; k++)
                {
                    d[k] = new double[2] { 0, 0 };
                }
            }

            return d;
        }
        public static double[][] operator +(double p1, Mat p2)
        {
            double[][] d = new double[p2.R][];
            for (int i = 0; i < p2.R; i++)
            {
                d[i] = new double[p2.C];
                for (int j = 0; j < p2.C; j++)
                {
                    d[i][j] = p2.Matrix_data[i][j] + p1;
                }
            }

            return d;
        }
        public static double[][] operator +(Mat p1, double p2)
        {
            double[][] d = new double[p1.R][];
            for (int i = 0; i < p1.R; i++)
            {
                d[i] = new double[p1.C];
                for (int j = 0; j < p1.C; j++)
                {
                    d[i][j] = p1.Matrix_data[i][j] + p2;
                }
            }

            return d;
        }
        public static double[][] operator -(Mat p1, Mat p2)
        {
            double[][] d = new double[p1.R][];

            if (p1.C == p2.C && p1.R == p2.R)
            {
                for (int i = 0; i < p1.R; i++)
                {
                    d[i] = new double[p1.C];
                    for (int j = 0; j < p1.C; j++)
                    {
                        d[i][j] = p1.Matrix_data[i][j] - p2.Matrix_data[i][j];
                    }
                }
            }
            else
            {
                for (int k = 0; k < p1.R; k++)
                {
                    d[k] = new double[2] { 0, 0 };
                }
            }

            return d;
        }
        public static double[][] operator -(double p1, Mat p2)
        {
            double[][] d = new double[p2.R][];
            for (int i = 0; i < p2.R; i++)
            {
                d[i] = new double[p2.C];
                for (int j = 0; j < p2.C; j++)
                {
                    d[i][j] = p1 - p2.Matrix_data[i][j];
                }
            }

            return d;
        }
        public static double[][] operator -(Mat p1, double p2)
        {
            double[][] d = new double[p1.R][];
            for (int i = 0; i < p1.R; i++)
            {
                d[i] = new double[p1.C];
                for (int j = 0; j < p1.C; j++)
                {
                    d[i][j] = p1.Matrix_data[i][j] - p2;
                }
            }

            return d;
        }
        public static double[][] dot(Mat p1, Mat p2)
        {
            double[][] d = new double[p1.R][];
            double temp = 0;

            if (p1.C == p2.R)
            {
                for (int i = 0; i < p1.R; i++)
                {
                    d[i] = new double[p2.C];
                    for (int j = 0; j < p2.C; j++)
                    {
                        for(int a = 0; a < p1.C; a++)
                        {
                            temp = temp + p1.Matrix_data[i][a] * p2.Matrix_data[a][j];
                        }
                        d[i][j] = temp;
                        temp = 0.0;
                    }
                }
            }
            else
            {
                for (int k = 0; k < p1.R; k++)
                {
                    d[k] = new double[2] { 0, 0 };
                }
            }

            return d;
        }
    }
}

La classe Mat est une classe qui calcule la matrice. L'exemple d'utilisation est le suivant.

Program.cs


namespace Matrix
{
    class Program
    {
        static void Main(string[] args)
        {
            Mat A = new Mat(
                new double[] { 1, 2, 3 },
                new double[] { 2, 3, 4 }) ,
                B = new Mat(
                new double[] { 1, 2 },
                new double[] { 2, 3 },
                new double[] { 3, 4 });

            double[][] ans = Mat.dot(A, B);

            _ = 1;    //Programme Tammy pour définir les points d'arrêt

        }
    }
}

C'était compliqué de sortir sur cette semelle, j'ai donc mis un point d'arrêt sur la ligne _ = 1; et vérifié le contenu du tableau ʻans`.

無題.png

Il est calculé correctement. Cette fois, le produit scalaire est calculé avec "Mat", mais l'addition et la soustraction sont également possibles.

Recommended Posts

Premier apprentissage profond en C # -Imitation de l'implémentation en Python-
Apprentissage en profondeur Python
Apprentissage profond × Python
Premier apprentissage profond ~ Lutte ~
Implémentation RNN en python
Implémentation ValueObject en Python
Premier apprentissage profond ~ Préparation ~
Next Python en langage C
Première solution d'apprentissage en profondeur ~
Python: apprentissage profond du traitement du langage naturel: principes de base
Python: réglage du Deep Learning
[Implémentation pour l'apprentissage] Implémentation de l'échantillonnage stratifié en Python (1)
API C en Python 3
Apprentissage profond à partir de zéro - Conseils du chapitre 4 pour la théorie de l'apprentissage profond et la mise en œuvre apprise en Python
Implémentation SVM en python
Python: Apprentissage en profondeur dans le traitement du langage naturel: Implémentation d'un système de sélection de phrases de réponses
Apprendre en profondeur à l'expérience avec Python Chapitre 2 (Matériel pour une conférence ronde)
Étendre python en C ++ (Boost.NumPy)
Recherche binaire en Python / C ++
Implémentation de réseau neuronal en python
Implémentation du tri rapide en Python
Apprentissage par renforcement profond 2 Mise en œuvre de l'apprentissage par renforcement
Première analyse de régression simple en Python
Algorithme de tri et implémentation en Python
Implémentation de l'estimation des paramètres HMM en python
Implémentation de distribution normale mixte en python
Implémentation du jeu de vie en Python
Règles d'apprentissage Widrow-Hoff implémentées en Python
Résoudre ABC036 A ~ C avec Python
Comment envelopper C en Python
Apprentissage profond appris par l'implémentation 1 (édition de retour)
Python: prétraitement dans l'apprentissage automatique: présentation
Un programmeur C / C ++ défie Python (première étape)
Implémentation du modèle de reconnaissance d'images d'apprentissage en profondeur 2
Implémentation du tri original en Python
Résoudre ABC037 A ~ C avec Python
Ecrire un test unitaire de langage C en Python
La première étape de Python Matplotlib
(python) Principes de base du chaînage de la bibliothèque d'apprentissage en profondeur
Différences que les ingénieurs C # ont ressenties lors de l'apprentissage de Python pour la première fois
Générer une collection de première classe en Python
Deep learning 2 appris par l'implémentation (classification d'images)
Othello-De la troisième ligne de "Implementation Deep Learning" (3)
Algorithme en Python (ABC 146 C Dichotomy
Module d'implémentation de file d'attente et Python "deque"
Implémenter le filtre FIR en langage Python et C
[python] Techniques souvent utilisées dans l'apprentissage automatique
Ecrire le fichier O_SYNC en C et Python
Python: prétraitement en machine learning: acquisition de données
[Python] Première analyse de données / apprentissage automatique (Kaggle)
apprentissage de python
MongoDB avec Python pour la première fois
Python: Identification du genre (développement de l'apprentissage profond) Partie 1
Python: Identification du genre (développement de l'apprentissage profond) Partie 2
"Deep Learning from scratch" avec Haskell (inachevé)
[Python] Enregistrement des résultats d'apprentissage (modèles) dans l'apprentissage automatique
Python: prétraitement dans l'apprentissage automatique: conversion de données
L'apprentissage en profondeur
Python vs Ruby "Deep Learning from scratch" Chapitre 4 Implémentation de la fonction de perte
Exécutez Python en C ++ sur Visual Studio 2017
Othello-De la troisième ligne de "Implementation Deep Learning" (2)