« RF Weekly Digest (Codexで作ったOllama経由のgemma4-26B-A4B QAT、DuckDuckGo Searchを使った高周波・RF情報の週刊まとめアプリ)2026/7/19-7/26 | トップページ | Copilot in Excelで高周波で使うSパラメータのTouchstoneフォーマットのファイルを読み込むライブラリを作る。Microsoft 365 Copilotと違ってGPTでなく、MicrosoftのMAIを使っているらしいと聞いたので。それでも問題なくライブラリが作れた。 »

2026年7月27日 (月)

高周波エンジニアのためのAI・機械学習入門(GPU編39) 大きなノイズが乗ったフィルタのSパラメータの値からノイズ除去するために、DNN(Deep Neural Networks, PythonとKeras利用)を試してみる。

前回、前々回とオートエンコーダを試してみたが、普通のDNNでどうなるかも見てみる。

コード。


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"]
label = data_label["label"]

rng = np.random.default_rng(42)
sigma = 1.0e-1
noise = rng.normal(0.0, sigma, (10000, 200, 4))

noisy_data = data.copy()
noisy_data[:, :, 1:] += noise

x_train, x_test, y_train, y_test = train_test_split(noisy_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層を3層にしたDNNを設定
hidden_dim = 2000
points = 200
inputs = keras.Input(shape=(points, 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)
S11input = 10*np.log10(x_test[:, : ,1]**2 + x_test[:, :, 2]**2)
S21input = 10*np.log10(x_test[:, : ,3]**2 + x_test[:, :, 4]**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])]
original_error = [np.mean(np.abs(S21test[i, min_indices[i]:max_indices[i]+1] - S21input[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,5), label="予測値の誤差")
plt.hist(original_error, bins = 100, color="blue", alpha=0.5, range=(0,5), label = "ノイズが乗ったもともとの誤差")
plt.xlabel("通過域(最大値から3dB落ち)のS21平均誤差[dB]")
plt.ylabel("頻度")
plt.grid()
plt.legend()
plt.show()
print(f"average original error {np.mean(original_error)}dB, average predicted value error {np.mean(pred_error)}dB")

平均誤差をヒストグラムにしたもの。格段に良くなっている!

Noisefilteringdnn1

波形の再現度も上がっている。

Noisefilteringdnn2

なるほどこれは使えそう。次は点数間引いたデータから元の点数を復元できるかなどをやってみる。

 

« RF Weekly Digest (Codexで作ったOllama経由のgemma4-26B-A4B QAT、DuckDuckGo Searchを使った高周波・RF情報の週刊まとめアプリ)2026/7/19-7/26 | トップページ | Copilot in Excelで高周波で使うSパラメータのTouchstoneフォーマットのファイルを読み込むライブラリを作る。Microsoft 365 Copilotと違ってGPTでなく、MicrosoftのMAIを使っているらしいと聞いたので。それでも問題なくライブラリが作れた。 »

パソコン・インターネット」カテゴリの記事

学問・資格」カテゴリの記事

日記・コラム・つぶやき」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

« RF Weekly Digest (Codexで作ったOllama経由のgemma4-26B-A4B QAT、DuckDuckGo Searchを使った高周波・RF情報の週刊まとめアプリ)2026/7/19-7/26 | トップページ | Copilot in Excelで高周波で使うSパラメータのTouchstoneフォーマットのファイルを読み込むライブラリを作る。Microsoft 365 Copilotと違ってGPTでなく、MicrosoftのMAIを使っているらしいと聞いたので。それでも問題なくライブラリが作れた。 »

最近の記事

2026年8月
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31          

最近のコメント

無料ブログはココログ
フォト