dimanche 24 septembre 2017

La prédiction avec le modèle et les paramètres d'entrainement

Attention: Ce code ne fonctionne pas dans le système d'exploitation CUI, ce qui signifie que vous ne pouvez pas exécuter ce programme avec une virtual box + vagrant (sans environnement GUI).
Avertissement: Ce code vise à partager publiquement des exemples de code. Nous déclinons toutes responsabilité en cas de perte fiancière.

Créer un dossier nommé "csv".

Dans le dossier "csv", mettre ces fichiers. Ceux-ci sont les données de prix de la bourse japonaise.
Télécharger les données: https://github.com/shunakanishi/japanese_stockprice

Maintenant, aller dans le premier répertoire et créer un fichier de python 3.

Préparer le modèle et les paramètres dans le dossier "model" -> "stockprice".

Dans le "model":

Dans le "stockprice":

Si vous n'avons pas le modèle et les paramètres, aller voir ce post et créer le modèle et les paramètres d'abord.

Insérer le code suivant dans le fichier "stockprice.py":
#-*- coding: utf-8 -*-
import numpy
import pandas
import matplotlib.pyplot as plt

from sklearn import preprocessing
from keras.models import Sequential
from keras.models import model_from_json
from keras.layers.core import Dense, Activation
from keras.layers.recurrent import LSTM
import keras.backend.tensorflow_backend as KTF
import os.path

class Prediction :

  def __init__(self):
    self.length_of_sequences = 10
    self.in_out_neurons = 1
    self.hidden_neurons = 300


  def load_data(self, data, n_prev=10):
    X, Y = [], []
    for i in range(len(data) - n_prev):
      X.append(data.iloc[i:(i+n_prev)].as_matrix())
      Y.append(data.iloc[i+n_prev].as_matrix())
    retX = numpy.array(X)
    retY = numpy.array(Y)
    return retX, retY


  def create_model(self, f_model, model_filename, weights_filename) :
    print(os.path.join(f_model,model_filename))
    if os.path.isfile(os.path.join(f_model,model_filename)):
      print('Saved parameters found. I will use this file...')
      json_string = open(os.path.join(f_model, model_filename)).read()
      model = model_from_json(json_string)
      model.summary()
      model.compile(loss="mape", optimizer="adam")
      model.load_weights(os.path.join(f_model,weights_filename))
    else:
      print('Saved parameters Not found. Please prepare model and parameters.')
      model = None
    return model

if __name__ == "__main__":

  f_log = './log'
  f_model = './model/stockprice'
  model_filename = 'stockprice_model.json'
  yaml_filename = 'stockprice_model.yaml'
  weights_filename = 'stockprice_model_weights.hdf5'

  prediction = Prediction()

  # Data
  data = None
  for year in range(2007, 2017):
    data_ = pandas.read_csv('csv/indices_I101_1d_' + str(year) +  '.csv')
    data = data_ if (data is None) else pandas.concat([data, data_])
  data.columns = ['date', 'open', 'high', 'low', 'close']
  data['date'] = pandas.to_datetime(data['date'], format='%Y-%m-%d')
  # Data of closing price
  data['close'] = preprocessing.scale(data['close'])
  data = data.sort_values(by='date')
  data = data.reset_index(drop=True)
  data = data.loc[:, ['date', 'close']]

  # 100% of the data is used as test data.
  # split_pos = int(len(data) * 0.8)
  # x_train, y_train = prediction.load_data(data[['close']].iloc[0:split_pos], prediction.length_of_sequences)
  x_test,  y_test  = prediction.load_data(data[['close']], prediction.length_of_sequences)

  old_session = KTF.get_session()

  model = prediction.create_model(f_model, model_filename, weights_filename)

  predicted = model.predict(x_test)
  result = pandas.DataFrame(predicted)
  result.columns = ['predict']
  result['actual'] = y_test
  result.plot()
  plt.show()

Et faire ce commande:
$ sudo python3 stockprice.py


100% des données sont utilisées pour le test.

samedi 23 septembre 2017

jQuery "toggle", "show" et "hide" avec l'effet




Nom:

Âge:

Sexe:


Le code:
<button onclick="toggle_display()">Affichage des champs d'entrée</button>
<br />
<br />
<br />
<div id="something">
  Nom:<br />
  <input type="text" /><br />
  Âge:<br />
  <input type="text" /><br />
  Sexe:<br />
  <input type="text" /><br />
</div>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script>
   function toggle_display(){
       $("#something").toggle( "slow" );
       //ou vous pouvez utiliser ça:
       //$("#something").show( "slow" );
       //$("#something").hide( "slow" );
   }
</script>

lundi 18 septembre 2017

Déboguer en Python

C'est pas difficile de déboguer en Python. Juste ajoutez
import pdb; pdb.set_trace()
dans le code de Python.

Par exemple:
import sys

def log(args):
    print(args)

def main(args):
    log(args)

import pdb;pdb.set_trace()
main(sys.argv)

L’exécution s'est arrêté avant la ligne:



Commandes de pdb.set_trace() Détail
s Step in.
n Next. Step over.
r Return. Step out.
l List. Ça montre le code source.
a Args.
p Print. Comme ça: p une_variable  
c Continue.




samedi 16 septembre 2017

Fenêtre des onglets

Fenêtre des onglets par jQuery, jQuery UI et  jQuery.tablesorter.

Le code:
<link rel="stylesheet" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/themes/base/jquery-ui.css"></link>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
<link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/jquery.tablesorter/2.28.15/css/dragtable.mod.min.css">
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery.tablesorter/2.28.15/js/jquery.tablesorter.min.js"></script>
<script>
    $( function() {
        $( "#tabs" ).tabs();
    });
