日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

亲耳“听见”神经网络的声音:梯度变化一听即可辨别(附代码)

發布時間:2023/11/21 综合教程 27 生活家
生活随笔 收集整理的這篇文章主要介紹了 亲耳“听见”神经网络的声音:梯度变化一听即可辨别(附代码) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

  來源:Reddit 等 編輯:金磊、鵬飛

  【新智元導讀】訓練神經網絡可以用聽的!Reddit 網友做了一個非常有趣的實驗:將每個神經網絡層梯度范式轉換成了一個音調,這樣人類就可以憑借聽覺,來很好的分辨出非常小的干擾,比如節奏和音調。

  訓練神經網絡還可以用“聽”的!

  網友做了一個非常有趣的實驗:將每個神經網絡層梯度范式轉換成了一個音調,這樣人類就可以憑借聽覺,來很好的分辨出非常小的干擾,比如節奏和音調。

  以往,我們在訓練神經網絡的時候,通常會測量許多不同的指標,例如精度、損失以及梯度等等。這些工作大部分是在 TensorBoard 上聚合上述度量指標并且繪制可視化。

  但除了視覺之外,有 Reddit 網友提出:用聽覺也可以監控神經網絡的訓練

  博客地址:

  http://blog.christianperone.com/2019/08/listening-to-the-neural-network-gradient-norms-during-training/

  聲音是目前神經網絡訓練中研究較少的一個方向。人類的聽覺可以很好的分辨出非常小的干擾(即使這些干擾時間很短或很細微),比如節奏和音高。

  在這個實驗中,研究者做了一個非常簡單的例子,顯示了使用每層的梯度范數進行的合成聲音,以及使用不同設置(如不同學習率、優化器,動量等)對 MNIST 進行卷積神經網絡訓練的步驟等。

  看到這個結果,Reddit 網友嗨了,紛紛開發腦洞。

  MLApprentice

這真太了不起了。我一直在尋找直觀體驗漸變的方法,我覺得只看直方圖時很難注意到訓練模式。你有沒有想過用圖層深度來控制音高并使用音量來表示規范呢?這樣我們光靠聽音高就能知道是第幾層了。

  klaysDoodle

10 層網絡以后,我聾了

  MLApprentice

樓上你太搞笑了。你可以將深度標準化,使其保持在人類聽覺范圍內就可以。

  gohu_cd

