kerasに基づく線形方程式回帰モデル

3971 ワード

0.完全コード
次のコードは2つの機能を実現した:1.kerasライブラリプログラミングを用いて線形方程式にフィットする回帰モデルを実現する.2.4種類のオプティマイザのパフォーマンスを比較しました.各行のコードの役割を説明する:1行目のコードはkerasから.modelsライブラリにSequentialクラスをインポートします.2行目のコードはkeras.LayersライブラリにDenseクラスをインポートします.3行目のコードはkerasライブラリからoptimizersライブラリをインポートします.4行目のコードはnumpyライブラリにインポートされ、別名npとなる.6行目のコードはpythonで定義された主関数の固定フォーマットです.7行目のコードは変数w、すなわち線形方程式における傾きを定義する.8行目のコードは変数b、すなわち線形方程式における縦断面積を定義する.9行目のコードはnpを呼び出す.linspaceメソッドは2-100の中間の50個の点を定義し、変数Xに値を付与する.10行目のコードはndarrayオブジェクトのブロードキャスト特性を利用して、マトリクスの各値にwを乗じ、bを加える.11行目のコード印刷変数Xの最初の5つの数;12行目のコード印刷変数Yの最初の5つの数;13行目のコードはoptimizersを呼び出す.Adamクラスの初期化方法で、オブジェクトをインスタンス化して変数adamに値を付与します.14行目のコードはoptimizersを呼び出す.SGD類の初期化方法は、オブジェクトをインスタンス化して変数sgdに与える.15行目のコードはoptimizersを呼び出す.Adagradクラスの初期化方法で、変数adagradにオブジェクトをインスタンス化します.16行目のコードはoptimizersを呼び出す.Adadeltaクラスの初期化方法で、変数adadeltaにオブジェクトをインスタンス化します.17行目のコードは、4種類のオプティマイザをリストoptimizerに統合します.リスト;18行目のコードは4種類のラウンドをリストepochs_に統合するListでは、epochs中国語を輪次と言います.19行目-20行目のコードは2重サイクルであり、4種類のラウンド、4種類のオプティマイザを組み合わせたサイクルである.21行目のコードはSequentialクラスの初期化方法を呼び出し、インスタンス化オブジェクトは変数modelに値を与える.22行目コード呼び出し変数modelのaddメソッド、全接続層を追加、全接続層入力input_dimは1であり、出力unitsは1である.23行目のコードは変数modelのcompileメソッドを呼び出し、方法は2つのパラメータを必要とし、1番目のキーワードパラメータlossのデータ型は文字列であり、2番目のキーワードパラメータoptimizerのデータ型はオプティマイザオブジェクトである.24行目コード呼び出し変数modelのfitメソッドは、モデルトレーニングを開き、fitメソッドには5つのパラメータが必要であり、1番目のパラメータは特徴行列X、2番目のパラメータは予測目標値Y、3番目のキーワードパラメータsteps_per_epochは1ラウンド当たりのトレーニングステップ数であり、4番目のキーワードパラメータepochsはトレーニングホイールであり、5番目のキーワードパラメータverboseはトレーニングプロセスの情報を印刷するかどうかである.25行目のコードは、訓練されたモデルのw値を取得し、変数trained_に値を付与する.w; 26行目のコードは、訓練されたモデルのb値を取得し、変数trained_に値を付与する.b; 27行目コードは絶対値メソッドabsを呼び出し、w値誤差を計算し、変数w_に値を与えるerror; 28行目コードは絶対値メソッドabsを呼び出し、b値誤差を計算し、変数b_に値を与えるerror; 29行目-30行目コード印刷プロンプト情報.
from keras.models import Sequential
from keras.layers import Dense
from keras import optimizers
import numpy as np

if __name__ == '__main__':
    w = 2.5
    b = 1.5
    X = np.linspace(2, 100, 50)
    Y = X * w + b
    print('X[:5]:', X[:5])
    print('Y[:5]:', Y[:5])
    adam = optimizers.Adam(lr=0.02)
    sgd = optimizers.SGD(lr=0.0002)
    adagrad = optimizers.Adagrad(lr=0.3)
    adadelta = optimizers.Adadelta(lr=0.3)
    optimizer_list = [adam, sgd, adagrad, adadelta]
    epochs_list = [100, 200, 500, 1000]
    for epochs in epochs_list:
        for optimizer in optimizer_list:
            model = Sequential()
            model.add(Dense(input_dim=1, units=1))
            model.compile(loss='mse', optimizer=optimizer)
            model.fit(X, Y, steps_per_epoch=10, epochs=epochs, verbose=False)
            trained_w = model.layers[0].get_weights()[0][0][0]
            trained_b = model.layers[0].get_weights()[1][0]
            w_error = abs(trained_w - w)
            b_error = abs(trained_b - b)
            print('epochs:%d,      :%s,\t w  :%.4f, b  :%.4f'
                  %(epochs, optimizer.__class__, w_error, b_error))

上記のコードの実行結果は次のとおりです.
X[:5]: [ 2. 4. 6. 8. 10.] Y[:5]:[6.5 11.5 16.5 21.5 26.5]epochs:100,オプティマイザ種別:,w誤差:0.0083,b誤差:0.5539 epochs:100,オプティマイザ種別:,w誤差:0.0195,b誤差:1.3155 epochs:100,オプティマイザ種別:,w誤差:0.0297,b誤差:1.9919 epochs:100,オプティマイザ種別:,w誤差:0.9875 epochs:200,オプティマイザ種別:,w誤差:0.0032,b誤差:0.2133 epochs:200,オプティマイザ種別:,w誤差:0.0181,b誤差:1.2160 epochs:200,オプティマイザ種別:,w誤差:0.0046,b誤差:0.3051 epochs:200,オプティマイザ種別:,w誤差:0.3739,b誤差:0.3786 epochs:500,オプティマイザ種別:,w誤差:0.0000,b誤差:0.0000 epochs:500,オプティマイザ種別:,w誤差:0.9093 epochs:500,オプティマイザ種別:,w誤差:0.0050,b誤差:0.3327 epochs:500,オプティマイザ種類:,w誤差:0.0027,b誤差:0.0172 epochs:1000,オプティマイザ種類:,w誤差:0.0000,b誤差:0.0000 epochs:1000,オプティマイザ種類:,w誤差:0.0083,b誤差:0.5563 epochs:1000,オプティマイザ種類:,w誤差:0.0141,b誤差:0.9425 epochs:1000,オプティマイザ種類:,w誤差:0.0101,b誤差:0.4870
上記の運転結果から、epochsが100の場合、Adamオプティマイザの効果が最も優れ、SGDオプティマイザが劣ることがわかります.epochsが200の場合、Adamオプティマイザの効果が最も優れ、Adagradオプティマイザが劣る.epochsが500の場合、Adamオプティマイザの効果が最も優れ、Adadeltaオプティマイザが劣る.epochsが1000の場合、Adamオプティマイザの効果が最も優れています.
1.結論
線形方程式の回帰モデルでは,Adamオプティマイザを用いて良好なフィット効果を得ることができる.