</script>
    <div id="tabs">
  <ul>
<li><a href="#tabs-1">Tab 1</a></li>
<li><a href="#tabs-2">Tab 2</a></li>
        <li><a href="#tabs-3">Tab 3</a></li>
</ul>
    <div id="tabs-1">
            <span>tab1</span><br/>
            <span>tab1</span><br/>
            <span>tab1</span><br/>
            <span>tab1</span><br/>
            <span>tab1</span><br/>
    </div>  
    <div id="tabs-2">
            <span>tab2</span><br/>
            <span>tab2</span><br/>
            <span>tab2</span><br/>
            <span>tab2</span><br/>
            <span>tab2</span><br/>
    </div>
        <div id="tabs-3">
            <span>tab3</span><br/>
            <span>tab3</span><br/>
            <span>tab3</span><br/>
            <span>tab3</span><br/>
            <span>tab3</span><br/>
    </div>
    </div>

Comment passer son PC sous Linux

J'utilisai windows 8.1 mais j'ai passé mon PC sous Linux mint. Alors je vais expliquer comment passer son PC sous Linux.

1. Aller à la page de Linux mint et télécharger Linux mint.

2. Enregistrer le fichier ISO de Linux mint.

3. Préparer un vierge (DVD-R).

4. Télécharger ImgBurn et l'utiliser pour graver le fichier ISO sur le vierge (DVD-R).

5. Si l'ISO a été gravé avec succès, une musique retentira. Ce DVD s'appelle live-DVD.

6. S'assurer que le câble d'alimentation et le câble LAN sont connectés. Redémarrer l'ordinateur et, avant que le logo de Windows s'affiche, appuyer sur F2 plusieurs fois pour afficher accéder au BIOS. 

7. Aller dans "Boot". Appuyer sur F5/F6 pour changer la priorité de "CD-ROM drive" et  le mettre en haut.


8. Redémarrer l'ordinateur. Linux mint de live-DVD va se démarrer. Si on veut installer Linux mint dans l'ordinateur, utiliser le programme d'installation.

9. Après l'installer, changer la priorité de "disque dur (Hard drive)" et le mettre en haut.
Et c'est fini! :)

vendredi 15 septembre 2017

Glisser-déposer

Glisser-déposer par jQuery UI et Dropzone.js

<head>
    <link rel="stylesheet" type="text/css" href="./script/dropzone.min.css">
    <link rel="stylesheet" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/themes/base/jquery-ui.css"></link>
    <style type="text/css">
        .dropzone {border: none ! important;}
    </style>
</head>
<body ondragover="open_dialog()">
    <div id="dialog" title="Dialog" style="display:none;">
        <form>
            <div id="dZUpload" class="dropzone">
                <div class="dz-default dz-message"><span>Faites glisser et déposez ici.</span></div>
            </div>
        </form>
    </div>
</body>
<!-- Utiliser CDN de jQuery de google -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
<script src="./script/dropzone.min.js"></script>
<script>
    Dropzone.autoDiscover = false;
    $(document).ready(function () {
        $("body").dropzone({
            url: "http://192.168.1.1/upload.php", //Ton URL
            addRemoveLinks: true,
            previewsContainer: '#dZUpload',
            clickable: '#dZUpload',
            //Si tu utilises cakaphp 3, on a besoin de écrire information de csrf
            /*headers: {
                'X-CSRFToken': $('meta[name="token"]').attr('content')
            },*/
            success: function (file, response) {
                var imgName = response;
                //Pour l'animation
                file.previewElement.classList.add("dz-success");
                //Pour ajouter id à les prévisualisations
                //file.previewElement.id = response.id;
                console.log("Successfully uploaded :" + imgName);
            }
        });
    });
    dialog = $("#dialog").dialog({
        autoOpen: false,
        //open:function(event,ui){$(".ui-dialog-titlebar-close").hide();},
        modal: true,
        draggable: false,
        closeOnEscape: true,
        width: "50%",
        show: "fade",
        hide: "fade",
        buttons:{
            "Faire quelque chose":function(){
                $(this).dialog('close');
            },
            "Fermer":function(){
                $(this).dialog('close');
            }
        }
    });
    function open_dialog(){
        dialog.dialog('open');
    }
</script>

Dropzone.js: Si on veut dilater la zone de déposer à l'élément body

Si on veut dilater la zone de déposer à l'élément body:


<head>
    <link rel="stylesheet" type="text/css" href="./script/dropzone.min.css">
</head>
<form>
    <div id="dZUpload" class="dropzone">
        <div class="dz-default dz-message"></div>
    </div>
</form>
<!-- Utiliser CDN de jQuery de google -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script src="./script/dropzone.min.js"></script>
<script>
    Dropzone.autoDiscover = false;
    $(document).ready(function () {
        $("body").dropzone({
            url: "http://192.168.1.1/upload.php", //Ton URL
            addRemoveLinks: true,
            previewsContainer: '#dZUpload',
            clickable: '#dZUpload',
            //Si tu utilises cakaphp 3, on a besoin de écrire information de csrf
            /*headers: {
                'X-CSRFToken': $('meta[name="token"]').attr('content')
            },*/
            success: function (file, response) {
                var imgName = response;
                //Pour l'animation
                file.previewElement.classList.add("dz-success");
                //Pour ajouter id à les prévisualisations
                //file.previewElement.id = response.id;
                console.log("Successfully uploaded :" + imgName);
            }
        });
    });
