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

##### 【新智元导读】训练神经网络可以用听的！Reddit网友做了一个非常有趣的实验：将每个神经网络层梯度范式转换成了一个音调，这样人类就可以凭借听觉，来很好的分辨出非常小的干扰，比如节奏和音调。

MLApprentice

klaysDoodle

10层网络以后，我聋了

MLApprentice

gohu_cd

“听见”神经网络的声音

```  1import pyaudio
2import numpy as np
3import wave
4
5import torch
6import torch.nn as nn
7import torch.nn.functional as F
8import torch.optim as optim
9from torchvision import datasets, transforms
10
11
12class 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
36def 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
45def 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
51def 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)
64        output = model(data)
65        loss = F.nll_loss(output, target)
66        loss.backward()
67
68        norms = []
69        for layer in model.ordered_layers:
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
101def run_main():
102    device = torch.device("cpu")
103
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
119if __name__ == "__main__":
120    run_main()```

Reddit地址：

0 条评论

• ### 再创全球第一！华为或将发布第二颗自研7纳米麒麟系列芯片

何刚微博中所指的手机品牌，正是华为将于6月21日发布的新机——华为nova 5系列。

• ### 【Python大神秘籍Top10】这些窍门99%的人都不知道

【新智元导读】Python神奇方法是指一些允许在自定义类中增加“神奇”功能的方法。而在Python官方文档中，有关这些方法的介绍或描述不仅内容分散，而且组织结构...

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

网友做了一个非常有趣的实验：将每个神经网络层梯度范式转换成了一个音调，这样人类就可以凭借听觉，来很好的分辨出非常小的干扰，比如节奏和音调。

• ### 听，是梯度的声音！用听觉监控神经网络训练，边听音乐边炼丹

训练神经网络是个极为枯燥的工作。与其盯着Learning Curves发呆，或许可以调动一下其他感官，一起做点更有意思的事情。

• ### 基于Django的电子商务网站开发（连载25）

购物车模块包括“购物车中所有商品的显示”“添加商品进入购物车”“删除购物车中某种商品”“删除购物车中所有的商品”和“修改购物车中某种商品的数量”。

• ### 死磕客户价值是ToB公司的生存第一法则

? 来源：ToB企业经营｜作者：童继龙 ---- 上周参加招商蛇口集团的“年度数字化节”，这是招商蛇口首席数字官徐晓仪总就任以来，用别开生面的方式做的内部数字...

• ### [Python]通过有道词典API获取单词发音MP3

原文链接：https://blog.csdn.net/humanking7/article/details/88630856

• ### (23) 枚举的本质 / 计算机程序的思维逻辑

前面系列，我们介绍了Java中表示和操作数据的基本数据类型、类和接口，本节探讨Java中的枚举类型。 所谓枚举，是一种特殊的数据，它的取值是有限的，可以枚举出来...

,,