h2o.deeplearning自动编码器,手动计算深度特征

h2o.deeplearning自动编码器,手动计算深度特征,r,deep-learning,h2o,autoencoder,R,Deep Learning,H2o,Autoencoder,我试图了解自动编码器的功能有多深 我用h2o.deeplearning创建了一个自动编码器,然后我尝试 手动计算深度特征 自动编码器 我使用了激活函数Tanh和2个隐藏层,没有脱落,以 把事情简单化 手动计算隐藏的第1层深度要素 然后我提取了从输入层到隐藏层1的权重和偏差 w12 = as.matrix(h2o.weights(fit, 1)) b12 = as.matrix(h2o.biases (fit,1)) a23 = hl1.output %*% t(w23) b23.rep = d

我试图了解自动编码器的功能有多深

我用
h2o.deeplearning
创建了一个自动编码器,然后我尝试 手动计算深度特征

自动编码器 我使用了激活函数Tanh和2个隐藏层,没有脱落,以 把事情简单化

手动计算隐藏的第1层深度要素 然后我提取了从输入层到隐藏层1的权重和偏差

w12 = as.matrix(h2o.weights(fit, 1))
b12 = as.matrix(h2o.biases (fit,1))
a23 = hl1.output %*% t(w23)
b23.rep = do.call(rbind, rep(list(t(b23)), nrow(a23)))
z23 = a23 + b23.rep
f23 = tanh(z23)
我为操作准备了培训数据,并在 压缩间隔为[-0.5,0.5],因为h2o会在 自动编码器

normalize = function(x) {(((x-min(x))/(max(x)-min(x))) - 0.5)}
d.norm =  apply(d, 2, normalize)`
然后我手动计算第一层的深度特征

a12 = d.norm %*% t(w12)
b12.rep = do.call(rbind, rep(list(t(b12)), nrow(d.norm)))
z12 = a12 + b12.rep
f12 = tanh(z12)
当我将这些值与隐藏的第1层深度特征进行比较时,它们不匹配

hl1.output = as.matrix(h2o.deepfeatures(fit, x_train, layer = 1))
all.equal(
as.numeric(f12[,1]),
hl1.output[, 1],
check.attributes = FALSE,
use.names = FALSE,
tolerance = 1e-04
)
[1] "Mean relative difference: 0.4854887"
手动计算隐藏的第2层深度要素 然后我尝试做同样的事情来手动计算 从隐藏层1的深层要素中删除hiddem层2

w12 = as.matrix(h2o.weights(fit, 1))
b12 = as.matrix(h2o.biases (fit,1))
a23 = hl1.output %*% t(w23)
b23.rep = do.call(rbind, rep(list(t(b23)), nrow(a23)))
z23 = a23 + b23.rep
f23 = tanh(z23)
将这些值与隐藏层2的深层特征进行比较 我看到他们很般配

hl2.output = as.matrix(h2o.deepfeatures(fit,x_train,layer = 2))
all.equal(
as.numeric(f23[,1]),
hl2.output[, 1],
check.attributes = FALSE,
use.names = FALSE,
tolerance = 1e-04
)
[1] TRUE
手动计算输出图层要素 我对输出层也做了同样的尝试

a34 = hl2.output %*% t(w34)
b34.rep = do.call(rbind, rep(list(t(b34)), nrow(a34)))
z34 = a34 + b34.rep
f34 = tanh(z34)
我将结果与我的输出进行了比较,但我无法得到相同的结果

all.equal(
as.numeric(f34[1,]),
output[1,],
check.attributes = FALSE,
use.names = FALSE,
tolerance = 1e-04
)
[1] "Mean relative difference: 3.019762"
问题 我认为我没有以正确的方式规范化数据,因为我可以用隐藏层1的特征重新创建隐藏层2的深层特征。我不明白怎么回事,因为使用
autoencoder=TRUE
h2o应该在[-0.5:0.5]之间规范化数据

我不明白为什么输出层的手动计算不起作用 工作

1) 如何手动计算隐藏层1的深度特征

2) 如何手动计算输出功能?

您正在使用:

 normalize = function(x) {(((x-min(x))/(max(x)-min(x))) - 0.5)}
他们正在使用:

然后它被用来:

也就是说,减去平均值,然后除以范围(或者,等效地,乘以范围上的1)。因此,忽略除以零的检查,我认为您的R代码需要:

 normalize = function(x) {(x-mean(x))/(max(x)-min(x))}
检查是否为零,类似于:

 normalize = function(x) {mul=max(x)-min(x);if(mul==0)mul=1;return((x-mean(x))/mul)}
就拿它来说,它似乎有一个1.0的范围,但它不是以0.0为中心,也就是说,它不是H2O文档中描述的-0.5到+0.5(例如,深度学习小册子中的第20页)。我是否遗漏了Java代码中的某些内容


顺便说一句,它决定对自动编码器进行标准化,而不是对其他深度学习进行标准化。

是的,它工作得非常好!非常感谢。你知道它是否对输出做了类似的事情吗?我是说做逆运算?
 normalize = function(x) {mul=max(x)-min(x);if(mul==0)mul=1;return((x-mean(x))/mul)}