</script>

dimanche 10 septembre 2017

Prédiction du prix de la bourse

Attention: Ce code ne fonctionne pas dans le système d'exploitation CUI, ce qui signifie que vous ne pouvez pas exécuter ce programme avec une virtual box + vagrant (sans environnement GUI).
Avertissement: Ce code vise à partager publiquement des exemples de code. Nous déclinons toutes responsabilité en cas de perte fiancière.

Créer un dossier nommé "csv".

Dans le dossier "csv", mettre ces fichiers. Ceux-ci sont les données de prix de la bourse japonaise.
Télécharger les données: https://github.com/shunakanishi/japanese_stockprice

Maintenant, aller dans le premier répertoire et créer un fichier de python 3.
Et insérer le code suivant:
#-*- coding: utf-8 -*-
import numpy
import pandas
import matplotlib.pyplot as plt

from sklearn import preprocessing
from keras.models import Sequential
from keras.models import model_from_json
from keras.layers.core import Dense, Activation
from keras.layers.recurrent import LSTM
import keras.backend.tensorflow_backend as KTF
import os.path

class Prediction :

  def __init__(self):
    self.length_of_sequences = 10
    self.in_out_neurons = 1
    self.hidden_neurons = 300


  def load_data(self, data, n_prev=10):
    X, Y = [], []
    for i in range(len(data) - n_prev):
      X.append(data.iloc[i:(i+n_prev)].as_matrix())
      Y.append(data.iloc[i+n_prev].as_matrix())
    retX = numpy.array(X)
    retY = numpy.array(Y)
    return retX, retY


  def create_model(self, f_model, model_filename, weights_filename) :
    print(os.path.join(f_model,model_filename))
    if os.path.isfile(os.path.join(f_model,model_filename)):
      print('Saved parameters found. I will use this file...')
      model = Sequential()
      model.add(LSTM(self.hidden_neurons, \
              batch_input_shape=(None, self.length_of_sequences, self.in_out_neurons), \
              return_sequences=False))
      model.add(Dense(self.in_out_neurons))
      model.add(Activation("linear"))
      model.compile(loss="mape", optimizer="adam")
      model.load_weights(os.path.join(f_model,weights_filename))
    else:
      print('Saved parameters Not found. Creating new one...')
      model = Sequential()
      model.add(LSTM(self.hidden_neurons, \
              batch_input_shape=(None, self.length_of_sequences, self.in_out_neurons), \
              return_sequences=False))
      model.add(Dense(self.in_out_neurons))
      model.add(Activation("linear"))
      model.compile(loss="mape", optimizer="adam")
    return model


  def train(self, f_model, model_filename, weights_filename, X_train, y_train) :
    model = self.create_model(f_model, model_filename, weights_filename)
    # Learn
    model.fit(X_train, y_train, batch_size=10, epochs=15)
    return model


if __name__ == "__main__":

  f_log = './log'
  f_model = './model/stockprice'
  model_filename = 'stockprice_model.json'
  yaml_filename = 'stockprice_model.yaml'
  weights_filename = 'stockprice_model_weights.hdf5'

  prediction = Prediction()

  # Data
  data = None
  for year in range(2007, 2017):
    data_ = pandas.read_csv('csv/indices_I101_1d_' + str(year) +  '.csv')
    data = data_ if (data is None) else pandas.concat([data, data_])
  data.columns = ['date', 'open', 'high', 'low', 'close']
  data['date'] = pandas.to_datetime(data['date'], format='%Y-%m-%d')
  # Data of closing price
  data['close'] = preprocessing.scale(data['close'])
  data = data.sort_values(by='date')
  data = data.reset_index(drop=True)
  data = data.loc[:, ['date', 'close']]

  # 20% of the data is used as test data.
  split_pos = int(len(data) * 0.8)
  x_train, y_train = prediction.load_data(data[['close']].iloc[0:split_pos], prediction.length_of_sequences)
  x_test,  y_test  = prediction.load_data(data[['close']].iloc[split_pos:], prediction.length_of_sequences)

  old_session = KTF.get_session()

  model = prediction.train(f_model, model_filename, weights_filename, x_train, y_train)

  predicted = model.predict(x_test)
  json_string = model.to_json()
  open(os.path.join(f_model,model_filename), 'w').write(json_string)
  yaml_string = model.to_yaml()
  open(os.path.join(f_model,yaml_filename), 'w').write(yaml_string)
  print('save weights')
  model.save_weights(os.path.join(f_model,weights_filename))
  KTF.set_session(old_session)
  result = pandas.DataFrame(predicted)
  result.columns = ['predict']
  result['actual'] = y_test
  result.plot()
  plt.show()

Pour enregistrer le model et les paramètres, créer un dossier nommé "model" et un dossier nommé "log".


Et dans le dossier "model", créer un dossier nommé "stockprice".

Et faire ce commande:
$ sudo python3 stockprice.py


Le résultat

Le model et les paramètres entraîné sont enregistré dans le dossier "model" -> "stockprice". 

Vous pouvez obtenir des donnes de bourse:

Des données de Nikkei
https://finance.yahoo.com/quote/%5EN225/history?ltr=1

Des données de NY Dow
https://finance.yahoo.com/quote/%5EDJI/history?ltr=1

Des données de Nasdaq
https://finance.yahoo.com/quote/%5EIXIC/history?ltr=1

Et enregistrez les donnes comme "stock.csv" dans le dossier de csv.

