''' 目前神經網絡一直都是採用relu(非線性單元)作爲激活函數,目的是產生類似異或表達,比如線性函數的可加性就被很好的破壞掉了 f(ax+by)=af(x)+bf(y) 在加入relu之後不成立了。 但是對於e^x 這種軌跡,relu還能有很好的擬合能力嗎?我們做個實驗看看吧。 ''' import torch from torch import nn import torch.optim as optimizer import numpy as np data_x = [1.1, 1, 4, 6, 8, 10, 11, 12, 13, 14, 15] data_y = [np.e ** x for x in data_x] x = torch.tensor(data_x).reshape(-1, 1).float() y = torch.tensor(data_y).unsqueeze(1).float() class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.layer1 = nn.Sequential(nn.Linear(1, 16), nn.ReLU()) self.layer2 = nn.Sequential(nn.Linear(16, 1)) def forward(self, x): x = self.layer1(x) x = self.layer2(x) x = torch.tensor(np.e) ** x #可以註釋掉看一看 return x learning_rate = 1e-3 model = Net() criterion = nn.MSELoss() optimizer = optimizer.Adam(model.parameters(), lr=learning_rate) for epoch in range(1000): out = model(x) optimizer.zero_grad() loss = criterion(out, y) loss.backward() optimizer.step() print(loss.data) out = model(x) print(data_y) print(out) ''' 如果大家把在網絡裏前向傳播的np.e部分註釋掉會發現收斂的很慢很慢,因爲relu只能擬合直線,要用直線去擬合一個指數表達是非常困難的 當我們在前向傳播里加入了指數表達會發現收斂的非常快,數據相對更準確一點,但是缺點很明顯容易過擬合。 在構建神經網絡的時候對數據的分析要比悶着頭嘗試網絡效果要好。 '''
神經網絡的線性單元不能擬合指數表達
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.