アミロイドがリチウムを集めてしまって周囲の細胞がリチウム不足になって細胞が正常に機能しなくなるらしい。 そして、アミロイドが集めにくいリチウム塩をアルツハイマー病のマウスに投与すると、認知障害を予防できたらしい。
ほんとかな。マウスでならそうなのかも。 https://doi.org/10.1038/s41586-025-09335-xhttps://doi.org/10.1038/d41586-025-02255-w
~ただのメモ置き場。なので、内容の正しさについての保証は一切ありませんよ~ copyright (c) 2006-2025 bluewidz, all rights reserved.
アミロイドがリチウムを集めてしまって周囲の細胞がリチウム不足になって細胞が正常に機能しなくなるらしい。 そして、アミロイドが集めにくいリチウム塩をアルツハイマー病のマウスに投与すると、認知障害を予防できたらしい。
ほんとかな。マウスでならそうなのかも。 https://doi.org/10.1038/s41586-025-09335-x
投稿者
bluewidz
0
コメント
生成AIの分かりやすい定義をようやく見つけた。
https://www.stateof.ai/で公開されている スライドにこう書かれていた。Generative AI: A family of AI systems that are capable of generating new content (e.g. text, images, audio, or 3D assets) based on 'prompts'.つまり、プロンプト(指示文)が入力に必要ということ。そのため、単に入力データを変換するもの、例えば、
投稿者
bluewidz
0
コメント
人間が実行する場合は倫理的な行動をするけれど、同じタスクをLLMに指示して代わりに実行させる場合、直接実行する場合に比べて倫理的な行動が減るらしい。
https://doi.org/10.1038/d41586-025-02819-w
投稿者
bluewidz
0
コメント
https://doi.org/10.1038/s41586-025-09127-3 によると、脳表面に設置した電極(ECoG)から取得したデータを使ってリアルタイムに音声を合成できるようになったらしい。Supplementary Videoを見る限り、速度はまだまだではあるものの、イントネーションも変えられるし、強調もできるような発声ができている。
ここまで出来るようになっているので、普通に発話できるようになるのも時間の問題だと思われる。 一方、ECoGではこのレベルで動くようになっているものの、EEGで同じことをするのはまだまだ難しいのだろう。
投稿者
bluewidz
0
コメント
OpenHandsをローカルLLMで動かしてみます。
$ docker run -d --gpus=all -v ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollamaを実行するとollamaが立ち上がります。
$ docker exec -it ollama bashでdocker内に入って、ollamaを実行すると
root@xxxxxxxx:/# ollama Usage: ollama [flags] ollama [command] Available Commands: serve Start ollama create Create a model from a Modelfile show Show information for a model run Run a model stop Stop a running model pull Pull a model from a registry push Push a model to a registry list List models ps List running models cp Copy a model rm Remove a model help Help about any command Flags: -h, --help help for ollama -v, --version Show version information Use "ollama [command] --help" for more information about a command.となり、ollamaが実行できることが確認できます。
hhao/qwen2.5-coder-tools:7b 1fbf62f22cd4 4.7 GB codegemma:7b 0c96700aaada 5.0 GB llama3.2:3b a80c4f17acd5 2.0 GB codellama:7b 8fdf8f752f6e 3.8 GB qwen2.5-coder:3b e7149271c296 1.9 GB opencoder:1.5b 8573dfc23c16 1.4 GB opencoder:8b cd882db52297 4.7 GBもっと良いLLMがあるかもしれませんが、ここではhhao/qwen2.5-coder-tools:7bを使って進めます。runすると
/# ollama run hhao/qwen2.5-coder-tools:7b >>> Send a message (/? for help)と表示され、OpenHandsからアクセスできる状態になりました。試しにメッセージを入れてみると、
>>> Pythonでhelloと出力するスクリプトを作成してください
```python
print("hello")
```
とか
>>> rustでhelloと出力するコードを書いて、ビルドして実行する方法を書いてください
```json
{
"name": "create_file",
"arguments": {
"filename": "main.rs",
"content": "fn main() {\n println!(\"Hello\");\n}"
}
}
```
のように出力されました。日本語でも動きそうです。OpenHandsから呼び出すときにollama runが実行されている必要はありません。
curl http://host.ip.address:11434/api/generate -d '{
"model": "hhao/qwen2.5-coder-tools:7b",
"prompt":"Write a bash script that prints hello"
}'
json形式の応答が返ってくれば、動作しています。
docker run -it --rm -e SANDBOX_RUNTIME_CONTAINER_IMAGE=docker.all-hands.dev/all-hands-ai/runtime:0.29-nikolaik \
-e LOG_ALL_EVENTS=true \
-e LOG_JSON=false \
-e LOG_LEVEL=DEBUG \
-e DEBUG=true \
-e OLLAMA_API_BASE=http://host.ip.address:11434 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v ~/.openhands-state:/.openhands-state \
-p 3000:3000 \
--add-host host.docker.internal:host-gateway \
--name openhands-app \
docker.all-hands.dev/all-hands-ai/openhands:0.29
host.ip.addressは適切な値に書き換えてください。
KVM内のブラウザでlocalhost:3000にアクセスします。
左下の⚙アイコンをクリックして、
Custom model: ollama/hhao/qwen2.5-coder-tools:7b Base URL: http://host.ip.address:11434 API Key: なんでもOK Agent: CodeActAgentと設定します。 これで動くようになります。指示として例えば
Could you write a bash script that just prints "こんにちは" ?を入力すると動き始め、下図のようになりました。 ただ、ファイルはつくれたもののその後はうまく動作しなくなってしまいました。 OpenHandsを活用するには、もっと賢いLLMが必要なようです。
投稿者
bluewidz
0
コメント
FLUX.1のSchnellモデルを使った画像生成をしてみます。
./build/bin/sd --diffusion-model models/flux1-schnell-Q2_K.gguf --vae models/ae.safetensors --clip_l models/clip_l.safetensors --t5xxl models/t5xxl_fp16.safetensors -p "a frog holding a sign saying 'hi' " -o ../frog.png -v --cfg-scale 1.0 --sampling-method euler -v --seed 42 --steps 4を実行します。 以下の様な蛙の画像が出力されます。 他にも
./build/bin/sd --diffusion-model models/flux1-schnell-Q2_K.gguf --vae models/ae.safetensors --clip_l models/clip_l.safetensors --t5xxl models/t5xxl_fp16.safetensors -p "Photo-realistic Rabbit running in meadow" -o ../frog.png -v --cfg-scale 1.0 --sampling-method euler -v --seed 10 --steps 20を実行すると となります。 T5XXLはモデルサイズは大きいもののGPUメモリはあまり必要ないようで、デフォルトの512x512のサイズの画像生成時に観測できた範囲ではGPUメモリの使用量は4.7GBくらいでした。
./build/bin/sd --diffusion-model models/flux1-schnell-Q4_K.gguf --vae models/ae.safetensors --clip_l models/clip_l.safetensors --t5xxl models/t5xxl_fp16.safetensors -p "Photo-realistic Rabbit running in meadow" -o ../frog.png -v --cfg-scale 1.0 --sampling-method euler -v --seed 13 --steps 20のようにQ2_KではなくQ4_Kを使ってみると となります。 Q2_KではなくQ4_Kのモデルの方を使った場合、デフォルトの512x512のサイズの画像生成時に観測できた範囲ではGPUメモリの使用量は7.4GBくらいでした。 試した範囲では実行結果に再現性があり、コマンドの引数が同じであれば同じ結果が出力されるようです。
投稿者
bluewidz
0
コメント
Landlock (を使ったsandboxer) による制限をかけるときにnvidia-smiを実行するには、次のパスを許可すれば良いようです。
LL_FS_RW=$(ls /dev/nvidia* | tr '\n' ':' | sed 's/:$//') LL_FS_RO="/usr/lib:/usr/bin" ./sandboxer nvidia-smiRO側はもう少し制限をかけることができるかもしれません。 nvidia-smiだけでなく、NVidiaのGPUを計算に利用するには、
LL_FS_RW="/proc:"$(ls /dev/nvidia* | tr '\n' ':' | sed 's/:$//') LL_FS_RO="/usr/lib:/usr/bin" ./sandboxer /path/to/appのように/procを読み書き権限で追加する必要があるようです。 アプリケーション依存かもしれませんので、必ずしもこれだけで使えるようになるとは限りません。
投稿者
bluewidz
0
コメント
最近のUbuntuやDebianのシステムに入っているPythonでpip installしようとすると、
error: externally-managed-environmentと言われ、venv環境を作れと言ってきます。 全体で使いたいパッケージをいちいちvenv環境に入ってインストールして、というのは手間なので、 エラーメッセージに書かれているとおり、Debian/Ubuntuのパッケージにある pipx をインストールします。 そのうえで、
$ pipx install uvとすると、uvをインストールできて、全体でuvが使えるようになります。
投稿者
bluewidz
0
コメント
編集距離(Edit Distance, Levenshtein Distance)の計算のライブラリは今となってはたくさんありそうですが、 いい感じに表示できる jiwer (https://jitsi.github.io/jiwer/) というPythonのライブラリがあったので、メモ。
こんな感じで書けます。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 32 33 34 | import jiwer import jaconv def main(): reference = "hello world" hypothesis = "hello duck" error = jiwer.wer(reference, hypothesis) print(error) error = jiwer.cer(reference, hypothesis) print(error) print("--------------") output = jiwer.process_characters(reference, hypothesis) print(jiwer.visualize_alignment(output)) print("--------------") output = jiwer.process_characters("あいうえお", "あううお") prev_hyp = False for line in jiwer.visualize_alignment(output).split("\n"): zen = False if prev_hyp: prev_hyp = False zen = True if line[:4] == "REF:": zen = True if line[:4] == "HYP:": zen = True prev_hyp = True if zen: line = jaconv.h2z(line, kana=True, digit=True, ascii=True) print(line) if __name__ == "__main__": main() |
0.5
0.45454545454545453
--------------
sentence 1
REF: hello world
HYP: hello duck*
SSSSD
number of sentences: 1
substitutions=4 deletions=1 insertions=0 hits=6
cer=45.45%
--------------
sentence 1
REF: あいうえお
HYP: あうう*お
S D
number of sentences: 1
substitutions=1 deletions=1 insertions=0 hits=3
cer=40.00%
のようになります。
投稿者
bluewidz
0
コメント
話者ベクトルをhttps://github.com/speechbrain/speechbrain.gitで取得してみます。
話者ベクトルの計算にはEncoderClassifier.encode_batchを使います。サンプリング周波数16kHzの音声データをこの関数に入力すると話者ベクトルが得られます。 それ以外の部分は音声の読み込みとt-SNEによる2Dベクトル化、散布図描画のための色の選択と、散布図の作成をしているだけです。 35行目でEncoderClassifierを作成して、52行目で話者ベクトルを取得します。 audio-16k.listは1行ごとに.wavファイルへのパスが書かれていることを想定しています。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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | import sys
from collections import defaultdict
import numpy as np
import matplotlib.pyplot as plt
from sklearn.manifold import TSNE
import torchaudio
sys.path.append("speechbrain")
from speechbrain.inference import EncoderClassifier
def make_colormap(label_list, min_count):
color_map = defaultdict(int)
for label in label_list:
color_map[label] += 1
color_map_sorted = []
for k, v in color_map.items():
color_map_sorted.append((v, k))
color_map_sorted = reversed(sorted(color_map_sorted))
colors = ["b", "g", "r", "c", "m", "y", "k", "C0", "C1", "C2", "C3", "C4", "C5", "C6", "C7", "C8", "C9"]
cindex = 0
for v, k in color_map_sorted:
if v < min_count:
color_map[k] = None
continue
color_map[k] = colors[cindex] if cindex < len(colors) else "grey"
cindex += 1
color_list = []
for i in range(len(label_list)):
color_list.append(color_map[label_list[i]])
return color_list
def main(wav_list):
ec = EncoderClassifier.from_hparams(
source="speechbrain/spkrec-ecapa-voxceleb",
savedir="cache",
run_opts={"device": "cuda"},
use_auth_token=False
)
ec.hparams.label_encoder.ignore_len()
embed_list = []
label_list = []
with open(wav_list) as wavs:
i = 0
for line in wavs:
i += 1
line = line.strip()
signal, fs = torchaudio.load(line)
assert fs == 16000
# Get a speaker vector
embed_list.append(ec.encode_batch(signal, wav_lens=None).squeeze(dim=1).cpu().numpy())
label_list.append(line.split("/")[1].split("_")[0]) # Get speaker name
if i % 100 == 0:
print(i)
label_list = make_colormap(label_list, min_count=100)
# Filter speaker vectors
embed_list = [embed_list[i] for i in range(len(label_list)) if label_list[i] is not None]
label_list = [label_list[i] for i in range(len(label_list)) if label_list[i] is not None]
embed_list = np.concatenate(embed_list)
tsne = TSNE(n_components=2, random_state=123)
vec_2d = tsne.fit_transform(embed_list)
plt.figure(figsize=(10, 8))
plt.scatter(vec_2d[:,0], vec_2d[:,1], alpha=0.7, c=label_list)
plt.title("t-SNE visualization of speaker vectors")
plt.xlabel("t-SNE feature 1")
plt.ylabel("t-SNE feature 2")
plt.grid(True, linestyle="--", alpha=0.7)
plt.savefig("spk_distribution.png", dpi=300, bbox_inches="tight")
plt.close()
if __name__ == "__main__":
main("audio-16k.list")
|
投稿者
bluewidz
0
コメント
Debianを11から12にアップグレードしたところ、moreコマンドのデフォルトの挙動が変化しました。
具体的には、表示するテキストの行が画面の行数よりも短いときは、単にcatで出力される状態であったのに、画面をクリアして画面の上部に表示されるようになりました。 lessでいうと、less -Fの挙動をしていたものが、less -cに似た挙動に変更されてしまいました。しかも、元の画面を削除して復旧しないという挙動です。 less -Fが手間なのでmoreを使っていたのに、これは困ったことになってしまいました。 PerplexityによるとLinuxのmoreコマンドの動作変更は、util-linux パッケージのバージョン2.38で導入されました。この変更により、表示する内容が端末の画面高さよりも少ない行数の場合でも、画面の上部から表示されるようになりました。 この変更は、より一貫性のある動作を提供し、ユーザーエクスペリエンスを向上させることを目的としています。以前のバージョンでは、内容が短い場合に画面の下部に表示されることがあり、これが一部のユーザーにとって混乱を招く原因となっていました。 util-linux 2.38は2022年4月にリリースされており、この版で上記の動作変更が実装されました。したがって、util-linux 2.37.2と2.38.1の間で発生したこの変更は、正確には2.38で導入されたものです。とのこと。 moreコマンドが含まれているlinux-utilのバージョンは、Debian 11では2.36.1、Debian 12では2.38.1です。また、Ubuntu 22.04のmoreはDebian 11と挙動が同じで、そのバージョンは2.37.2です。 そこで、linux-utilのログを調べてみると、
2021-06-01 build-sys: release++ (v2.37)v2.37 2022-01-31 build-sys: release++ (v2.38-rc1)v2.38-rc1 2022-03-28 build-sys: release++ (v2.38)v2.38でした。これらの間のどこかに変更が含まれているはずです。 調べてみると
commit df6b29d3b8e9a55d2bfa69c593e17da4d11a3fac
AuthorDate: Wed Sep 29 14:50:14 2021 +0200
CommitDate: Wed Sep 29 14:50:14 2021 +0200
more: POSIX compliance patch preventing exit on EOF without -e
で-eオプションが導入されて、デフォルトの挙動が変わっていました。とても煩わしいです。
さらにその後のコミットをたどっていくと、なんと、
commit 28b391ce7e58f8327c092b3911c05f526d0ad586
AuthorDate: Wed Jun 15 10:03:44 2022 +0200
CommitDate: Wed Jun 15 10:03:44 2022 +0200
more: restore exit-on-eof if POSIXLY_CORRECT is not set
In version 2.38, exit-on-eof has been disabled by default. This change
is annoying for users and forces many users to use 'alias more="more
-e"'. It seems better to force POSIX lovers to use POSIXLY_CORRECT
env. variable and stay backwardly compatible by default.
Addresses: https://github.com/util-linux/util-linux/issues/1703
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=2088493
がコミットされていて、POSIXでないとやだ!っていう人は環境変数POSIXLY_CORRECTを使いなさいという形に戻っていました。
Debian 12のパッケージ更新タイミングの運のなさよ。とりあえず、alias more="more -e"で回避するしか無さそうです。
投稿者
bluewidz
0
コメント
2つの確率分布間の距離を表す Wasserstein distance の発音は https://en.wikipedia.org/wiki/Wasserstein_metric によると
Most English-language publications use the German spelling "Wasserstein" (attributed to the name "Vaseršteĭn" (Russian: Васерштейн) being of Yiddish origin)と書かれていて、Wassersteinはドイツ語スペルなので、そのまま読むと「ヴァッサーシュタイン」になるはず。 キリル文字の「Васерштейн」を変換表で変換すると「Vasershteyn」または「Vasershtein」になるので、これを英語読みすると「ヴァッサーシュタイン」。 AIのゴッドファーザーと呼ばれているなかの一人であるLeCunの投稿でも https://x.com/ylecun/status/991375003626233858
Hint: "Wasserstein", as in "Wasserstein distance" is pronounced "vassershtaeen" not "wassersteen".とあるので、やはり「ヴァッサーシュタイン」。 一方、なぜか日本語文献を読むと Wikipediaでも 転移学習でも「ワッサースタイン」と書かれている。 どうして日本ではドイツ語表記したスペルの英語読みが広がっているんだろう? Einsteinは「アインシュタイン」と呼んで、「アインスタイン」とは書かないのに、不思議である。
投稿者
bluewidz
0
コメント
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 | import matplotlib.pyplot as plt import numpy as np import random import torch import torch.nn as nn import torch.nn.functional as F from torchvision import datasets, transforms from torch.utils.data import DataLoader from pykan.kan.KANLayer import KANLayer import sys def initialize_seed(seed=0): torch.manual_seed(seed) np.random.seed(seed) random.seed(seed) class ConvMLP(nn.Module): def __init__(self, fc_layers: list[int], device): super().__init__() self.conv1 = nn.Conv2d(1, 8, kernel_size=5, stride=2, device=device) self.conv2 = nn.Conv2d(8, 16, kernel_size=5, stride=2, device=device) n_in = 16 fcs = [] for fc in fc_layers: fcs.append(nn.Linear(n_in, fc, device=device)) n_in = fc self.fcs = nn.ModuleList(fcs) def forward(self, x): x = self.conv2(F.relu(F.max_pool2d(self.conv1(x), 2))) x = x.reshape(x.shape[0], -1) for fc in self.fcs: x = fc(F.relu(x)) return x def update_grid_from_samples(self, x): pass def regularize(self, lambda_l1, lambda_entropy, lambda_coef, lambda_coefdiff, small_mag_threshold=1e-16, small_reg_factor=1.0): return 0.0 # Modified version of KAN in pykan/kan/KAN.py class ConvKAN(nn.Module): def __init__(self, width: list[int], grid=5, k=3, noise_scale=0.1, noise_scale_base=0.1, base_fun=torch.nn.SiLU(), bias_trainable=True, grid_eps=1.0, grid_range=[-1, 1], sp_trainable=True, sb_trainable=True, device="cpu"): super().__init__() ### Initialize feature extraction layers self.conv1 = nn.Conv2d(1, 8, kernel_size=5, stride=2, device=device) self.conv2 = nn.Conv2d(8, 16, kernel_size=5, stride=2, device=device) width.insert(0, 16) ### Initialize KAN layers self.biases = [] self.act_fun = [] self.depth = len(width) - 1 self.width = width for l in range(self.depth): # splines scale_base = 1 / np.sqrt(width[l]) + (torch.randn(width[l] * width[l + 1], ) * 2 - 1) * noise_scale_base sp_batch = KANLayer(in_dim=width[l], out_dim=width[l + 1], num=grid, k=k, noise_scale=noise_scale, scale_base=scale_base, scale_sp=1.0, base_fun=base_fun, grid_eps=grid_eps, grid_range=grid_range, sp_trainable=sp_trainable, sb_trainable=sb_trainable, device=device) self.act_fun.append(sp_batch) # bias bias = nn.Linear(width[l + 1], 1, bias=False, device=device).requires_grad_(bias_trainable) bias.weight.data *= 0.0 self.biases.append(bias) self.biases = nn.ModuleList(self.biases) self.act_fun = nn.ModuleList(self.act_fun) def forward(self, x): # Extract features by conv x = self.conv2(F.relu(F.max_pool2d(self.conv1(x), 2))) x = x.reshape(x.shape[0], -1) # Run KAN layers self.acts = [x] # acts shape: (batch, width[l]) self.acts_scale = [] for l in range(self.depth): x, preacts, postacts, postspline = self.act_fun[l](x) grid_reshape = self.act_fun[l].grid.reshape(self.width[l + 1], self.width[l], -1) input_range = grid_reshape[:, :, -1] - grid_reshape[:, :, 0] + 1e-4 output_range = torch.mean(torch.abs(postacts), dim=0) self.acts_scale.append(output_range / input_range) x = x + self.biases[l].weight self.acts.append(x) return x def update_grid_from_samples(self, x): for l in range(self.depth): self.forward(x) self.act_fun[l].update_grid_from_samples(self.acts[l]) def regularize(self, lambda_l1, lambda_entropy, lambda_coef, lambda_coefdiff, small_mag_threshold=1e-16, small_reg_factor=1.0): def nonlinear(x, th, factor): return (x < th) * x * factor + (x > th) * (x + (factor - 1) * th) reg_ = 0. for i in range(len(self.acts_scale)): vec = self.acts_scale[i].reshape(-1, ) vec_sum = torch.sum(vec) if vec_sum == 0.0: continue p = vec / vec_sum l1 = torch.sum(nonlinear(vec, th=small_mag_threshold, factor=small_reg_factor)) entropy = - torch.sum(p * torch.log2(p + 1e-4)) reg_ += lambda_l1 * l1 + lambda_entropy * entropy # both l1 and entropy # regularize coefficient to encourage spline to be zero for i in range(len(self.act_fun)): coeff_l1 = torch.sum(torch.mean(torch.abs(self.act_fun[i].coef), dim=1)) coeff_diff_l1 = torch.sum(torch.mean(torch.abs(torch.diff(self.act_fun[i].coef)), dim=1)) reg_ += lambda_coef * coeff_l1 + lambda_coefdiff * coeff_diff_l1 return reg_ def calc_accuracy(ys): rs = [] for y, label in ys: rs.append((torch.argmax(y, dim=1) == label).float()) r = torch.cat(rs, dim=0) return torch.mean(r)*100.0 def train(model, train_loader, test_loader, max_epoch, lamb=0.0, lambda_l1=1.0, lambda_entropy=2.0, lambda_coef=0.0, lambda_coefdiff=0.0, update_grid=True, grid_update_freq=10, loss_fn=torch.nn.CrossEntropyLoss(), lr=0.002, device="cpu"): optimizer = torch.optim.Adam(model.parameters(), lr=lr) for epoch in range(max_epoch): model.train() n_samples = 0 max_samples = len(train_loader.dataset) ys = [] for iter, (x, label) in enumerate(train_loader): x = x.to(device) label = label.to(device) if iter % grid_update_freq == 0 and update_grid: model.update_grid_from_samples(x) y = model(x) ys.append((y, label)) loss = loss_fn(y, label) reg_ = model.regularize(lambda_l1, lambda_entropy, lambda_coef, lambda_coefdiff) loss = loss + lamb * reg_ optimizer.zero_grad() loss.backward() optimizer.step() n_samples += len(x) if iter % 100 == 0: print(f"Epoch: {epoch} [{n_samples}/{max_samples}] Loss: {loss.item():.6f}") # Calc train accuracy train_acc = calc_accuracy(ys) # Calc test accuracy model.eval() ys = [] with torch.no_grad(): for iter, (x, label) in enumerate(test_loader): x = x.to(device) label = label.to(device) y = model(x) ys.append((y, label)) test_acc = calc_accuracy(ys) print(f"Epoch: {epoch} [{n_samples}/{max_samples}] Loss: {loss.item():.6f} Acc(Train): {train_acc} Acc(Test): {test_acc}") return def main(mode): initialize_seed(123) device = torch.device("cuda" if torch.cuda.is_available() else "cpu") reg_lambda = 0.0 update_grid = True, if mode == "kan": model = ConvKAN(width=[20, 10], device=device) elif mode == "kan-no-update-grid": model = ConvKAN(width=[20, 10], device=device) update_grid = False elif mode == "kan-reg": model = ConvKAN(width=[20, 10], device=device) reg_lambda = 0.003 elif mode == "mlp": model = ConvMLP(fc_layers=[20, 10], device=device) else: return train_loader = DataLoader(datasets.MNIST("./data", train=True, download=True, transform=transforms.ToTensor()), batch_size=128, shuffle=True) test_loader = DataLoader(datasets.MNIST("./data", train=False, download=True, transform=transforms.ToTensor()), batch_size=128, shuffle=False) train(model, train_loader, test_loader, max_epoch=5, lamb=reg_lambda, update_grid=update_grid, device=device) if __name__ == "__main__": main(sys.argv[1]) |
Epoch: 0 [128/60000] Loss: 2.330844 Epoch: 0 [12928/60000] Loss: 0.527279 Epoch: 0 [25728/60000] Loss: 0.264145 Epoch: 0 [38528/60000] Loss: 0.268547 Epoch: 0 [51328/60000] Loss: 0.270200 Epoch: 0 [60000/60000] Loss: 0.137060 Acc(Train): 82.13166809082031 Acc(Test): 93.66999816894531 Epoch: 1 [128/60000] Loss: 0.211759 Epoch: 1 [12928/60000] Loss: 0.172556 Epoch: 1 [25728/60000] Loss: 0.216685 Epoch: 1 [38528/60000] Loss: 0.224366 Epoch: 1 [51328/60000] Loss: 0.166860 Epoch: 1 [60000/60000] Loss: 0.297034 Acc(Train): 94.53333282470703 Acc(Test): 95.87000274658203 Epoch: 2 [128/60000] Loss: 0.169406 Epoch: 2 [12928/60000] Loss: 0.060187 Epoch: 2 [25728/60000] Loss: 0.065257 Epoch: 2 [38528/60000] Loss: 0.209189 Epoch: 2 [51328/60000] Loss: 0.137371 Epoch: 2 [60000/60000] Loss: 0.062734 Acc(Train): 95.69499969482422 Acc(Test): 96.29000091552734 Epoch: 3 [128/60000] Loss: 0.161130 Epoch: 3 [12928/60000] Loss: 0.094211 Epoch: 3 [25728/60000] Loss: 0.137475 Epoch: 3 [38528/60000] Loss: 0.143321 Epoch: 3 [51328/60000] Loss: 0.086744 Epoch: 3 [60000/60000] Loss: 0.295325 Acc(Train): 96.2300033569336 Acc(Test): 96.52999877929688 Epoch: 4 [128/60000] Loss: 0.084705 Epoch: 4 [12928/60000] Loss: 0.114923 Epoch: 4 [25728/60000] Loss: 0.071916 Epoch: 4 [38528/60000] Loss: 0.093224 Epoch: 4 [51328/60000] Loss: 0.111265 Epoch: 4 [60000/60000] Loss: 0.049419 Acc(Train): 96.69833374023438 Acc(Test): 97.1500015258789
Epoch: 0 [128/60000] Loss: 2.308975 Epoch: 0 [12928/60000] Loss: 0.608790 Epoch: 0 [25728/60000] Loss: 0.333690 Epoch: 0 [38528/60000] Loss: 0.214927 Epoch: 0 [51328/60000] Loss: 0.171603 Epoch: 0 [60000/60000] Loss: 0.099660 Acc(Train): 88.74166870117188 Acc(Test): 96.1500015258789 Epoch: 1 [128/60000] Loss: 0.073898 Epoch: 1 [12928/60000] Loss: 0.215137 Epoch: 1 [25728/60000] Loss: 0.109934 Epoch: 1 [38528/60000] Loss: 0.126619 Epoch: 1 [51328/60000] Loss: 0.066091 Epoch: 1 [60000/60000] Loss: 0.188135 Acc(Train): 96.20833587646484 Acc(Test): 96.88999938964844 Epoch: 2 [128/60000] Loss: 0.061085 Epoch: 2 [12928/60000] Loss: 0.078620 Epoch: 2 [25728/60000] Loss: 0.045636 Epoch: 2 [38528/60000] Loss: 0.052172 Epoch: 2 [51328/60000] Loss: 0.037537 Epoch: 2 [60000/60000] Loss: 0.149782 Acc(Train): 96.87333679199219 Acc(Test): 95.19000244140625 Epoch: 3 [128/60000] Loss: 0.040984 Epoch: 3 [12928/60000] Loss: 0.102282 Epoch: 3 [25728/60000] Loss: 0.017132 Epoch: 3 [38528/60000] Loss: 0.043684 Epoch: 3 [51328/60000] Loss: 0.126490 Epoch: 3 [60000/60000] Loss: 0.057794 Acc(Train): 97.1483383178711 Acc(Test): 97.47000122070312 Epoch: 4 [128/60000] Loss: 0.056742 Epoch: 4 [12928/60000] Loss: 0.087390 Epoch: 4 [25728/60000] Loss: 0.046712 Epoch: 4 [38528/60000] Loss: 0.058726 Epoch: 4 [51328/60000] Loss: 0.217805 Epoch: 4 [60000/60000] Loss: 0.137546 Acc(Train): 97.54500579833984 Acc(Test): 97.52999877929688
Epoch: 0 [128/60000] Loss: 2.308975 Epoch: 0 [12928/60000] Loss: 0.502888 Epoch: 0 [25728/60000] Loss: 0.330806 Epoch: 0 [38528/60000] Loss: 0.242808 Epoch: 0 [51328/60000] Loss: 0.165698 Epoch: 0 [60000/60000] Loss: 0.191306 Acc(Train): 86.51166534423828 Acc(Test): 95.06999969482422 Epoch: 1 [128/60000] Loss: 0.090638 Epoch: 1 [12928/60000] Loss: 0.238503 Epoch: 1 [25728/60000] Loss: 0.128466 Epoch: 1 [38528/60000] Loss: 0.166372 Epoch: 1 [51328/60000] Loss: 0.120421 Epoch: 1 [60000/60000] Loss: 0.113729 Acc(Train): 95.87166595458984 Acc(Test): 96.37999725341797 Epoch: 2 [128/60000] Loss: 0.094055 Epoch: 2 [12928/60000] Loss: 0.101774 Epoch: 2 [25728/60000] Loss: 0.053376 Epoch: 2 [38528/60000] Loss: 0.050028 Epoch: 2 [51328/60000] Loss: 0.049892 Epoch: 2 [60000/60000] Loss: 0.045015 Acc(Train): 96.88333129882812 Acc(Test): 96.44000244140625 Epoch: 3 [128/60000] Loss: 0.091558 Epoch: 3 [12928/60000] Loss: 0.116339 Epoch: 3 [25728/60000] Loss: 0.035658 Epoch: 3 [38528/60000] Loss: 0.047689 Epoch: 3 [51328/60000] Loss: 0.121902 Epoch: 3 [60000/60000] Loss: 0.066078 Acc(Train): 97.5 Acc(Test): 97.30999755859375 Epoch: 4 [128/60000] Loss: 0.069760 Epoch: 4 [12928/60000] Loss: 0.048372 Epoch: 4 [25728/60000] Loss: 0.042325 Epoch: 4 [38528/60000] Loss: 0.073130 Epoch: 4 [51328/60000] Loss: 0.130568 Epoch: 4 [60000/60000] Loss: 0.046441 Acc(Train): 97.72833251953125 Acc(Test): 97.43999481201172
Epoch: 0 [128/60000] Loss: 2.449388 Epoch: 0 [12928/60000] Loss: 0.862422 Epoch: 0 [25728/60000] Loss: 0.502983 Epoch: 0 [38528/60000] Loss: 0.569132 Epoch: 0 [51328/60000] Loss: 0.391648 Epoch: 0 [60000/60000] Loss: 0.360877 Acc(Train): 89.41166687011719 Acc(Test): 95.72999572753906 Epoch: 1 [128/60000] Loss: 0.345524 Epoch: 1 [12928/60000] Loss: 0.449618 Epoch: 1 [25728/60000] Loss: 0.375242 Epoch: 1 [38528/60000] Loss: 0.334639 Epoch: 1 [51328/60000] Loss: 0.313511 Epoch: 1 [60000/60000] Loss: 0.374076 Acc(Train): 96.25166320800781 Acc(Test): 96.95999908447266 Epoch: 2 [128/60000] Loss: 0.237053 Epoch: 2 [12928/60000] Loss: 0.721758 Epoch: 2 [25728/60000] Loss: 0.468227 Epoch: 2 [38528/60000] Loss: 0.489218 Epoch: 2 [51328/60000] Loss: 0.366972 Epoch: 2 [60000/60000] Loss: 0.461017 Acc(Train): 90.59166717529297 Acc(Test): 94.61000061035156 Epoch: 3 [128/60000] Loss: 0.391373 Epoch: 3 [12928/60000] Loss: 0.405158 Epoch: 3 [25728/60000] Loss: 0.296408 Epoch: 3 [38528/60000] Loss: 0.306373 Epoch: 3 [51328/60000] Loss: 0.362922 Epoch: 3 [60000/60000] Loss: 0.335211 Acc(Train): 94.8933334350586 Acc(Test): 95.55999755859375 Epoch: 4 [128/60000] Loss: 0.343693 Epoch: 4 [12928/60000] Loss: 0.300828 Epoch: 4 [25728/60000] Loss: 0.310633 Epoch: 4 [38528/60000] Loss: 0.402329 Epoch: 4 [51328/60000] Loss: 0.401533 Epoch: 4 [60000/60000] Loss: 0.272522 Acc(Train): 95.64000701904297 Acc(Test): 95.79000091552734\(\lambda=0.005\)にすると、以下のようになり途中でモデルが崩壊しました。
Epoch: 0 [128/60000] Loss: 2.542997 Epoch: 0 [12928/60000] Loss: 0.992837 Epoch: 0 [25728/60000] Loss: 0.666648 Epoch: 0 [38528/60000] Loss: 0.642962 Epoch: 0 [51328/60000] Loss: 0.496544 Epoch: 0 [60000/60000] Loss: 0.467141 Acc(Train): 88.85499572753906 Acc(Test): 95.80999755859375 Epoch: 1 [128/60000] Loss: 0.465318 Epoch: 1 [12928/60000] Loss: 0.551555 Epoch: 1 [25728/60000] Loss: 0.480575 Epoch: 1 [38528/60000] Loss: 0.532717 Epoch: 1 [51328/60000] Loss: 0.389326 Epoch: 1 [60000/60000] Loss: 0.464731 Acc(Train): 95.5183334350586 Acc(Test): 96.31999969482422 Epoch: 2 [128/60000] Loss: 0.360698 Epoch: 2 [12928/60000] Loss: 0.528383 Epoch: 2 [25728/60000] Loss: 0.377956 Epoch: 2 [38528/60000] Loss: 0.333951 Epoch: 2 [51328/60000] Loss: 0.379329 Epoch: 2 [60000/60000] Loss: 0.398343 Acc(Train): 94.8566665649414 Acc(Test): 96.06999969482422 Epoch: 3 [128/60000] Loss: 0.374904 Epoch: 3 [12928/60000] Loss: 0.928802 Epoch: 3 [25728/60000] Loss: 0.401091 Epoch: 3 [38528/60000] Loss: 0.539629 Epoch: 3 [51328/60000] Loss: 223.694611 Epoch: 3 [60000/60000] Loss: 3.871729 Acc(Train): 76.33499908447266 Acc(Test): 10.520000457763672 Epoch: 4 [128/60000] Loss: 4.122091 Epoch: 4 [12928/60000] Loss: 3.226183 Epoch: 4 [25728/60000] Loss: 2.973773 Epoch: 4 [38528/60000] Loss: 2.831389 Epoch: 4 [51328/60000] Loss: 2.789084 Epoch: 4 [60000/60000] Loss: 2.598794 Acc(Train): 9.819999694824219 Acc(Test): 10.09999942779541
投稿者
bluewidz
0
コメント