samedi 13 juillet 2019

Comment créer un model de Keras

Model de Keras

Dans ce billet, nous allons voir comment créer un model de Keras pour l'apprentissage profond. D'abord, nous allons voir l'exemple de MNIST de Keras d'ici.
Le code du fichier est comme ça:
from __future__ import print_function

import keras
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.optimizers import RMSprop

batch_size = 128
num_classes = 10
epochs = 20

# the data, split between train and test sets
(x_train, y_train), (x_test, y_test) = mnist.load_data()

x_train = x_train.reshape(60000, 784)
x_test = x_test.reshape(10000, 784)
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255
print(x_train.shape[0], 'train samples')
print(x_test.shape[0], 'test samples')

# convert class vectors to binary class matrices
y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)

model = Sequential()
model.add(Dense(512, activation='relu', input_shape=(784,)))
model.add(Dropout(0.2))
model.add(Dense(512, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(num_classes, activation='softmax'))

model.summary()

model.compile(loss='categorical_crossentropy',
              optimizer=RMSprop(),
              metrics=['accuracy'])

history = model.fit(x_train, y_train,
                    batch_size=batch_size,
                    epochs=epochs,
                    verbose=1,
                    validation_data=(x_test, y_test))
score = model.evaluate(x_test, y_test, verbose=0)
print('Test loss:', score[0])
print('Test accuracy:', score[1])
Le model du fichier est créé comme :
model = Sequential()
model.add(Dense(512, activation='relu', input_shape=(784,)))
model.add(Dropout(0.2))
model.add(Dense(512, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(num_classes, activation='softmax'))

La fonction de "Dense"

En fait, la fonction de "Dropout" est utilisé pour le donner imprévisibilité et pour empêcher l'apprentissage profond de faire mémoriser les données. Alors ce code fonctionne aussi.
model = Sequential()
model.add(Dense(512, activation='relu', input_shape=(784,)))
model.add(Dense(512, activation='relu'))
model.add(Dense(num_classes, activation='softmax'))
Alors, ce qui compte le plus est la fonction de "Dense". Selon le documentation de Keras, les arguments de la fonction sont comme ça:
keras.layers.Dense(units, activation=None, use_bias=True, kernel_initializer='glorot_uniform', bias_initializer='zeros', kernel_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, bias_constraint=None)
Le nombre d'abord "512" est "units" du couche. Vous pouvez voir ce site web pour apprendre le "units". C'est le nombre de "output shape".

 Illustration 1

Si nous écrivons 512 pour le "units" du couche, le résultat du couche est porté au couche prochain (ce qui a "input shape" de 512). Alors le nombre est un "output shape" du couche. 

Mais pourquoi 512? En fait, nous ne sommes pas pourquoi. Peut-être l'apprentissage profond a besoin d'utiliser 512 neurones pour classer les tous dispositions. Nous devons trouver le meilleur nombre par tâtonnements.

Video 1 (anglais)

Le couche dernier a "num_classes" (= 10) pour "units" parce que le couche dernier sortir un nombre des 0 - 9 (0, 1, 2, 3 ... 9. 10 nombres). 

"input_shape" de la fonction de "Dense"

Seulement le couche premier a "input_shape", ce qui est utilisé pour spécifier quel "shape" est utiliser pour le couche premier. Nous ne devons pas spécifier le "input_shape" pour les couches après le premier parce que le code peut savoir le nombre de "input shape" par le nombre de "output shape" du couche précédent.

Les échantillons de MNIST sont les images des nombres écrit à la main. Chaque image a 28 * 28 (=784) pixels avec l'échelle des gris comme ça:



Nous passons les donnes des 784 pixels à le couche premier, alors le couche premier doit avoir "784" pour le "input_shape". 

La conclusion

Comme nous avons vu au-dessus, le model de Keras est créé comme ça: 

model = Sequential()
// 28 * 28 pixels = 784 pixel
// 512 pour le "output shape".
model.add(Dense(512, activation='relu', input_shape=(784,))) 
// 512 pour le "output shape".
model.add(Dense(512, activation='relu'))
// 0, 1, 2, 3 ... Le code va choisir un nombre de 10 nombres.
model.add(Dense(10, activation='softmax'))

Mais le model de Keras peut-être créé comme ça aussi pour le MNIST:

model = Sequential()
model.add(Dense(300, activation='relu', input_shape=(784,))) 
model.add(Dense(300, activation='relu'))
model.add(Dense(300, activation='relu'))
model.add(Dense(300, activation='relu')) // Trois couches cachés!
// 0, 1, 2, 3 ... Le code va choisir un nombre de 10 nombres.
model.add(Dense(10, activation='softmax'))

Ce code fonctionne.

Et nous pouvons créer le model comme ça aussi si nous voulons:

model = Sequential()
model.add(Dense(1, activation='relu', input_shape=(784,))) 
model.add(Dense(1, activation='relu'))
model.add(Dense(1, activation='relu'))
model.add(Dense(1, activation='relu'))
model.add(Dense(1, activation='relu')) // Quatre couches cachés avec 1 neurone!
model.add(Dense(10, activation='softmax'))


samedi 15 juin 2019

Comment déboguer Electron-vue avec VSCode

Dans ce billet, nous allons voir comment déboguer un application de Electron-vue avec VSCode. D’abord,  écrire comme ceci sur launch.js de ".vscode".
{
   // Use IntelliSense to learn about possible attributes.
   // Hover to view descriptions of existing attributes.
   // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
   "version": "0.2.0",
   "configurations": [
       {
           "type": "node",
           "request": "attach",
           "name": "Attach to electron main",
           "port": 5858,
           "timeout": 30000,
           "sourceMaps": true,
           "outFiles": [
             "${workspaceRoot}/src/main/index.js"
           ]
       }
   ]
}
Et ajouter debugger où nous voulons stopper l'exécution.
function test (testVar) {
  debugger
  return readFile(testVar)
}
Notez que nous pouvons débugger le processus de "main", pas de "renderer".

Débugger

Après ajouter le debugger dans le code, commencer le débogage. Et commencer l'application par $ npm run dev. Nous allons voir l’exécution va se stopper où nous avons ajouté le debugger.

Références

samedi 8 juin 2019

Comment utiliser Spring boot sur vscode

Prérequis

Configurer un projet de Spring boot

Nous pouvons utiliser start.spring.io pour configurer un projet de Spring boot. Je l'ai configuré comme ça:

Remarquer que j'ai ajouté "Web" et "Thymeleaf" dans le "Dependencies". Pour ajouter une dépendance, rechercher la dépendance dans le "Search for dependencies" et cliquer sur la suggestion. Après configurer le tout, cliquer sur "Generate Project".

VScode

Après nous cliquons sur "Generate Project", nous allons obtenir un fichier zip. Extraire le fichier zip, et nous obtenons un dossier. Le nom de mon dossier était "demo".

Glisser-poser le dossier "demo" sur VScode. 


Ouvrir pom.xml par double-cliquer sur le nom "pom.xml".

Appuyer F5 et cliquer sur "Java". Le projet sera compilé. 

Hello World

Controller

Créer un dossier "controller" dans le dossier "demo". Et créer un fichier "HelloController.java" dans le dossier "controller". 

Écrire comme ceci dans le fichier "HelloController.java". Et enregistrer le fichier par appuyer "ctrl + s".
package com.example.demo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class HelloController{
    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String get(){
        return "hello";
    }
}

Template

Créer un fichier "hello.html" dans le dossier "templates" comme ceci: 

Écrire comme ceci dans le fichier "hello.html" et l'enregistrer.
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
Hello World!
</body>
</html>

Voir sur le navigateur

Arrêter le mode de debug (si le mode de debug est activé).

Et appuyer sur F5. Le mode de debug est re-activé âpre compiler le projet. Ouvrir http://localhost:8080  sur un navigateur. Si le tour est OK, nous allons voir "Hello World!".


Automatique importation des bibliothèques sur VScode

Appuyer sur "ctrl + ." et nous pouvons importer bibliothèques sur VScode:
Appuyer sur "ctrl + ." sur "FetchType" du code


vendredi 7 juin 2019

Utiliser Scala avec VScode sur Ubuntu18

Scala, VScode, Ubuntu

Je vais expliquer comment utiliser Scala avec VScode sur Ubuntu18.
Les versions sont:
  • Scala: 2.11.12
  • VScode: 1.34
  • Ubuntu: 18.04.2 LTS

Installer sbt

D'abord, voir quelle version est la dernière.
http://dl.bintray.com/sbt/debian/
C’était version 1.2.8 à ce jour, alors je vais installer sbt 1.2.8:
$ curl -L -o sbt.deb http://dl.bintray.com/sbt/debian/sbt-1.2.8.deb
$ sudo dpkg -i sbt.deb
$ sudo apt-get update
$ sudo apt-get install sbt
Maintenant nous pouvons utiliser sbt comme ça:
$ sbt
[info] Loading project definition from /home/user/project
[info] Set current project to shu (in build file:/home/user/)
[info] sbt server started at local:///home/user/.sbt/1.0/server/9a48bc25b5f71ce94d5c/sock
sbt:user> 
Pour voir la version:
$ sbt "show sbtVersion"
[info] Loading project definition from /home/user/project
[info] Set current project to shu (in build file:/home/shu/)
[info] 1.2.8

Installer le support de Scala sur VScode

Installer "Scala Language Server" sur vscode:


Créer un nouveau projet 

Exécuter ces commandes sur le terminal de vscode:
$ cd {path of directory which you want to locate the project}
$ sbt new sbt/scala-seed.g8
Le projet de Scala est créé là. Glisser-poser le projet créé sur vscode.

Si ça commence compiler, attendre jusqu’à ça finit compiler. 

Hello World

Exécuter cette commande sur le terminal de vscode pour voir si exécuter le projet:
$ sbt run

Si nous voyons ce message, ça veut dire c'est un succès. Nous sommes prêt à écrire avec Scala sur vscode. 
$ sbt run
[info] Loading project definition from /home/shu/user/scala-test/project
[info] Updating ProjectRef(uri("file:/home/shu/user/scala-test/project/"), "scala-test-build")...
[info] Done updating.
[info] Compiling 1 Scala source to /home/shu/user/scala-test/project/target/scala-2.12/sbt-1.0/classes ...
[info] Done compiling.
[info] Loading settings for project root from build.sbt ...
[info] Set current project to scala test (in build file:/home/shu/user/scala-test/)
[info] Updating ...
[info] Done updating.
[info] Compiling 1 Scala source to /home/shu/user/scala-test/target/scala-2.12/classes ...
[info] Done compiling.
[info] Packaging /home/shu/user/scala-test/target/scala-2.12/scala-test_2.12-0.1.0-SNAPSHOT.jar ...
[info] Done packaging.
[info] Running example.Hello 
hello
[success] Total time: 2 s, completed Jun 7, 2019 11:46:32 PM

Références

dimanche 17 mars 2019

Installer Python3

Contenu du didacticiel

  1. Vagrant et Virtual Box
  2. Installer Apache / (Utiliser Nginx et PHP)
  3. Installer MySQL / MariaDB
  4. Installer PHP / Python

Installer Python3.6

On va installer Python dans la machine virtuel. D'abord, on va vérifier quelle version de Python est installédans le yum paque. Tapez la commande ci-dessous:
$ yum list python* 

Python 2.7 est déjà installé par défaut dans Cent OS 7, mais il n'y a pas Python 3.6 dans la liste. Pour utiliser Python 3.6, on va utiliser le package d'IUS Community Project, écrire la commande ci-dessous:
$ sudo yum install -y https://centos7.iuscommunity.org/ius-release.rpm
Et on peut utiliser les packages d'IUS Community Project. Pour installer Python 3.6, écrire la commande ci-dessous:
$ sudo yum install -y python36u python36u-libs python36u-devel python36u-pip python-pip
Pour vérifier si Python 3.5 est correctement installé dans la machine virtuel, écrire la commande ci-dessous:
$ python3.6 -V 
$ sudo which python3.6
C'est python3.5 sur cette image... mais vous allez voir 3.6.

Redémarrer Apache après l'installation.
$ sudo systemctl restart httpd

Les commands for CentOS6

$ sudo yum install -y https://centos6.iuscommunity.org/ius-release.rpm
$ sudo yum install -y python36u python36u-libs python36u-devel python36u-pip python-pip
$ sudo locate python3.6
$ sudo service httpd restart

Hello World en Python

On va créer un fichier "index.py" pour afficher "Hello World" dans le navigateur. Créer un fichier "index.py" avec un éditeur de texte dans C:\MyVM\MyCentOs\index.py et écrire dedans:
#!/usr/bin/env python
# -- coding: UTF-8 --

print("Content-Type: text/html\n\r")
print ("""
    <TITLE>CGI script ! Python</TITLE>
    <H1>This is my first CGI script</H1>
    Hello, world!
""")
Attention, la fin de ligne doit être LF. (pas CR/RF!)
Maintenant, faire cette commande dans Teraterm:
$ sudo vi /etc/httpd/conf/httpd.conf
Comment utilsier la commande de "vi" est ici:
Appuyez sur la touche A du clavier pour accéder au mode insérer pour pouvoir éditer le fichier. Appuyez sur la touche échap pour arrêter mode insérer, après d'avoir fini, appuyez sur les touches Shift + g pour aller en bas de page. Shift + zz pour enregistrer et fermer le fichier. On peut utiliser le mode commande en appuyant sur :. Pour enregistrer et quitter le mode commande, écrire :wq et appuyez sur entrée. Pour quitter le fichier sans sauvegarder, :q! et appuyez sur entrée. Pour chercher un mot, appuyez sur ? et écrire le mot cherché. Par exemple, si on écrit ?aaa et que l'on appuie sur entrée, "aaa" sera recherché et surligné dans le fichier. Appuyez sur n pour aller au résultat suivant.
Ajouter "ExecCGI" dans le répertoire de "/var/www/html".

<Directory "/var/www/html">
    Options Indexes FollowSymlinks ExecCGI
    AllowOverride None
    Require all granted
</Directory>

(Faites attention, il y a des paramètres similaires mais il faut que ce soit /var/www/html.)
Et ajouter .py au Add handler: 

AddHandler cgi-script .cgi .py

Directory 

Add handler
Au fait, peut-étre Add handler est un commentaire.

Supprimer le # de la ligne AddHandler et enregistrer et fermez-le par ":wq".

Redémarrer Apache (httpd):
$ sudo systemctl restart httpd
Si SELinux fonctionne:
$ sudo setenforce 0
Ou cette commande:
$ sudo chcon -R -t httpd_sys_script_exec_t /var/www/html/index.py
Pour avoir accès au fichier, voir ce page par un navigateur: http://192.168.33.10/index.py
Hello World!!
Si ça ne fonctionne pas et que les erreurs 500 ou 404 s'affichent à l'écran, faire cette commande pour voir les erreurs:

Apache
$ sudo less /var/log/httpd/error_log
Nginx
$ sudo less /var/log/nginx/error.log
Et rechercher sur google l'origine des erreurs.

Si vous voulez changer la permission du dossier de vagrant,, écrire comme ça dans le Vagrantfile:
config.vm.synced_folder "./", "/vagrant", owner: 'vagrant', group: 'apache', mount_options: ['dmode=777', 'fmode=777']

Django