高周波エンジニアのためのAI・機械学習入門(GPU編40) バンドパスフィルタのSパラメータの値から点数を間引いて行ってもとのデータが復元できるかDNN(Deep Neural Networks, PythonとKeras利用)を使ってやってみる。8分の1にしてもいい精度で復元できた。
前回はノイズが入ったデータからノイズのないデータを復元することをやってみた。今回はデータを間引いて行って復元できるかやってみよう。
データは前回と同じLCフィルタのデータ。
コードはこんな感じで。
|
import os
os.environ["KERAS_BACKEND"] = "jax"
import keras
import jax
from jax import config
config.update("jax_enable_x64", False)
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'
data_label = np.load("data_label.npz")
data = data_label["data"]
div = 8
reduced_data = data[:, ::div, :]
x_train, x_test, y_train, y_test = train_test_split(reduced_data, data, test_size=0.3, random_state=0)
y_train_list = [y_train[:, : ,1], y_train[:, : ,2], y_train[:, : ,3], y_train[:, : ,4]]
y_test_list = [y_test[:, : ,1], y_test[:, : ,2], y_test[:, : ,3], y_test[:, : ,4]]
# Functional APIでDense層を5層にしたDNNを設定
hidden_dim = 2000
points = 200
inputs = keras.Input(shape=(points//div, 5))
x = keras.layers.Flatten()(inputs)
x = keras.layers.Dense(hidden_dim, activation="relu")(x)
x = keras.layers.LayerNormalization()(x)
x = keras.layers.Dense(hidden_dim, activation="relu")(x)
x = keras.layers.LayerNormalization()(x)
x = keras.layers.Dense(hidden_dim, activation="relu")(x)
x = keras.layers.LayerNormalization()(x)
x = keras.layers.Dense(hidden_dim, activation="relu")(x)
x = keras.layers.LayerNormalization()(x)
x = keras.layers.Dense(hidden_dim, activation="relu")(x)
x = keras.layers.LayerNormalization()(x)
outputs = [keras.layers.Dense(points)(x) for i in range(4)]
model = keras.Model(inputs=inputs, outputs=outputs)
model.compile(loss = 'mean_squared_error' ,optimizer=keras.optimizers.Adam())
# 学習
epochs = 1000
keras.utils.set_random_seed(1)
history = model.fit(
x_train,
y_train_list,
batch_size=128,
epochs=epochs,
validation_split=0.15,
)
y_pred_list = model.predict(x_test)
S11test = 10*np.log10(y_test_list[0]**2 + y_test_list[1]**2)
S21test = 10*np.log10(y_test_list[2]**2 + y_test_list[3]**2)
S11pred = 10*np.log10(y_pred_list[0]**2 + y_pred_list[1]**2)
S21pred = 10*np.log10(y_pred_list[2]**2 + y_pred_list[3]**2)
threshold = 3
# 1. 最大値とインデックス
max_vals = np.max(S21test, axis=1) # shape: (サンプル数,)
max_indices = np.argmax(S21test, axis=1)
# 2. 下限値
lower_bounds = max_vals - threshold
# 3. 条件マスク
mask = S21test >= lower_bounds[:, None]
# 4. インデックス範囲
indices = np.arange(S21test.shape[1])
masked_indices = np.where(mask, indices, np.nan)
min_indices = np.nanmin(masked_indices, axis=1).astype(int)
max_indices = np.nanmax(masked_indices, axis=1).astype(int)
# 5. 切り出し(可変長)
pred_error = [np.mean(np.abs(S21test[i, min_indices[i]:max_indices[i]+1] - S21pred[i, min_indices[i]:max_indices[i]+1]) )
for i in range(S21test.shape[0])]
plt.hist(pred_error, bins = 100, color="red", alpha=0.5, range=(0,0.5), label="予測値の誤差")
plt.xlabel("通過域(最大値から3dB落ち)のS21平均誤差[dB]")
plt.ylabel("頻度")
plt.grid()
plt.legend()
plt.show()
print(f"average predicted value error {np.mean(pred_error)}dB")
|
まずは半分にした結果。通過帯域の平均誤差をヒストグラムにしたもの。
これはなかなかの精度。波形の例も重なっている。
では1/4にしたら?ヒストグラムはこちら。
ほぼ精度落ちてない。波形はこちら。
では1/8では?
やはり精度は落ちてないな。まあこんな単純なLC回路なら予測は簡単、ということか。
« RF Weekly Digest 2026/7/26-8/2 (Codex(GPT-5.6 Sol)で作ったOllama経由のgemma4-26B-A4B QAT、DuckDuckGo Searchを使った高周波・RF情報の週刊まとめPythonアプリ) | トップページ | 777(伊坂幸太郎さん)を読んだ。とても面白かった!東北新幹線の事件で有名になった天道虫が、ホテルに届け物をするだけなのに次々不運に巻き込まれ、殺し屋の死体の山ができる。伏線もすごいが、結末が全く想像もできないほどすごい。タイトルの意味がまさかそういうこととは… »
「パソコン・インターネット」カテゴリの記事
- 高周波・RFニュース 2026年8月20日 Pythonの高周波ライブラリscikit-rfがv2.1.0でTouchstone v2.1に対応、Mini-CircutsがSバンドアップコンバータ製作解説、6Gフォーラムは10月6日開催、Google Pixel 11分解動画で5Gミリ波AiP確認、LitePointとSTMがUWBでコラボ(2026.08.20)
- RF Weekly Digest 2026/8/10-8/16 (Codex(GPT-5.6 Sol)によるRF情報週刊まとめ)(2026.08.16)
- Google Gemini 3.7 Flash(Antigravityから使用)でPythonのscikit-rfを使ってTouchstoneフォーマットのSパラメータファイルを読んでdB, 位相, スミスチャート, TDRを表示するGUIアプリを作成。爆速で一発で頼んだ通りのものができてきた。(2026.08.17)
「学問・資格」カテゴリの記事
- 高周波・RFニュース 2026年8月20日 Pythonの高周波ライブラリscikit-rfがv2.1.0でTouchstone v2.1に対応、Mini-CircutsがSバンドアップコンバータ製作解説、6Gフォーラムは10月6日開催、Google Pixel 11分解動画で5Gミリ波AiP確認、LitePointとSTMがUWBでコラボ(2026.08.20)
- 高周波・RFニュース 2026年8月19日 IEEE Antennas and Propagation Magazine8月号発行、東京農大とロームがテラヘルツ用薄型レンズ開発、I-PEXの細線同軸ケーブル解説ウェビナー、NokiaとMediaTekが3GPPベースGNSS RTKでデシメートル精度を達成(2026.08.19)
- RF Weekly Digest 2026/8/10-8/16 (Codex(GPT-5.6 Sol)によるRF情報週刊まとめ)(2026.08.16)
- Google Gemini 3.7 Flash(Antigravityから使用)でPythonのscikit-rfを使ってTouchstoneフォーマットのSパラメータファイルを読んでdB, 位相, スミスチャート, TDRを表示するGUIアプリを作成。爆速で一発で頼んだ通りのものができてきた。(2026.08.17)
「日記・コラム・つぶやき」カテゴリの記事
- 高周波・RFニュース 2026年8月19日 IEEE Antennas and Propagation Magazine8月号発行、東京農大とロームがテラヘルツ用薄型レンズ開発、I-PEXの細線同軸ケーブル解説ウェビナー、NokiaとMediaTekが3GPPベースGNSS RTKでデシメートル精度を達成(2026.08.19)
- RF Weekly Digest 2026/8/10-8/16 (Codex(GPT-5.6 Sol)によるRF情報週刊まとめ)(2026.08.16)
- Google Gemini 3.7 Flash(Antigravityから使用)でPythonのscikit-rfを使ってTouchstoneフォーマットのSパラメータファイルを読んでdB, 位相, スミスチャート, TDRを表示するGUIアプリを作成。爆速で一発で頼んだ通りのものができてきた。(2026.08.17)
- 高周波・RFニュース特別編 Samsung Galaxy Z Fold 8をiFixitが分解、5Gミリ波AiP(Antenna in Package)はカメラの横に1個あることをCTスキャンでも確認(2026.08.16)
« RF Weekly Digest 2026/7/26-8/2 (Codex(GPT-5.6 Sol)で作ったOllama経由のgemma4-26B-A4B QAT、DuckDuckGo Searchを使った高周波・RF情報の週刊まとめPythonアプリ) | トップページ | 777(伊坂幸太郎さん)を読んだ。とても面白かった!東北新幹線の事件で有名になった天道虫が、ホテルに届け物をするだけなのに次々不運に巻き込まれ、殺し屋の死体の山ができる。伏線もすごいが、結末が全く想像もできないほどすごい。タイトルの意味がまさかそういうこととは… »








コメント