1樓:蠡測
就「學習乘法」來說,我之前等訓練的時候試過lstm算加法,大概幾百個例子能學會個位數的加法,但是對於兩位數的加法,即使用幾千上萬的例子也會在 89+9 這種要進製的計算上出錯
myx,找時間試試lstm搞乘法計算看看
2樓:Genome
這個問題其實算已經基本解決了
這種形式內容的學習需要符號化或基於Operations的,不能用簡單逼近方式訓練
且僅僅普通的feed forward無法學會乘法或加法等演算法,對,其實這些都是演算法,演算法裡面有乙個很特別的東西是遞迴(recursion)或迴圈(loop),無限位乘法等必須要網路隱式包含這個遞迴,其實可以簡單說就是:需要網路是turing complete的
參考:Neural Programmer-InterpretersCSDN-專業IT技術社群-登入
3樓:233
我覺得使用常用啟用函式的有限大神經網路幾乎一定不能學會對任意大或任意精度的a和b做乘法(我彷彿在說廢話……)
但是對有界的a和b做精度有限的乘法是可以的,畢竟神經網路可以看作閘電路的超集……
4樓:Bluebear
import
torch
import
numpy
asnp
import
torch.nn
asnn
base=[
0,1]
defdec2bin
(num
,bin
):mid=
while
True:if
num==0:
break
num,
rem=
divmod
(num,2
)mid.(
base
[rem
])return
(bin
-len
(mid))*
[0]+
[xforx
inmid
[::-1]]
defgen_xy
(size):x
=np.zeros
([size,16
],np
.float32)y
=np.zeros
([size,16
],np
.float32
)for
idxin
range
(size
):x1=np
.random
.randint(0
,255)x2
=np.random
.randint(0
,255)yl
=dec2bin(x1
*x2,16
)xl=dec2bin(x1
,8)+
dec2bin(x2
,16)foriin
range(16
):x[idx,i
]=xl[
i]y[
idx,i]
=yl[i
]returnx,
yclass
acc_func(nn
.Module
):def
__init__
(self
):super
(acc_func
,self).
__init__
()def
forward
(self,x
,y):t
=torch
.sum
(torch
.abs(y
-x)<=
0.5)
/16./x
.shape[0
]return
tclass
multi_model(nn
.Module
):def
__init__
(self
):super
(multi_model
,self).
__init__
()lys=
self
.stem=nn
.Linear(16
,32)forxin
range(20
):lys.(
nn.Linear(32
,32))lys.(
nn.ReLU
())self.ly
=nn.Sequential(*
lys)
self
.out=nn
.Sequential(nn
.Linear(32
,16),nn
.Sigmoid
())def
forward
(self,x
):x=self
.stem(x
)return
self
.out
(self.ly
(x))model
=multi_model
()loss_func=nn
.MSELoss
()optm
=torch
.optim
.Adam
(model
.parameters
(),0.1
)acc
=acc_func
()for
iter
inrange
(1000000):x
,y=gen_xy
(256)x
=torch
.from_numpy(x
)-0.5y
=torch
.from_numpy(y
)pred
=model(x
)loss
=loss_func
(pred,y
(loss
,acc
(pred,y
))optm
.zero_grad
()loss
.backward
()optm
.step
()測試了下,真沒學出來……
即使用單層很寬的網路也沒學出來。靠Dense層應該是沒啥希望。
import
torch
import
numpy
asnp
import
torch.nn
asnn
import
torch.nn.functionalasFdefgen_xy
(size):x
=np.random
.randint(0
,255
,[size,2
])y=x
[:,0:1
]*x[:,1:
2]x=
x.astype(np
.float32)y
=y.astype(np
.float32
)returnx,
yclass
mul_cell(nn
.Module
):def
__init__
(self
):super
(mul_cell
,self).
__init__
()def
forward
(self,x
):return
x[:,0:
1]*x
[:,1:2
]class
multi_model(nn
.Module
):def
__init__
(self
):super
(multi_model
,self).
__init__
()self
.mul
=mul_cell
()self
.dense=nn
.Linear(2
,1)self
.weight=nn
.Parameter
(torch
.Tensor(2
))self
.reset_param
()def
reset_param
(self
):torch.nn
.init
.constant_
(self
.weight
,0.01
)def
forward
(self,x
):weight
=torch
.softmax
(self
.weight,0
)return
weight[0
]*self
.mul(x
)+weight[1
]*self
.dense(x
)model
=multi_model().
cuda
()loss_func=nn
.MSELoss
()optm
=torch
.optim
.SGD
(model
.parameters
(),.01)
foriter
inrange
(1000000):x
,y=gen_xy(64
)x=torch
.from_numpy(x
).cuda()y
=torch
.from_numpy(y
).cuda
()pred
=model(x
)loss
=loss_func
(pred,y
(loss
,model
.weight
)optm
.zero_grad
()loss
.backward
()optm
.step
()當然如果是顯式寫個乘法,讓網路學權重,那就毫無問題。
5樓:徐佳逸
深度學習來學乘法很簡單啦,但人要想到如何構造神經網路可不簡單~~
讓我們分三步來解決這個問題:
第一步 - 把a和b轉化成二進位制表示形式;
第二步 - 對於a和b的二進位制的每一位兩兩做乘法;
第三步 - 把第二步的結果都加起來。
Example:
第一步:
這一步是用神經網路來轉化十進位製到二進位制,如果輸入就是二進位制這一步就可以省略啦。
比如a = 3 = 11 = a2a1,即a2=1,a1=1
b = 5 = 101 = b3b2b1,即b3=1,b2=0,b1=1
具體做法就是用神經網路做一堆「與門」,a AND 010 就得到 a2, a AND 001就得到 a1。b一樣處理。
第二步:
分步計算1 1 * 1 0 1
這一步是把原問題簡化成用神經網路訓練二進位制每位的乘法,這個神經網路很容易可以辦到。
1(b1) * 1(a1) = 1 (c1)
1(b1) * 1(a2) = 1 (c2)
0(b2) * 1(a1) = 0 (c3)
0(b2) * 1(a2) = 0 (c4)
1(b3) * 1(a1) = 1 (c5)
1(b3) * 1(a2) = 1 (c6)
第三步:
加起來,這個神經網路肯定能辦到啦。
1 (c1) * 1 = 1
1 (c2) * 10 = 10
0 (c3) * 10 = 0
0 (c4) * 100 = 0
1 (c5) * 100 = 100
1 (c6) * 1000 = 1000
求和就是結果 1111 = 15 = 3*5
對於其他的函式我就不寫了,直接給結論:
只要給出足夠的層數,足夠的neurons,多層神經網路可以用來近似任何函式。
最多兩個hidden layers的神經網路就可以近似任何函式。
一層hidden layer的神經網路就可以近似任何連續函式。
PS: 看過給贊吧,最近開始玩知乎,尼瑪答了那麼多連感謝數都趕不上回答數。
深度學習中,在測試是到底能不能做barch normlization和dropout?
Dropout在訓練的時候,如果以概率 丟棄每個神經元,則在測試的時候,要將神經元和權重矩陣相乘之後的結果乘以 Batch Normalization在測試時要保留。值得注意的一種情況是,測試的時候常常不是以batch的形式輸入樣本的,而是單個樣本輸入的形式,此時沒法用測試資料來計算出均值和標準差。...
女生學資訊保安能不能學會
我心飛翔講網安 沒有學不會的學生,只有教不好的老師。資訊保安方向很多,我有的學生就做得很好。不在於性別,在於你自己的興趣和努力。個人感覺,資訊保安尤其需要興趣 rubi 資訊保安分比較技術的還有資訊保安管理,資訊保安管理可能更加適合女生去做,缺點就是後期很多技術人才會轉管理方向,懂技術的管理很容易把...
java學習能不能跳過servlet?
知有 可以,這東西太古老了,完全可以先跳過,可以嘗試著自己寫乙個簡單的 http server,要有時間的話回頭再看下 tomcat servlet,收穫會更多。 可以選擇性跳過的,看自身的需求。servlet本質上就是處理並響應使用者HTTP請求,科班的同學們因為學過計網,可以直接面向Socket...