Maintenant ouvrez le fichier de "stockprice.py" et copier-coller ça dans le fichier:
#-*- coding: utf-8 -*-
import numpy
import pandas
import matplotlib.pyplot as plt
from decimal import *
import sys
from keras.models import load_model
from sklearn import preprocessing
from sklearn.preprocessing import StandardScaler
from keras.models import Sequential
from keras.models import model_from_json
from keras.layers.core import Dense, Activation
from keras.layers.recurrent import LSTM
import keras.backend.tensorflow_backend as KTF
import os.path
from datetime import datetime, timedelta

class Prediction :

  def load_data(self, data, scaler):
    # Data of closing price
    scaler.fit(data[['Close']])
    price_data = data[['Close']]
    data['Close'] = scaler.transform(data[['Close']])
    data = data.sort_values(by='Date')
    data = data.reset_index(drop=True)
    data = data.loc[:, ['Date', 'Close']]

    X, Y = [], []
    Dates = []
    Prices = []
    close_data = data[['Close']]
    date_data = data[['Date']]
    for i in range(len(close_data) - 10):
      if i+11 < len(close_data):
        Dates.append(date_data.iloc[[i+11]].iloc[0]['Date'])
        Prices.append(price_data.iloc[[i+11]].iloc[0]['Close'])
      else:
        Dates.append(date_data.iloc[[i+10]].iloc[0]['Date']+timedelta(days=1))
        Prices.append('Not applicable.')
      X.append(close_data.iloc[i:(i+10)].as_matrix())
      Y.append(close_data.iloc[i+10].as_matrix())
    retX = numpy.array(X)
    retY = numpy.array(Y)
    return retX, retY, Dates, Prices


  def create_model(self, f_model, model_filename):
    print(os.path.join(f_model,model_filename))
    if os.path.isfile(os.path.join(f_model,model_filename)):
      print('Saved parameters found. I will use this file...')
      model = load_model(os.path.join(f_model,model_filename))
    else:
      print('Saved parameters weren\'t found')
      return
    return model

if __name__ == "__main__":

  f_log = './'
  f_model = './'
  model_filename = 'stockprice_model.hdf5'

  prediction = Prediction()

  # Data
  data = None
  try:
    csv_loc = str(sys.argv[1])
  except NameError:
    print("Please give a location of the csv file.")
  if(csv_loc == ""):
    print("Please give a location of the csv file.")
  print(csv_loc)
  data = pandas.read_csv(csv_loc)
  data = data.drop('Volume',axis=1)
  data = data.drop('Adj Close',axis=1)

  data.columns = ['Date', 'Open', 'High', 'Low', 'Close']
  data['Date'] = pandas.to_datetime(data['Date'])
  print(data)
  scaler = StandardScaler()
  x_test, y_test,  Dates, Prices = prediction.load_data(data, scaler)

  model = prediction.create_model(f_model, model_filename)

  predicted = model.predict(x_test, verbose=1)
  FalseResult = 0
  TrueResult = 0
  for idx,p in enumerate(predicted):
    print('Date:' + str(Dates[idx].year) + '/' + str(Dates[idx].month) + '/' + str(Dates[idx].day) + ', Closing price (Predicted): '+ str(float(scaler.inverse_transform(p))))
    print('Date:' + str(Dates[idx].year) + '/' + str(Dates[idx].month) + '/' + str(Dates[idx].day) + ', Closing price (Actual): '+ str(Prices[idx]))
    dif1 = 0
    dif2 = 0
    dif3 = 0
    was_high_low_correct = False
    if idx > 0 and not isinstance(Prices[idx], str) :
      dif1 = float(scaler.inverse_transform(p)) - float(Prices[idx])
      dif2 = float(Prices[idx-1]) - float(Prices[idx])
      dif3 = float(Prices[idx-1]) - float(scaler.inverse_transform(p))
      if (dif2 < 0 and dif3 < 0) or (dif2 > 0 and dif3 > 0) or (dif2 == 0 and dif3 == 0):
        was_high_low_correct = True
    else:
      dif1 = 'Not applicable.'
      dif2 = 'Not applicable.'
      dif3 = 'Not applicable.'
      was_high_low_correct = 'Not applicable.'
    print('Difference between actual and previous price    :' + str(dif2))
    print('Difference between predicted and previous price :' + str(dif3))
    print('Prediction of high and low was correct?         : ' + str(was_high_low_correct))
    print('Difference between predicted and actual price   : ' + str(dif1))
    print('')
    if was_high_low_correct :
      TrueResult = TrueResult + 1
    else:
      FalseResult = FalseResult + 1
  print('Num of True: ' + str(TrueResult))
  print('Num of False: ' + str(FalseResult))
  print('Rate of true: ' + str((TrueResult/(FalseResult+TrueResult))*100) + '%')
  result = pandas.DataFrame(scaler.inverse_transform(predicted))
  result.columns = ['predict']
  result['actual'] = scaler.inverse_transform(y_test)
  result.plot()
  plt.show()

Et exécutez le script:
$ sudo python3 stockprice.py downloaded_stockprice.csv

Et l'apprentissage va démarrer.

vendredi 8 septembre 2017

Comment utiliser dropzone.js

1. Télécharger dropzone.js d'ici: http://www.dropzonejs.com/
ou ici: https://github.com/enyo/dropzone

2. Ce dont on a besoin est dropzone.min.js et dropzone.min.css. Déplacer leur dans ton répertoire.
Par exemple, un répertoire comme "./script".

3. Télécharger jQuery ou utiliser CDN:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
Ou écrire le fichier extérieur de jQuery téléchargé:
<script src="./le/fichier/extérieur/de/jQuery.js"></script>

