grad_check = function(o, loss_function, loss_prime, X, Y) { UseMethod("grad_check", o) } grad_check.network = function(net, loss_function, loss_prime, X, Y) { Yhat = forward_pass_res(net, X) grad_analytic = list() # Сделаем новую сеть с аналитически обновлёнными весами updated = update_weights(net, X, Y, loss_prime, learning_rate=1) num_layers = length(net$layers) for(i in 1:num_layers) { # Вытащим из него аналитически подсчитанное значение градиента grad_analytic[[i]] = net$layers[[i]]$w - updated$layers[[i]]$w } # Теперь разбираемся с численным градиентом grad_numeric = list() for(l in 1:num_layers) { grad_numeric[[l]] = net$layers[[l]]$w*0 for(i in 1:nrow(net$layers[[l]]$w)) { for(j in 1:ncol(net$layers[[l]]$w)) { net1 = net net2 = net net1$layers[[l]]$w[i, j] = net1$layers[[l]]$w[i, j] + 1e-3 net2$layers[[l]]$w[i, j] = net2$layers[[l]]$w[i, j] - 1e-3 grad_numeric[[l]][i, j] = (loss_function(Y, forward_pass_res(net1, X)) - (loss_function(Y, forward_pass_res(net2, X))))/2e-3 } } } for(i in 1:num_layers) { #print(grad_analytic[[i]]) #print(grad_numeric[[i]]) print(abs((grad_analytic[[i]]-grad_numeric[[i]]) / grad_numeric[[i]])) } #return() } n = create_network(sizes=c(2, 10, 10, 2)) grad_check(n, sqloss, sqloss_prime, X, Y) #### визуализаця N = 100 # number of points per class D = 2 # dimensionality K = 3 # number of classes X = matrix(0, N*K,D) # data matrix (each row = single example) Y = matrix(0, N*K, 1) # class labels for(j in 0:(K-1)) { ix = (N*j + 1):(N*(j+1)) r = seq(0.0, 1, len=N) # radius t = seq(j*4,(j+1)*4, len=N) + rnorm(N)*0.2 # theta X[ix,] = c(r * sin(t), r * cos(t)) Y[ix] = j + 1 } # lets visualize the data: plot(X[, 1], X[, 2], col=as.factor(Y)) legend("topleft", legend=c("Class 1", "Class 2", "Class 3"), col=c("red", "green", "black"), lty=1, lwd=2, cex=0.8) vis = function(layer) { x1 = seq(-1, 1, len=100) x2 = seq(-1, 1, len=100) grid = as.matrix(expand.grid(x1, x2)) y_tst = forward_pass_res(layer, grid) Ytst_class = apply(y_tst, 1, which.max) background = matrix(Ytst_class, nrow=100) #heatmap3(background, Rowv = NA, Colv = NA, balanceColor=F) image(x1, x2, background, col=as.factor(Y)) points(X[, 1], X[, 2], col=as.factor(Y), pch=16) points(X[, 1], X[, 2], col="white", pch=1) } set.seed(12) n = create_network(c(2,50,3)) for(i in c(1:10)) { vis(n) print(sqloss(Y, forward_pass_res(n, X))) # key = readline() if(TRUE) { # break #} else { for(j in c(1:100)) { n = update_weights(n, X, Y, sqloss_prime, learning_rate = 10) } } } vis(n)