很有意思!我想知道這是否有助于調試神經網絡訓練。因為其中存在不同的加權損失,甚至是對抗的(例如 GAN)。因為視覺和聽覺都是感官,查看圖表或聽覺聲音應該具有相同數量的信息。可以用對應于加權梯度的所有聲音創建一個“交響樂”,也許這對于確定每個損失的正確權重是有用的。

  在下文給出的實驗中,你需要安裝 PyAudio 和 PyTorch 來運行代碼。

  一、“聽見”神經網絡的聲音

  如下訓練神經網絡的聲音可跳轉至下方鏈接聽:

  http://blog.christianperone.com/2019/08/listening-to-the-neural-network-gradient-norms-during-training/  

  用 LR 0.01 和 SGD 訓練聲音

  下面這個音頻片段表示在第一個 epoch 的前 200 步中使用 4 個層的梯度,并使用 10 個 batche 大小的訓練會話。音高越高,一個神經網絡層的標準值就越高,不同的 batche 之間會有短暫的靜音。

  用 LR0.1 的 SGD 訓練聲音

  同上,但是學習率更高了。

  用 LR1.0 的 SGD 訓練聲音

  同上,但是隨著學習率的提高,神經網絡產生發散(diverge)。

  用 LR 1.0、BS 256 的 SGD 訓練聲音

  設置是相同的,但是學習率高達 1.0,batche 大小為 256。

  用 LR0.01 的 Adam 訓練聲音

  與 SGD 的設置相同,但使用的是 Adam。

  二、源代碼展示

  以下是實驗的全部源代碼,有興趣的讀者可以上手試一下。

  1 import pyaudio
  2 import numpy as np
  3 import wave
  4
  5 import torch
  6 import torch.nn as nn
  7 import torch.nn.functional as F
  8 import torch.optim as optim
  9 from torchvision import datasets, transforms
 10
 11
 12 class Net (nn.Module):
 13    def __init__(self):
 14        super (Net, self).__init__()
 15        self.conv1 = nn.Conv2d (1, 20, 5, 1)
 16        self.conv2 = nn.Conv2d (20, 50, 5, 1)
 17        self.fc1 = nn.Linear (4*4*50, 500)
 18        self.fc2 = nn.Linear (500, 10)
 19
 20        self.ordered_layers = [self.conv1,
 21                               self.conv2,
 22                               self.fc1,
 23                               self.fc2]
 24
 25    def forward (self, x):
 26        x = F.relu (self.conv1(x))
 27        x = F.max_pool2d (x, 2, 2)
 28        x = F.relu (self.conv2(x))
 29        x = F.max_pool2d (x, 2, 2)
 30        x = x.view (-1, 4*4*50)
 31        x = F.relu (self.fc1(x))
 32        x = self.fc2(x)
 33        return F.log_softmax (x, dim=1)
 34
 35
 36 def open_stream (fs):
 37    p = pyaudio.PyAudio ()
 38    stream = p.open (format=pyaudio.paFloat32,
 39                    channels=1,
 40                    rate=fs,
 41                    output=True)
 42    return p, stream
 43
 44
 45 def generate_tone (fs, freq, duration):
 46    npsin = np.sin (2 * np.pi * np.arange (fs*duration) * freq / fs)
 47    samples = npsin.astype (np.float32)
 48    return 0.1 * samples
 49
 50
 51 def train (model, device, train_loader, optimizer, epoch):
 52    model.train ()
 53
 54    fs = 44100
 55    duration = 0.01
 56    f = 200.0
 57    p, stream = open_stream (fs)
 58
 59    frames = []
 60
 61    for batch_idx, (data, target) in enumerate (train_loader):
 62        data, target = data.to (device), target.to (device)
 63        optimizer.zero_grad ()
 64        output = model (data)
 65        loss = F.nll_loss (output, target)
 66        loss.backward ()
 67
 68        norms = []
 69        for layer in model.ordered_layers:
 70            norm_grad = layer.weight.grad.norm ()
 71            norms.append (norm_grad)
 72
 73            tone = f + ((norm_grad.numpy ()) * 100.0)
 74            tone = tone.astype (np.float32)
 75            samples = generate_tone (fs, tone, duration)
 76
 77            frames.append (samples)
 78
 79        silence = np.zeros (samples.shape[0] * 2,
 80                           dtype=np.float32)
 81        frames.append (silence)
 82
 83        optimizer.step ()
 84
 85        # Just 200 steps per epoach
 86        if batch_idx == 200:
 87            break
 88
 89    wf = wave.open ("sgd_lr_1_0_bs256.wav", 'wb')
 90    wf.setnchannels (1)
 91    wf.setsampwidth (p.get_sample_size (pyaudio.paFloat32))
 92    wf.setframerate (fs)
 93    wf.writeframes (b''.join (frames))
 94    wf.close ()
 95
 96    stream.stop_stream ()
 97    stream.close ()
 98    p.terminate ()
 99
100
101 def run_main ():
102    device = torch.device ("cpu")
103
104    train_loader = torch.utils.data.DataLoader (
105        datasets.MNIST ('../data', train=True, download=True,
106                       transform=transforms.Compose ([
107                           transforms.ToTensor (),
108                           transforms.Normalize ((0.1307,), (0.3081,))
109                       ])),
110        batch_size=256, shuffle=True)
111
112    model = Net () .to (device)
113    optimizer = optim.SGD (model.parameters (), lr=0.01, momentum=0.5)
114
115    for epoch in range (1, 2):
116        train (model, device, train_loader, optimizer, epoch)
117
118
119 if __name__ == "__main__":
120    run_main ()

  Reddit 地址:

  https://www.reddit.com/r/MachineLearning/comments/clyzgx/p_listening_to_the_neural_network_gradient_norms/

  博客:

  http://blog.christianperone.com/2019/08/listening-to-the-neural-network-gradient-norms-during-training/

總結

以上是生活随笔為你收集整理的亲耳“听见”神经网络的声音:梯度变化一听即可辨别(附代码)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。