高周波エンジニアのためのAI・機械学習入門(GPU編17)PythonとKeras3.0とscikit-rfを使ってディープラーニング(DNN)で同軸コネクタがついたマイクロストリップライン(誘電率、L、C、線幅、厚みを振った)のSパラメータからTDRでは出せない複素特性インピーダンスを推定する。
以前、DNNを使って伝送線路の特性インピーダンスをSパラメータの値からTDRを使わずに出してみて精度が非常によかった。
今度は複素特性インピーダンスを予測してみよう。TDRでは実部しかわからないが、scikit-rfでは伝送線路の複素特性インピーダンスを出す機能があるのでそれを学習させる。
一個のデータ作る関数はこれ。
def mesurement_jig(fstart, fstop, n, coaxial_length, cap, ind, width, length, height, er):
"""
測定治具を模したSパラメータ及び基板の特性インピーダンスを返す関数
測定治具は
同軸コネクタ→シャントC→シリーズL
→基板に形成されたマイクロストリップライン
→シリーズL→シャントC→同軸コネクタの構成
導体損・tanδは今回は固定されている。
Parameters
----------
fstart : float
最低周波数[GHz]
fstop : float
最高周波数[GHz]
n : int
周波数分割数
coaxial_length : float
同軸コネクタ部分の長さ[mm]
cap : float
同軸コネクタ・基板接続部キャパシタンス[pF]
ind : float
同軸コネクタ・基板接続部インダクタンス[nH]
width : float
線路幅[mm]
length : float
線路長さ[mm]
height : float
基板厚み[mm]
er : float
基板比誘電率
Returns
-------
Stl : scikit-rfのNetwork
測定治具のSパラメータ
z0 : float
中央周波数の特性インピーダンス
"""
#周波数範囲設定
freq = rf.Frequency(fstart, fstop, n, "GHz")
#同軸コネクタのパラメータ(SMA相当)
coax = Coaxial(frequency=freq, Dint=1.3e-3, Dout = 4.59e-3, epsilon_r=2.29, tan_delta=4e-4, sigma=1/0.022e-6, z0_port=50)
#マイクロストリップラインのパラメータ
msl = MLine(frequency=freq, z0_port=50, w=width*1e-3, h=height*1e-3, t=35e-6, ep_r=er, tand=0.01, rho=1e-8, rough=0.127e-6)
#同軸コネクタの長さ決定
coax_line = coax.line(coaxial_length, unit="mm", name="coax_line")
#マイクロストリップラインの長さ決定
msl_line = msl.line(length, unit="mm", name = "msl_line")
#同軸コネクタと基板の接続部のLC
C = msl.shunt_capacitor(cap * 1e-12)
L = msl.inductor(ind * 1e-9)
#Casccade接続する
Stl = coax_line ** C ** L ** msl_line ** L ** C ** coax_line
#中心周波数の基板の特性インピーダンスを求める。
z0r = msl.z0[n // 2].real
z0i = msl.z0[n // 2].imag
return Stl, z0r, z0i
|
これで誘電率、L、C、線幅、厚みを振ったデータを10000個作り、DNNで学習して予測する。
import os
os.environ["KERAS_BACKEND"] = "jax"
import keras
import jax
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
plt.rcParams['font.family'] = 'Noto Sans CJK JP'
from jax import config
config.update("jax_enable_x64", False)
data_label = np.load("complex_tl_data.npz")
data = data_label["data"]
label = data_label["label"]
x_train, x_test, y_train, y_test = train_test_split(data, label, test_size=0.3, random_state=0)
#正規化
scaler_y = StandardScaler()
y_train_f = scaler_y.fit_transform(y_train)
y_test_f = scaler_y.transform(y_test)
# Functional APIでDense層を3層にしたDNNを設定
hidden_dim = 200
inputs = keras.Input(shape=(200, 5))
x = keras.layers.Flatten()(inputs)
x = keras.layers.Dense(hidden_dim, activation="relu")(x)
x = keras.layers.LayerNormalization(epsilon=1.0e-6)(x)
x = keras.layers.Dense(hidden_dim, activation="relu")(x)
x = keras.layers.LayerNormalization(epsilon=1.0e-6)(x)
x = keras.layers.Dense(hidden_dim, activation="relu")(x)
x = keras.layers.LayerNormalization(epsilon=1.0e-6)(x)
x = keras.layers.Dense(hidden_dim, activation="relu")(x)
x = keras.layers.LayerNormalization(epsilon=1.0e-6)(x)
outputs = keras.layers.Dense(2)(x)
# モデルの設定
model = keras.Model(inputs=inputs, outputs=outputs)
model.compile(loss = 'mean_squared_error' ,optimizer=keras.optimizers.Adam())
batch_size = 128
epochs = 500
keras.utils.set_random_seed(1)
history = model.fit(
x_train,
y_train_f,
batch_size=batch_size,
epochs=epochs,
validation_split=0.15,
)
y_pred_f = model.predict(x_test)
y_pred = scaler_y.inverse_transform(y_pred_f)
metric = keras.metrics.R2Score()
metric.update_state(y_test, y_pred)
result = metric.result()
print(result)
error = np.abs((y_test - y_pred)/y_test*100)
print(error.mean(axis=0))
legend = ["Z0"]
fig, ax = plt.subplots(2, 2, figsize=(12,12))
maxrvalue = y_pred[:,0].max()
minrvalue = y_pred[:,0].min()
maxivalue = y_pred[:,1].max()
minivalue = y_pred[:,1].min()
ax[0, 0].scatter(y_pred[:,0], y_test[:,0], c="r", s=5)
ax[0, 0].plot([0,maxrvalue], [0,maxrvalue], "--", c="black")
ax[0, 0].set_xlabel("推定した値(実部)")
ax[0, 0].set_ylabel("実際の値(実部)")
ax[0, 0].set_xlim(minrvalue, maxrvalue)
ax[0, 0].set_ylim(minrvalue, maxrvalue)
ax[0, 0].grid()
ax[0, 0].legend([legend[0] + f" 平均誤差(実部){error.mean(axis=0)[0]:.2f}%"])
ax[1, 0].hist(error[:, 0], bins = 100)
ax[1, 0].set_xlabel("誤差[%](実部)")
ax[1, 0].set_ylabel("頻度")
ax[1, 0].grid()
ax[0, 1].scatter(y_pred[:,1], y_test[:,1], c="r", s=5)
ax[0, 1].plot([0,maxivalue], [0,maxivalue], "--", c="black")
ax[0, 1].set_xlabel("推定した値(虚部)")
ax[0, 1].set_ylabel("実際の値(虚部)")
ax[0, 1].set_xlim(minivalue, maxivalue)
ax[0, 1].set_ylim(minivalue, maxivalue)
ax[0, 1].grid()
ax[0, 1].legend([legend[0] + f" 平均誤差(虚部){error.mean(axis=0)[1]:.2f}%"])
ax[1, 1].hist(error[:, 1], bins = 100)
ax[1, 1].set_xlabel("誤差[%](虚部)")
ax[1, 1].set_ylabel("頻度")
ax[1, 1].grid()
fig.tight_layout()
plt.show()
|
結果はこちら。
まずまずの結果だが、もうちょっと良くならないかということでCNNを試す(続く)。
« 高周波・RFニュース 2026年3月25日 Kymetaが衛星通信端末Kestrel u5発表、VIAVIとRCRwirelessがテストにおけるAIのレポート発行、TIがデータセンター向けに絶縁型電源モジュール発表、APEC2026に各社が出展 | トップページ | 高周波・RFニュース 2026年3月26日 iFixitがSamsung Galaxy S26 Ultra分解・5Gミリ波AiPは1個のみ、Ericssonとユーリッヒ研究センターが6G向けAI開発、QualcommがRF被ばく管理について解説、Mini-Circuitsがリミッター回路について解説など »
「パソコン・インターネット」カテゴリの記事
- Qwen3.6-35B-A3Bが発表され、Ollamaでも使える。そこで電子レンジの動作原理(2.45GHzは水分子の共振周波数でない)と隕石が大気圏突入で燃える原理(摩擦熱ではない)を聞くと、誘電緩和と断熱圧縮について正しく答えられた。今までのローカルLLMで一番賢い回答と思う。(2026.04.17)
- ExcelのOfficeスクリプト(TypeScript)で数値計算ライブラリmath.jsを使う(1) Officeスクリプトは外部API呼び出せるし、math.jsは RESTful APIで呼び出せることがわかった。まずは選択したセルのデータを読み、行列演算。LU分解で一次方程式を解き、逆行列と行列式を求める。(2026.04.17)
- RF Weekly Digest (Gemini 3.1 Pro・Google AI Studio BuildによるAIで高周波・RF情報の週刊まとめアプリ)2026/4/5-4/12(2026.04.12)
- GLM-5.1(Ollamaから利用)でPythonのscikit-rfを使ってTouchstoneフォーマットのSパラメータファイルを読んでdB, 位相, スミスチャート, TDRを表示するGUIアプリを作ってもらった。5分など長く考えた後、Gemma 4:31bよりさらに出来が良く、思った通りのものができた。(2026.04.09)
「学問・資格」カテゴリの記事
- Qwen3.6-35B-A3Bが発表され、Ollamaでも使える。そこで電子レンジの動作原理(2.45GHzは水分子の共振周波数でない)と隕石が大気圏突入で燃える原理(摩擦熱ではない)を聞くと、誘電緩和と断熱圧縮について正しく答えられた。今までのローカルLLMで一番賢い回答と思う。(2026.04.17)
- 高周波・RFニュース 2026年4月17日 atisの3GPP Rel.20ウェビナー動画公開、MWCバルセロナ2026でのGSMA Device Enablement Summit資料公開、ハリファ大学が無線周波数AI言語モデルRF-GPT発表、レドームの解説など(2026.04.17)
- ExcelのOfficeスクリプト(TypeScript)で数値計算ライブラリmath.jsを使う(1) Officeスクリプトは外部API呼び出せるし、math.jsは RESTful APIで呼び出せることがわかった。まずは選択したセルのデータを読み、行列演算。LU分解で一次方程式を解き、逆行列と行列式を求める。(2026.04.17)
- 高周波・RFニュース 2026年4月16日 AmazonがGlobalstarを買収、GSMAが日本のデジタル化をレポート、Mini-Circuitsがケーブルアセンブリを動画で解説、Kymetaが米国海軍研究局と衛星通信で契約、PerasoがドローンIFF向け60GHzモジュール出荷、SEMCOが1500V耐圧MLCC発表(2026.04.16)
- 高周波・RFニュース 2026年4月15日 Microwave Journalはアンプと発振器特集、Signal Integrity Journalは100GHz越えのインターコネクトのAIを使うHFSSモデル化、ローデ・シュワルツが潜水艦通信をUDT2026で発表、Xiaomi Poco X8 Pro分解動画、atisの5Gポリシーレポート(2026.04.15)
「日記・コラム・つぶやき」カテゴリの記事
- Qwen3.6-35B-A3Bが発表され、Ollamaでも使える。そこで電子レンジの動作原理(2.45GHzは水分子の共振周波数でない)と隕石が大気圏突入で燃える原理(摩擦熱ではない)を聞くと、誘電緩和と断熱圧縮について正しく答えられた。今までのローカルLLMで一番賢い回答と思う。(2026.04.17)
- 高周波・RFニュース 2026年4月17日 atisの3GPP Rel.20ウェビナー動画公開、MWCバルセロナ2026でのGSMA Device Enablement Summit資料公開、ハリファ大学が無線周波数AI言語モデルRF-GPT発表、レドームの解説など(2026.04.17)
- ExcelのOfficeスクリプト(TypeScript)で数値計算ライブラリmath.jsを使う(1) Officeスクリプトは外部API呼び出せるし、math.jsは RESTful APIで呼び出せることがわかった。まずは選択したセルのデータを読み、行列演算。LU分解で一次方程式を解き、逆行列と行列式を求める。(2026.04.17)
- 高周波・RFニュース 2026年4月16日 AmazonがGlobalstarを買収、GSMAが日本のデジタル化をレポート、Mini-Circuitsがケーブルアセンブリを動画で解説、Kymetaが米国海軍研究局と衛星通信で契約、PerasoがドローンIFF向け60GHzモジュール出荷、SEMCOが1500V耐圧MLCC発表(2026.04.16)
- 高周波・RFニュース 2026年4月15日 Microwave Journalはアンプと発振器特集、Signal Integrity Journalは100GHz越えのインターコネクトのAIを使うHFSSモデル化、ローデ・シュワルツが潜水艦通信をUDT2026で発表、Xiaomi Poco X8 Pro分解動画、atisの5Gポリシーレポート(2026.04.15)
« 高周波・RFニュース 2026年3月25日 Kymetaが衛星通信端末Kestrel u5発表、VIAVIとRCRwirelessがテストにおけるAIのレポート発行、TIがデータセンター向けに絶縁型電源モジュール発表、APEC2026に各社が出展 | トップページ | 高周波・RFニュース 2026年3月26日 iFixitがSamsung Galaxy S26 Ultra分解・5Gミリ波AiPは1個のみ、Ericssonとユーリッヒ研究センターが6G向けAI開発、QualcommがRF被ばく管理について解説、Mini-Circuitsがリミッター回路について解説など »



コメント