4. Et écrire comme ça et enregistrer l'enregistrer comme .html:
<head>
    <link rel="stylesheet" type="text/css" href="./script/dropzone.min.css">
</head>
<form>
    <div id="dZUpload" class="dropzone">
        <div class="dz-default dz-message"></div>
    </div>
</form>
<!-- Utiliser CDN de jQuery de google -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script src="./script/dropzone.min.js"></script>
<script>
    Dropzone.autoDiscover = false;
    $(document).ready(function () {
        $("#dZUpload").dropzone({
            url: "http://192.168.1.1/upload.php", //Ton URL
            addRemoveLinks: true,
            //Si tu utilises cakaphp 3, on a besoin de écrire information de csrf
            /*headers: {
                'X-CSRFToken': $('meta[name="token"]').attr('content')
            },*/
            success: function (file, response) {
                var imgName = response;
                //Pour l'animation
                file.previewElement.classList.add("dz-success");
                //Pour ajouter id à les prévisualisations
                //file.previewElement.id = response.id;
                console.log("Successfully uploaded :" + imgName);
            }
        });
    });
</script>

5. Ouvrir le avec le navigateur. On peut utiliser le dropzone.
image cited from: https://www.npmjs.com/package/dropzone

Mais si l'URL est pas valide, juste les symbole d'erreur vont apparaître:

Dans ce cas, appuyer sur F12 dans le navigateur et vérifier les erreurs:


mardi 5 septembre 2017

How to become a researcher

1. Read research papers. You can search the research papers from Google scholar.
(If you don't have knowledge enough to read research papers, study about the field to get essential knowledge at first.)

2. Write research papers. Generally speaking, research paper is created by criticizing previous research papers and introducing your better idea. So it's very important to read and understand current research papers.

3. Get Master degree from some university. Master degree is considered as a first step of researcher.

4. Get PhD from some university. PhD is a proof of your research ability. The more famous the university is, the better it is. If you can create good research papers, it should not be so difficult to get PhD.

5. Keep publishing your research papers on peer-reviewed journals. Peer-reviewed journals list. How many research papers you have published on the peer-reviewed journals is considered as your achievement. The more papers you publish on peer-reviewed journals, the better researcher you are.

Of course the quality of the papers are important too, but generally speaking, how many research papers you have published on the peer-reviewed journals is the simplest indicator to see how good researcher you are. (By the way, how many times your paper is cited is considered as an important factor to see the quality of a research paper.)

6. After getting PhD and publishing nice papers on journals, you would be able to be a professor at some university. Or be a professional researcher at some big company like Google. If you get some such job, now you are a nice researcher.

The point is that it is very important to read research papers. Because it will help you when you write research papers. Also, what field you will be in is important. Some fields earn better money such as Medical, computer science or Engineering. But some fields like Classical literature earn little money and have little chance to be employed by companies or schools.

dimanche 3 septembre 2017

Le générateur de texte de Nietzsche

J'ai customisé le code d'exemple de fchollet/keras.

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
'''Example script to generate text from Nietzsche's writings.
At least 20 epochs are required before the generated text
starts sounding coherent.
It is recommended to run this script on GPU, as recurrent
networks are quite computationally intensive.
If you try this script on new data, make sure your corpus
has at least ~100k characters. ~1M is better.
'''

from __future__ import print_function
from keras.models import Sequential
from keras.layers import Dense, Activation
from keras.layers import LSTM
from keras.optimizers import RMSprop
from keras.utils.data_utils import get_file
from keras.models import model_from_json
import keras.backend.tensorflow_backend as KTF
import tensorflow as tf
import os.path
import keras
import numpy as np
import random
import sys


weights_filename = 'textgen_model_weights.hdf5'
f_model = './model/textgen'
f_log = './log/textgen'
model_yaml = 'textgen_model.yaml'
model_filename = 'textgen_model.json'

path = get_file('nietzsche.txt', origin='https://s3.amazonaws.com/text-datasets/nietzsche.txt')
text = open(path).read().lower()
print('corpus length:', len(text))

chars = sorted(list(set(text)))
print('total chars:', len(chars))
char_indices = dict((c, i) for i, c in enumerate(chars))
indices_char = dict((i, c) for i, c in enumerate(chars))

# cut the text in semi-redundant sequences of maxlen characters
maxlen = 40
step = 3
sentences = []
next_chars = []
for i in range(0, len(text) - maxlen, step):
    sentences.append(text[i: i + maxlen])
    next_chars.append(text[i + maxlen])
print('nb sequences:', len(sentences))

print('Vectorization...')
X = np.zeros((len(sentences), maxlen, len(chars)), dtype=np.bool)
y = np.zeros((len(sentences), len(chars)), dtype=np.bool)
for i, sentence in enumerate(sentences):
    for t, char in enumerate(sentence):
        X[i, t, char_indices[char]] = 1
    y[i, char_indices[next_chars[i]]] = 1

old_session = KTF.get_session()
session = tf.Session('')
KTF.set_session(session)

if os.path.isfile(os.path.join(f_model,model_filename)):
    print('Saved parameters found. I will use this file...')
    json_string = open(os.path.join(f_model, model_filename)).read()
    model = model_from_json(json_string)
    model.summary()
    optimizer = RMSprop(lr=0.01)
    model.compile(loss='categorical_crossentropy', optimizer=optimizer)
    model.load_weights(os.path.join(f_model,weights_filename))
else:
    # build the model: a single LSTM
    print('Saved parameters Not found. Creating new model...')
    print('Build model...')
    model = Sequential()
    model.add(LSTM(128, input_shape=(maxlen, len(chars))))
    model.add(Dense(len(chars)))
    model.add(Activation('softmax'))
    optimizer = RMSprop(lr=0.01)
    model.compile(loss='categorical_crossentropy', optimizer=optimizer)


def sample(preds, temperature=1.0):
    # helper function to sample an index from a probability array
    preds = np.asarray(preds).astype('float64')
    preds = np.log(preds) / temperature
    exp_preds = np.exp(preds)
    preds = exp_preds / np.sum(exp_preds)
    probas = np.random.multinomial(1, preds, 1)
    return np.argmax(probas)

#tb_cb = keras.callbacks.TensorBoard(log_dir=f_log, histogram_freq=1)
#cp_cb = keras.callbacks.ModelCheckpoint(filepath = os.path.join(f_model,weights_filename), monitor='loss', verbose=1, save_best_only=True, mode='auto')
#cbks = [tb_cb, cp_cb]

# train the model, output generated text after each iteration
for iteration in range(1, 60):
    print()
    print('-' * 50)
    print('Iteration', iteration)
    model.fit(X, y,
              batch_size=128,
              epochs=1,)
              #callbacks=cbks)

    start_index = random.randint(0, len(text) - maxlen - 1)

    for diversity in [0.2, 0.5, 1.0, 1.2]:
        print()
        print('----- diversity:', diversity)

        generated = ''
        sentence = text[start_index: start_index + maxlen]
        generated += sentence
        print('----- Generating with seed: "' + sentence + '"')
        sys.stdout.write(generated)

        for i in range(400):
            x = np.zeros((1, maxlen, len(chars)))
            for t, char in enumerate(sentence):
                x[0, t, char_indices[char]] = 1.

            preds = model.predict(x, verbose=0)[0]
            next_index = sample(preds, diversity)
            next_char = indices_char[next_index]

            generated += next_char
            sentence = sentence[1:] + next_char

            sys.stdout.write(next_char)
            sys.stdout.flush()
        print()

json_string = model.to_json()
open(os.path.join(f_model,model_filename), 'w').write(json_string)
yaml_string = model.to_yaml()
open(os.path.join(f_model,model_yaml), 'w').write(yaml_string)
print('save weights')
model.save_weights(os.path.join(f_model,weights_filename))
KTF.set_session(old_session)

samedi 2 septembre 2017

Javascript: comment débugger javescript

1. Écrire "debugger".


Écrire "debugger" dans le code de Javascript. L'exécution va s'arrêter à la ligne où il est écrit "debugger".
<a href="javascript:debug_test();">Click me</a>
<script>
function debug_test(){
var num = 5;
for(var i = 0; i < 10; i++){
    num++;
    debugger;
}
}
</script>

2. console.log, console.warn, console.error, console.info


Écrire comme ça:
<script>
var salut = "salut";
for(var i = 0; i < 10; i++){
     console.log(salut); //Qu'est qu'il y a dans la valeur? Vérifier ça avec le console du navigateur.
     console.warn(salut);
     console.error(salut);
     console.info(salut);
}
</script>

Pousser F12 et le console va s'afficher.




3. console.table

Écrire comme ça:
<script>
var salut = "salut";
var bonjour = "bon jour";
var aurevoir = "au revoir";
console.table([[salut,bonjour,aurevoir], [1,2,3]]);
</script>

Et sur le console:

Ça peut afficher le détail d'un objet aussi.
<script>
var car = {type:"Fiat", model:"500", color:"white"};
console.table(car);
</script>

Et ça s'affiche:
(Mais ça ne marchera peut-être pas sur Chrome. Utiliser Firefox.)


4. "console.trace" ou "try et catch"


console.trace ne doit pas rester dans le code après le développement parce que c'est pas une fonction standard. Mais si on veut voir la trace, utiliser "console.trace".
<script>
function foo() {
  function bar() {
    console.trace();
  }
  bar();
}

foo();
</script>

Et ça s'affiche:
bar
foo
<anonymous>

Mais on peut utiliser "try" et "catch":
<script>
try {
    hohoho("Bon jour.");
}
catch(err) {
    console.log(err);
}
</script>

Et ça s'affiche:
"hohoho is not defined" Bien sur que non.

Installation de CakePHP 3

Contenu du didacticiel 


Didacticiel de la préparation
1. Vagrant et Virtual Box

2. Installer Apache

3. Installer MySQL

4. Installer PHP 7

CakePHP 3
1. Installation de CakePHP 3

2. Bake et Migrations

Installer les paquets pour PHP


D'abord, faire ce commande pour installer les paquets nécessaire (Si vous utilisez le dépôt de webtatic):
$ sudo yum -y install php71w-intl php71w-mbstring php-71w-xml
Ou:
$ sudo yum -y install php-intl php-mbstring php-xml

Et redémarrer Apache:
Pour CentOS 7:
$ sudo systemctl restart httpd.service
Pour CentOS 6:
$ sudo service httpd restart 

Et aller dans le dossier partagé:
$ cd /vagrant

Installer composer


Installer "composer":
$ curl -sS https://getcomposer.org/installer | php
$ sudo mv composer.phar /usr/local/bin/composer

Vérifier si c'est bien installé:
$ composer

Si ça s'affiche après avoir exécuté la commande "composer", c'est bien installé.

Faire ce commande:
$ composer self-update

Installer CakePHP3


Installer cakephp3 avec composer:
$ composer create-project --prefer-dist cakephp/app cake
"cake" est un nom du projet.

Si on a un problème et si on veut l'installer comme un super utilisateur:
$ su
# composer create-project --prefer-dist cakephp/app cake

Et il vous sera demander:
Created `config/app.php` file
Set Folder Permissions ? (Default to Y) [Y,n]?
C'est à propos de les permissions. Répondre "Yes" (oui).

On va démarrer le serveur intégré. Aller dans le cake dossier:
$ cd /vagrant/cake

Démarrer le serveur intégré:
$ bin/cake server -H 0.0.0.0

Et le serveur va démarrer:
Welcome to CakePHP v3.4.9 Console
---------------------------------------------------------------
App : src
Path: /vagrant/cake/src/
DocumentRoot: /vagrant/cake/webroot
---------------------------------------------------------------
built-in server is running in http://0.0.0.0:8765/
You can exit with `CTRL-C`

Si on utilise "Private network" (Réseau privé), URL est: http://192.168.33.10:8765/

Si on utilise "Public network"(Réseau public) avec le didacticiel, URL est: http://192.168.11.100:8765/
(si on utilise pas vagrant, utiliser http://localhost:8765/.)

Et on va vérifier si ça bien fonctionner:




On va changer le fichier de configuration d'Apache:
$ sudo vi /etc/httpd/conf/httpd.conf

(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 au 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.)

Changer le fichier de configuration d'Apache comme ça:
<Directory "/var/www/html" />
    Options FollowSymLinks
    AllowOverride All
    Require all granted
</Directory>


Enregistrer et fermer le fichier.

Redémarrer Apache.
Pour CentOS7:
$ sudo systemctl restart httpd.service
Pour CentOS6:
$ sudo service httpd restart

Accéder la page d'index:
Réseau privé: http://192.168.33.10/cake/
Réseau public: http://(your URL)/cake/

It works.

Si il y a beaucoup des erreurs sur la page d'index:
$ sudo chown -R apache:apache /vagrant/cake
Si il y a encore erreurs sur la page d'index, écrire comme çà dans le Vagrantfile:
config.vm.synced_folder "./", "/vagrant", owner: 'vagrant', group: 'apache', mount_options: ['dmode=777', 'fmode=777']
Et "vagrant reload".
Si il y a encore erreurs sur la page d'index, ça peut être à cause de SE linux. Arrêter SE linux:
$ sudo getenforce
Enforcing
$ sudo setenforce 0
$ sudo getenforce
Permissive
Et "vagrant reload".

Créer une base de données pour CakePHP:
$ mysql -u root -proot
mysql> CREATE DATABASE test;
mysql> exit
(Utiliser son propre mot de passe et nom d'utilisateur)

Et changer le fichier de configuration de la base de données dans CakePHP:
$ sudo vi /vagrant/cake/config/app.php

Changer le mot de passe, nom d'utilisateur et la base de données:
'Datasources' => [
    'default' => [
        'className' => 'Cake\Database\Connection',
        'driver' => 'Cake\Database\Driver\Mysql',
        'persistent' => false,
        'host' => 'localhost',
        /**
         * CakePHP will use the default DB port based on the driver selected
         * MySQL on MAMP uses port 8889, MAMP users will want to uncomment
         * the following line and set the port accordingly
         */
        //'port' => 'nonstandard_port_number',
        'username' => 'root',
        'password' => 'root',
        'database' => 'test',
        'encoding' => 'utf8',
        'timezone' => 'UTC',
        'cacheMetadata' => true,

On va vérifier si CakePHP bien fonctionner. Il y avait une erreur:

Mais maintenant, il n'y a pas l'erreur:

Et c'est fini! :)


Keras: utiliser son propre le jeu de données (prix du logement, boston)

On va créer un dossier "data" pour le jeu de données.

Créer un dossier "boston" dedans:


Télécharger le jeu de données (csv) fichier d'ici: https://github.com/shunakanishi/keras_boston_dataset




Déplacer "housing.csv" vers le dossier "boston":


Les données dedans représente ça:
CRIMZNINDUSCHASNOXRMAGEDISRAD
0.00632182.3100.5386.57565.24.09001
0.0273107.0700.4696.42178.94.96712
0.0272907.0700.4697.18561.14.96712
0.0323702.1800.4586.99845.86.06223
0.0690502.1800.4587.14754.26.06223
TAXPTRATIOBLSTATMEDV
29615.3396.904.9824.0
24217.8396.909.1421.6
24217.8392.834.0334.7
22218.7394.632.9433.4
22218.7396.905.3336.2

Maintenant créer "boston.py" dans le dossier partagé et écrire dedans:


import pandas as pd
import numpy as np

# Read dataset into X and Y
df = pd.read_csv('./data/boston/housing.csv', delim_whitespace=True, header=None)
dataset = df.values

X = dataset[:, 0:13]
Y = dataset[:, 13]

# Define the neural network
from keras.models import Sequential
from keras.layers import Dense

def build_nn():
    model = Sequential()
    model.add(Dense(20, input_dim=13, activation='relu', kernel_initializer="normal"))
    # No activation needed in output layer (because regression)
    model.add(Dense(1, kernel_initializer="normal"))

    # Compile Model
    model.compile(loss='mean_squared_error', optimizer='adam')
    return model

# Evaluate model (kFold cross validation)
from keras.wrappers.scikit_learn import KerasRegressor

# sklearn imports:
from sklearn.cross_validation import cross_val_score, KFold
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline

# Before feeding the i/p into neural-network, standardise the dataset because all input variables vary in their scales
estimators = []
estimators.append(('standardise', StandardScaler()))
estimators.append(('multiLayerPerceptron', KerasRegressor(build_fn=build_nn, nb_epoch=100, batch_size=32, verbose=1)))

pipeline = Pipeline(estimators)

kfold = KFold(n=len(X), n_folds=10)
results = cross_val_score(pipeline, X, Y, cv=kfold)

print ("");
print ("Mean: ", results.mean())
print ("StdDev: ", results.std())

Faire ce commande:
$ sudo python3.5 boston.py

L'apprentissage profond va démarrer avec les données de housing.csv:
Moyenne: 478.48
Écart-type: 258.5499

Utiliser son propre le jeu de données

Contenu du didacticiel 

Preparation
1. Vagrant et Virtual Box.

2. Apache

3. MySQL

4. Python

5. Python Hello World

Apprentissage profond
1. Installer Keras et tester l'apprentissage profond (Deep learning)

2. Enregistrer et charger les paramètres

3. Enregistrer et charger les paramètres en même temps

4. Utiliser son propre le jeu de données

Utiliser son propre le jeu de données


On va demander à la machine d'apprendre à quoi ressemble les chats et les chiens.
Télécharger les photos des chats et des chiens: https://www.kaggle.com/c/dogs-vs-cats-redux-kernels-edition

Les photos sont:

C'est le jeu de données.

Créer un dossier "data":


Créer un dossier "train"  et un dossier "validation" dans le dossier data :


Ouvrir le dossier  train et créer un dossier "cats" et un dossier "dogs". Déplacer 200 photos des chats vers le dossier cats et 200 photos des chiens vers le dossier dogs:

Maintenant, ouvrir le "validation" dossier et créer un dossier "cats" et un dossier "dogs"  dedans.
Now open the validation folder and create cats folder and dogs folder. Déplacer 200 photos des chats vers le dossier cats et 200 photos des chiens vers le dossier dogs:

Créer "dogvscat.py" et écrire comme ça dedans:
from __future__ import print_function

import numpy as np
import keras
from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D
from keras.layers import Activation, Dropout, Flatten, Dense
from keras.preprocessing.image import ImageDataGenerator
from keras.models import model_from_json
from keras.layers import Dense, Dropout, Activation
from keras.preprocessing.text import Tokenizer
import keras.backend.tensorflow_backend as KTF
import tensorflow as tf
import os.path


f_log = './log'
f_model = './model/dogvscat'
model_yaml = 'dogvscat_model.yaml'
model_filename = 'dogvscat_model.json'
weights_filename = 'dogvscat_model_weights.hdf5'

batch_size = 32
epochs = 5
nb_validation_samples = 100

old_session = KTF.get_session()
print('Building model...')
session = tf.Session('')
KTF.set_session(session)

if os.path.isfile(os.path.join(f_model,model_filename)):
    print('Saved parameters found. I will use this file...')
    json_string = open(os.path.join(f_model, model_filename)).read()
    model = model_from_json(json_string)
    model.summary()
    model.compile(loss='categorical_crossentropy',
                optimizer='adam',
                metrics=['accuracy'])
    model.load_weights(os.path.join(f_model,weights_filename))
else:
    print('Saved parameters Not found. Creating new model...')
    model = Sequential()
    model.add(Conv2D(32, 3, 3, input_shape=(128, 128, 3)))
    model.add(Activation('relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))

    model.add(Conv2D(64, 3, 3))
    model.add(Activation('relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))

    model.add(Flatten())
    model.add(Dense(64))
    model.add(Activation('relu'))
    model.add(Dropout(0.5))
    model.add(Dense(2))
    model.add(Activation('softmax'))

    model.summary()

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

train_datagen = ImageDataGenerator(
    rescale=1.0 / 255,
    shear_range=0.2,
    zoom_range=0.2,
    horizontal_flip=True)

test_datagen = ImageDataGenerator(rescale=1.0 / 255)

train_generator = train_datagen.flow_from_directory(
    'data/train',
    target_size=(128, 128),
    batch_size=batch_size,
    class_mode='categorical')

validation_generator = test_datagen.flow_from_directory(
    'data/validation',
    target_size=(128, 128),
    batch_size=batch_size,
    class_mode='categorical')

tb_cb = keras.callbacks.TensorBoard(log_dir=f_log, histogram_freq=0)
cp_cb = keras.callbacks.ModelCheckpoint(filepath = os.path.join(f_model,weights_filename), monitor='val_loss', verbose=1, save_best_only=True, mode='auto')
cbks = [tb_cb, cp_cb]

history = model.fit_generator(
    train_generator,
    steps_per_epoch=np.ceil(nb_validation_samples/batch_size),
    epochs=epochs,
    validation_data=validation_generator,
    validation_steps=np.ceil(nb_validation_samples/batch_size),
    callbacks=cbks
    )

score = model.evaluate_generator(validation_generator, nb_validation_samples/batch_size)

print('')
print('Test score:', score[0])
print('Test accuracy:', score[1])

json_string = model.to_json()
open(os.path.join(f_model,model_filename), 'w').write(json_string)
yaml_string = model.to_yaml()
open(os.path.join(f_model,model_yaml), 'w').write(yaml_string)
print('save weights')
model.save_weights(os.path.join(f_model,weights_filename))
KTF.set_session(old_session)


Faire ces commandes:
$ sudo cd /vagrant
$ sudo python3 dogvscat.py

Et l'apprentissage profond de le jeu de données va démarrer