Pythonコードで最急降下法でニューラルネットワークを用いた線形計画問題を解きたい。

イメージ説明### 実現したいこと

ここに実現したいことを箇条書きで書いてください。

  • 上の式を解きたい。
  • 初期値が x_{1} (0)=4.5, x_{2} (0) = 0 で目標値が x_{1} x{2} ともに0になる時に目的関数を最小化したい。
  • その時に、最急降下法でニューラルネットワークを学習させたい。

前提

Pythonでニューラルネットワークのシステムを作っています。
学習のコードが書けていないです。

  • 入力層が2つの状態変数で、中間層のユニット数は50個、出力層がu(t) である。
  • $W_{1},W_{2}$は重み、$F_{H}$は、ハイパボリックタンジェント関数,$F_{O}$は恒等関数の活性化関数が使用されている。

発生している問題・エラーメッセージ

発生している問題は色々学習させてみたがうまく学習できていないです。 バイアスの値も0のままです。 目標値が機能していない。 Pythonコード10でニューラルネットワークを学習させて目的関数を最小化させたい。

ソースコード(1)

Pythonコード(1)

12!pip install control 3!pip install --upgrade cvxpy 4!pip install numpy 5 6%reset -f 7import numpy as np 8import scipy as sp 9import matplotlib.pyplot as plt 10from control.matlab import *11import control as ct 12import pandas as pd 13%matplotlib inline 14import math 15#from tensorflow.keras.models import Model # [20]16from keras.models import Sequential 17from keras.layers import Dense 18from keras.optimizers import Adam

ソースコード(2)

Pythonコード

12def object(state, input): #状態方程式3 e = np.exp(1)4 h = 0.015 MAT_A = np.array([[1, 1 - e**(-h)], # A行列6 [0, e**(-h)]])7 8 MAT_B = np.array([[h - 1.0 + e**(-h)], #B行列9 [1 - e**(-h)]])10 11 return np.vstack([MAT_A @ state + MAT_B @ input])12 13

Pythonコード3

1def evaluation(state, input): #時間配列ごとの目的関数2 return state[0, 0]**2 + state[1, 0]**2 + input**2

Pythonコード4(ニューラルネットワーク)

12model1 = Sequential()3model1.add(Dense(50, input_shape=(2,), activation='tanh', use_bias=True))4model1.add(Dense(1, activation='linear', use_bias=False))5 6 7l0 = model1.layers[0] # 入力層の重み バイアス8l1 = model1.layers[1] # model1の重み バイアス9print(l0.get_weights()[0])10print(l0.get_weights()[1])11print(l1.get_weights()[0])

Pythonコード5

1def controller(state, reference): # uの値2 model1_output = model1(np.expand_dims(state, axis=0)) # stateをmodel1に引き渡す。3 model1_weights = model1.get_weights()4 5 return model1_output

Pythonコード6配列の用意

12NUMBER_STEPS = int(900) #NUMBER_STEPSに整数の800配列格納 0.01秒ループ3TIME_START = 0.04TIME_END = 9.05TIME_STEP = (TIME_END - TIME_START)/float(NUMBER_STEPS)6SIZE_INPUT = int(1)7SIZE_OUTPUT = int(2)8SIZE_STATE = int(2)9time_t = np.matrix(np.zeros((1, NUMBER_STEPS)))10input_u = np.matrix(np.zeros((SIZE_INPUT, NUMBER_STEPS)))11output_y = np.matrix(np.zeros((SIZE_OUTPUT, NUMBER_STEPS)))12state_x = np.matrix(np.zeros((SIZE_STATE, NUMBER_STEPS)))13reference_r = np.matrix(np.zeros((SIZE_OUTPUT, NUMBER_STEPS)))14state_dx = np.matrix(np.zeros((SIZE_STATE, 1)))15STATE_INTTAL = np.matrix( ([4.50 ],[0.00]) )#初期値16state_x[:, 0] = STATE_INTTAL 17input_u[:, 0] = controller(state_x[:, 0], reference_r[:, 0])18reference_r[:, 0] = np.array([[0.00],[0.00]]) #目標値19

Pythonコード7オイラー法で微分方程式を解く

1for counter in range(1, NUMBER_STEPS):2 reference_r[:, counter] = np.array([[0.00],[0.00]])3 time_t[:, counter] = TIME_STEP*counter 4 input_u[:, counter-1] = controller(state_x[:, counter-1], reference_r[:, counter-1])5 state_dx = object(state_x[:, counter-1], input_u[:, counter-1])6 state_x[:, counter] = state_x[:, counter-1] + state_dx*TIME_STEP 7

Pythonコード8目的関数の様子

1hyouka = 02hyouka_values = [] #目的関数の空3for counter in range(1, 801): # 評価関数の合計4 hyouka += evaluation(state_x[:, counter], input_u[:, counter - 1])5 hyouka_values.append(hyouka[0, 0])6 7time_steps = range(1, 801)8 9plt.plot(time_steps, hyouka_values)10plt.xlabel("Steps")11plt.ylabel("Hyouka")12plt.show()13 14

Pythonコード9状態変数のグラフ表示

1plt.subplot(1, 3, 1)2plt.plot(np.ravel(time_t), np.ravel(state_x[0, :]),)3plt.xlabel("$time[s]$") #x軸の名前4plt.ylabel("$x_1$") #y軸の名前5#plt.ylim(-1,1) #y軸範囲指定6#plt.xlim(0,80)7 8plt.subplot(1, 3, 2)9plt.plot(np.ravel(time_t), np.ravel(state_x[1, :]))10plt.xlabel("$time[s]$") #x軸の名前11plt.ylabel("$x_2$") #y軸の名前12#plt.ylim(-0.1,0.1) #y軸範囲指定13#plt.xlim(0,10)14 15 16plt.subplot(1, 3, 3)17plt.plot(np.ravel(time_t), np.ravel(input_u[0, :]))18plt.xlabel("$time[s]$") #x軸の名前19plt.ylabel("$.$") #y軸の名前20#plt.ylim(-5,5) #y軸範囲指定21#plt.xlim(0,10)

Pythonコード10学習コード(理想)

1import numpy as np 2import tensorflow as tf 3 4 5for _ in range(1000): #()内は反復回数6 with tf.GradientTape() as tape:7 state_output = model(state_data)8 loss = tf.reduce_mean(tf.square(state_output))9 10 gradients = tape.gradient(loss, model.trainable_variables)11 for i, var in enumerate(model.trainable_variables):12 var.assign_sub(learning_rate * gradients[i])

Pythonコード(1)

試したこと

時間配列なので、全てのことを行おうとすると、何かのコードが抜けたりして、思うように学習ができなかった。

補足情報(FW/ツールのバージョンなど)

特になし。

コメントを投稿

0 コメント