Skip to content

Instantly share code, notes, and snippets.

@marcosbarker
Last active February 10, 2023 14:02
Show Gist options
  • Save marcosbarker/ec83e93589af46ea5e12c2422c97df3c to your computer and use it in GitHub Desktop.
Save marcosbarker/ec83e93589af46ea5e12c2422c97df3c to your computer and use it in GitHub Desktop.
sw2d_kf_rna_notebook.ipynb
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"<a href=\"https://colab.research.google.com/gist/marcosbarker/ec83e93589af46ea5e12c2422c97df3c/-sw2d_kf_rna_notebook.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "wPKWPrjVsJl7"
},
"source": [
"# Exemplo de como obter a RNA para emular FK no problema de Shalow Water 2D"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"background_save": true
},
"id": "aE9D44WssL9b"
},
"outputs": [],
"source": [
"!apt install octave"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "pXcpJb5tsphv"
},
"outputs": [],
"source": [
"!pip install oct2py"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "sJqdi1Srts35"
},
"outputs": [],
"source": [
"%load_ext oct2py.ipython"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "e379KNMcsJl-"
},
"outputs": [],
"source": [
"# Baixa o código KFS2d_rna (shallow water assimilado por FK e RNA) a partir do repositório espelho do github\n",
"!git clone https://github.com/robertopsouto/kfs2d_rna_mirror.git"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "4ZqDc4TGsJl_"
},
"outputs": [],
"source": [
"# Entra no diretório principal do código de shalow water\n",
"%cd kfs2d_rna_mirror"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "3uwc7H9TsJl_"
},
"outputs": [],
"source": [
"# Compilando o código\n",
"!make"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "zJCr_ZWRsJmA"
},
"outputs": [],
"source": [
"# Roda o shell script que chama o executável compilado na célula anterior\n",
"# Usa filtro de Kalman para fazer a assimilação de dados a cada 10 passos no tempo.\n",
"# O ruído no dado de observação é de 10%\n",
"# Uso:\n",
"# ./run-KFS2d.sh assimType gridX gridY timeStep freqObsT freqObsX freqObsY percNoise neuronNumber\n",
" \n",
"!./run-KFS2d.sh 1 10 10 200 10 2 2 0.1 10 1"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "W-OPPEyrsJmA"
},
"outputs": [],
"source": [
"# Indo para o diretório com o dados que serão usados para treinar a RNA, por meio do MPCA\n",
"%cd output/training/"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "_vcN1S4zsJmB"
},
"source": [
"## Script `Octave` que normaliza os valores do modelo, da observação e da análise (obtida com a assimilação de dados). São gerados os arquivos de treinamento (`x.txt` e `y.txt`) de validação cruzada (`x_valid.txt` e `y_valid.txt`) e de generalização (`x_gen.txt` e `y_gen.txt`), que serão os dados de entrada para o `MPCA-ANN`."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "0UYsCtATyYv5"
},
"outputs": [],
"source": [
"%%octave\n",
"qM = load('qModelExpA.out');\n",
"qO = load('qObservExpA.out');\n",
"qA = load('qAnalysisExpA.out');\n",
" \n",
"valNormInf=-1.0;\n",
"valNormSup=+1.0;\n",
" \n",
"qM_norm=(max(qM)*valNormInf-min(qM)*valNormSup+qM*(valNormSup-valNormInf))/(max(qM)-min(qM));\n",
"qO_norm=(max(qO)*valNormInf-min(qO)*valNormSup+qO*(valNormSup-valNormInf))/(max(qO)-min(qO));\n",
"qA_norm=(max(qA)*valNormInf-min(qA)*valNormSup+qA*(valNormSup-valNormInf))/(max(qA)-min(qA));\n",
" \n",
"[l,n]=size(qM);\n",
"pontos_por_ciclo=25;\n",
" \n",
"parc1 = 10*pontos_por_ciclo; \n",
"parc2 = 2*pontos_por_ciclo; \n",
"parc3 = 4*pontos_por_ciclo; \n",
" \n",
"train_range=parc1;\n",
"valid_init=train_range+1;\n",
"valid_end=train_range+parc2;\n",
"gen_init=valid_end+1;\n",
"gen_end=valid_end+parc3;;\n",
" \n",
"fileID = fopen('x.txt','w');\n",
"fprintf(fileID,' %8.5f',qM_norm(1:train_range));\n",
"fprintf(fileID,'\\n');\n",
"fclose(fileID);\n",
"fileID = fopen('x.txt','a');\n",
"fprintf(fileID,' %8.5f',qO_norm(1:train_range));\n",
"fprintf(fileID,'\\n');\n",
"fclose(fileID);\n",
"fileID = fopen('y.txt','w');\n",
"fprintf(fileID,' %8.5f',qA_norm(1:train_range));\n",
"fprintf(fileID,'\\n');\n",
"fclose(fileID);\n",
" \n",
"fileID = fopen('x_valid.txt','w');\n",
"fprintf(fileID,' %8.5f',qM_norm(valid_init:valid_end));\n",
"fprintf(fileID,'\\n');\n",
"fclose(fileID);\n",
"fileID = fopen('x_valid.txt','a');\n",
"fprintf(fileID,' %8.5f',qO_norm(valid_init:valid_end));\n",
"fprintf(fileID,'\\n');\n",
"fclose(fileID);\n",
"fileID = fopen('y_valid.txt','w');\n",
"fprintf(fileID,' %8.5f',qA_norm(valid_init:valid_end));\n",
"fprintf(fileID,'\\n');\n",
"fclose(fileID);\n",
" \n",
"fileID = fopen('x_gen.txt','w');\n",
"fprintf(fileID,' %8.5f',qM_norm(gen_init:gen_end));\n",
"fprintf(fileID,'\\n');\n",
"fclose(fileID);\n",
"fileID = fopen('x_gen.txt','a');\n",
"fprintf(fileID,' %8.5f',qO_norm(gen_init:gen_end));\n",
"fprintf(fileID,'\\n');\n",
"fclose(fileID);\n",
"fileID = fopen('y_gen.txt','w');\n",
"fprintf(fileID,' %8.5f',qA_norm(gen_init:gen_end));\n",
"fprintf(fileID,'\\n');\n",
"fclose(fileID);"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "d6vrw80TzpLk"
},
"outputs": [],
"source": [
"%octave_pull parc1\n",
"%octave_pull parc2\n",
"%octave_pull parc3"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "ntQZUrlbsJmC"
},
"outputs": [],
"source": [
"parc1"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "Ub0G2IyAsJmD"
},
"outputs": [],
"source": [
"parc2"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "lmgQkXeIsJmD"
},
"outputs": [],
"source": [
"parc3"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "BuHJUAx6sJmD"
},
"outputs": [],
"source": [
"%cd ../../../"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "2h2nPEDIsJmE"
},
"outputs": [],
"source": [
"# Baixa o código do mpac-ann do repositório github\n",
"!git clone https://github.com/scsr-inpe/mpca-ann.git"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "zGq7KdyWsJmE"
},
"outputs": [],
"source": [
"# Entra no diretório principal do código\n",
"%cd mpca-ann"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "i-0LLqMjsJmE"
},
"outputs": [],
"source": [
"# Alterna para um commit específico\n",
"!git checkout a52ad36"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "QOsvyL6rsJmE"
},
"outputs": [],
"source": [
"# Remove os arquivos pré-compilados que são baixados\n",
"!make clean"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "fY-sr-yLsJmF"
},
"outputs": [],
"source": [
"# Compila o código \n",
"!make"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "PemHTZoysJmF"
},
"outputs": [],
"source": [
"# Copia os arquivos de treinamento, de validação cruzada e de generalização gerados anteriormente no k, para o diretório 'data' do mpca-ann\n",
"!cp ../kfs2d_rna_mirror/output/training/*.txt data/"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "64RjcabysJmF"
},
"outputs": [],
"source": [
"# Entra no diretório config, para editar os arquivos de configuração do mpca-ann\n",
"%cd config/"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "KucMFahCsJmF"
},
"outputs": [],
"source": [
"# Edita o arquivo original configuration.ini tal que:\n",
"# NCLASSES seja igual ao número de pontos de treinamento em x.txt e y.txt (dado pela variável parc1) \n",
"# NCLASSESVALIDATION seja igual ao número de pontos de validação em x_valid.txt e y_valid.txt (dado pela variável parc2)\n",
"# UPPER_HIDDEN_LAYERS=1 seja igual a LOW_HIDDEN_LAYERS=1, para forçar que a arquitetura da rede tenha somente uma camada\n",
"# LOWER_FIRST_HIDDEN_LAYER=UPPER_FIRST_HIDDEN_LAYER=10, para forçar que esta camana tenha exatamente 10 neurônios\n",
"# LOWER_ACTIVATION_FUNCTION=UPPER_ACTIVATION_FUNCTION=2, para forçar que se use com função de ativação a tangente hiperbólica\n",
" \n",
"!sed -i -e 's/NCLASSES=2000/NCLASSES=250/g' \\\n",
" -e 's/NCLASSESVALIDATION=600/NCLASSESVALIDATION=50/g' \\\n",
" -e 's/UPPER_HIDDEN_LAYERS=2/UPPER_HIDDEN_LAYERS=1/g' \\\n",
" -e 's/LOWER_FIRST_HIDDEN_LAYER=5/LOWER_FIRST_HIDDEN_LAYER=10/g' \\\n",
" -e 's/UPPER_FIRST_HIDDEN_LAYER=25/UPPER_FIRST_HIDDEN_LAYER=10/g' \\\n",
" -e 's/LOWER_ACTIVATION_FUNCTION=1/LOWER_ACTIVATION_FUNCTION=2/g' \\\n",
" -e 's/UPPER_ACTIVATION_FUNCTION=3/UPPER_ACTIVATION_FUNCTION=2/g' \\\n",
" configuration.ini"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "7UC2uFdjsJmG"
},
"outputs": [],
"source": [
"# Edita o arquivo original annConfig.ini, \n",
"# para que o número de classes seja igual ao número de pontos generalização em x_gen.txt e y_gen.txt\n",
" \n",
"!sed -i -e 's/600/100/g' annConfig.in"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "Zt6nJA_AsJmG"
},
"outputs": [],
"source": [
"# Retorna para o diretório do script MPCA-ANN\n",
" \n",
"%cd .."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "G2HKTSEMsJmH"
},
"outputs": [],
"source": [
"# Cria o diretório output para armazenar o resultado do mpca-ann\n",
" \n",
"!mkdir output"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "X30i6IqnsJmH"
},
"outputs": [],
"source": [
"# Roda e script com 1 Experimento, usando 1 Processo MPI\n",
" \n",
"!./annMPCA 1"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "MD-0HGrVsJmH"
},
"outputs": [],
"source": [
"# Roda esta etapa para obter a solução que possui o menor valor da função objetivo com relação aos dados de generalização\n",
" \n",
"!./annMLP 1 1"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "_6wgtg6MsJmH"
},
"outputs": [],
"source": [
"# Copia o arquivo ann#.best, relativo ao experimento que obteve no menor erro na etapa de generalização, para o diretório data\n",
" \n",
"!cp output/ann1.best ../kfs2d_rna_mirror/data/ann.best"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "pBmbAlGNsJmI"
},
"outputs": [],
"source": [
"# Entra no diretório data\n",
" \n",
"%cd ../kfs2d_rna_mirror/data/"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "_a7HzHrosJmI"
},
"outputs": [],
"source": [
"# Roda o shell script que extrai a informação dos pesos e vies do arquivo ann.best\n",
"# São gerados 4 arquivos: wqcsExpA.dat wqcoExpA.dat bqcsExpA.dat bqcoExpA.dat\n",
"# Estes 4 arquivos serão lidos pelo kfs2d, para emular o FK por RNA \n",
" \n",
"!./pesos_vies.sh ann.best"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "3-2qdHYhsJmI"
},
"outputs": [],
"source": [
"%cd ../"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "Nly3OjCWsJmI"
},
"outputs": [],
"source": [
"# Roda o shell script que chama o executável\n",
"# Usa RNA para emular FK na assimilação de dados, a cada 10 passos no tempo.\n",
"# Uso:\n",
"# ./run-KFS2d.sh assimType gridX gridY timeStep freqObsT freqObsX freqObsY percNoise neuronNumber numthreads\n",
" \n",
"!./run-KFS2d.sh 2 10 10 200 10 2 2 0.1 10 1 1"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "1-vvN8EKsJmJ"
},
"outputs": [],
"source": [
"# Entra no diretório onde o resultado da análise obtido com a assimilação por RNA está salvo\n",
" \n",
"%cd output/full/"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "4l2tyUk8sJmJ"
},
"source": [
"## Script `Octave` que gera figura comparando as curvas do modelo (verdade), da análise obtida por assimilação com filtro de Kalman (FK), e também da análise obtida por assimilação com rede neural emulando filtro de Kalman (RNA)."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "i-MKOrGqsJmJ"
},
"outputs": [],
"source": [
"%%octave\n",
" \n",
"qm = load('qModelExpA.out');\n",
"qa = load('qAnalysisExpA.out');\n",
" \n",
"qar = load('qAnalysisExpA_RNA.out');\n",
" \n",
"ni = 5;\n",
"nj = ni;\n",
"nk = 200;\n",
" \n",
"ninj = ni*nj;\n",
"p = 2; % ponto\n",
" \n",
"qm3D = reshape(qm,ni,nj,nk);\n",
"qpm10 = qm3D(p,p,:);\n",
"qpm10v = qpm10(:);\n",
" \n",
"qafk3D = reshape(qa,ni,nj,nk);\n",
"qpa10 = qafk3D(p,p,:);\n",
"qpa10v = qpa10(:);\n",
" \n",
"qr3D = reshape(qar,ni,nj,nk);\n",
"qpr10 = qr3D(p,p,:);\n",
"qpr10v = qpr10(:);\n",
" \n",
"figure(1)\n",
"plot(qpm10v,'b','linewidth',1.5); hold on;\n",
"plot(qpa10v,'r','linewidth',1.5);\n",
"plot(qpr10v,'g','linewidth',1.5);\n",
"title('variavel q'); grid on;\n",
"xlabel('tempo');\n",
"%ylabel('q');\n",
"legend('verdade','FK','RNA')\n",
"axis([1 nk -60 80])\n",
" \n",
"print -dpng -r240 variavelqExpA.png;"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "8Wvrs2_fsJmL"
},
"source": [
"![Variavel q](variavelqExpA.png)"
]
}
],
"metadata": {
"colab": {
"provenance": [],
"name": "sw2d_kf_rna_notebook.ipynb",
"include_colab_link": true
},
"kernelspec": {
"display_name": "Python 3",
"name": "python3"
},
"language_info": {
"name": "python"
},
"sos": {
"kernels": [
[
"Octave",
"octave",
"Octave",
"#dff8fb",
""
],
[
"Python 3",
"python3",
"python3",
"",
{
"name": "ipython",
"version": 3
}
],
[
"SoS",
"sos",
"",
"",
"sos"
]
],
"panel": {
"displayed": false,
"height": 0
},
"version": "0.22.3"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment