Tensorflow returns 不同训练输入参数的相同结果
Tensorflow returns same results for different trained input parameter
我想在 R 中用 tensorflow 实现一个预测函数,但是无论输入参数是什么,预测结果总是一样的。
我试图与官方保持密切联系 tutorial。
我的训练数据由 7 个变量构成 data.frame。第一个是结果。结果为 0 或 1。
我的完整代码是:
sess <- tf$InteractiveSession()
x <- tf$placeholder(tf$float32, shape(NULL,6L))
y_ <- tf$placeholder(tf$float32, shape(NULL,2L))
W <- tf$Variable(tf$zeros(shape(6L, 1L)))
b <- tf$Variable(tf$zeros(shape(2L)))
sess$run(tf$global_variables_initializer())
y <- tf$nn$softmax(tf$matmul(x,W) + b)
cross_entropy <- tf$reduce_mean(-tf$reduce_sum(y_ * tf$log(y), reduction_indices=1L))
optimizer <- tf$train$GradientDescentOptimizer(0.5)
train_step <- optimizer$minimize(cross_entropy)
i = 1
while (i < (nrow(training_data)-20)) {
print(i)
batch_ys <- matrix(c(training_data[i:(i+19),1], abs(training_data[i:(i+19),1]-1)), nrow=20)
batch_xs <- matrix(c(training_data[i:(i+19),2],training_data[i:(i+19),3],training_data[i:(i+19),4],training_data[i:(i+19),5],training_data[i:(i+19),6],training_data[i:(i+19),7]), nrow=20, ncol=6)
sess$run(train_step, feed_dict = dict(x = batch_xs, y_ = batch_ys))
i = i + 20
}
并对训练数据的第一项进行简单检查
# Simple verification
for (j in 1:30){
test_data <- c(training_data[j,2],training_data[j,3],training_data[j,4],training_data[j,5],training_data[j,6],training_data[j,7])
test_data <- matrix(test_data, nrow = 1, ncol = 6)
feed_dict = dict(x= test_data)
print('############')
print(sess$run(y,feed_dict)) # this is always the same
print(training_data[j,1])
}
我预计 的预测取决于输入,但它 returns:
[1] "############"
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 2 2 4 74 5 2
[,1] [,2]
[1,] 0.0657808 0.9342192
[1] 1
[1] "############"
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 0 1 5 61 2 3
[,1] [,2]
[1,] 0.0657808 0.9342192
[1] 0
[1] "############"
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 3 2 6 85 5 4
[,1] [,2]
[1,] 0.0657808 0.9342192
[1] 0
我做错了什么?
谢谢,
巴斯蒂安
问题似乎出在这一行:
W <- tf$Variable(tf$zeros(shape(6L, 1L)))
当你用零初始化权重矩阵时,所有的梯度也将是零。因此,即使经过一些训练迭代 W
仍然是一个零矩阵。解决方案是使用小的随机值来初始化这个矩阵。
我想通了,为什么它不适用于数据。
该代码运行得非常好,但输入数据未在 0 和 1 之间缩放。
我想所有超过 1 的值都设置为 1(例如 32kg --> 1),所以 nnet 只用填有 1 的表格进行训练。由于每个输出分类的输入值相同,结果是一个常数值。
我想在 R 中用 tensorflow 实现一个预测函数,但是无论输入参数是什么,预测结果总是一样的。
我试图与官方保持密切联系 tutorial。
我的训练数据由 7 个变量构成 data.frame。第一个是结果。结果为 0 或 1。
我的完整代码是:
sess <- tf$InteractiveSession()
x <- tf$placeholder(tf$float32, shape(NULL,6L))
y_ <- tf$placeholder(tf$float32, shape(NULL,2L))
W <- tf$Variable(tf$zeros(shape(6L, 1L)))
b <- tf$Variable(tf$zeros(shape(2L)))
sess$run(tf$global_variables_initializer())
y <- tf$nn$softmax(tf$matmul(x,W) + b)
cross_entropy <- tf$reduce_mean(-tf$reduce_sum(y_ * tf$log(y), reduction_indices=1L))
optimizer <- tf$train$GradientDescentOptimizer(0.5)
train_step <- optimizer$minimize(cross_entropy)
i = 1
while (i < (nrow(training_data)-20)) {
print(i)
batch_ys <- matrix(c(training_data[i:(i+19),1], abs(training_data[i:(i+19),1]-1)), nrow=20)
batch_xs <- matrix(c(training_data[i:(i+19),2],training_data[i:(i+19),3],training_data[i:(i+19),4],training_data[i:(i+19),5],training_data[i:(i+19),6],training_data[i:(i+19),7]), nrow=20, ncol=6)
sess$run(train_step, feed_dict = dict(x = batch_xs, y_ = batch_ys))
i = i + 20
}
并对训练数据的第一项进行简单检查
# Simple verification
for (j in 1:30){
test_data <- c(training_data[j,2],training_data[j,3],training_data[j,4],training_data[j,5],training_data[j,6],training_data[j,7])
test_data <- matrix(test_data, nrow = 1, ncol = 6)
feed_dict = dict(x= test_data)
print('############')
print(sess$run(y,feed_dict)) # this is always the same
print(training_data[j,1])
}
我预计 的预测取决于输入,但它 returns:
[1] "############"
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 2 2 4 74 5 2
[,1] [,2]
[1,] 0.0657808 0.9342192
[1] 1
[1] "############"
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 0 1 5 61 2 3
[,1] [,2]
[1,] 0.0657808 0.9342192
[1] 0
[1] "############"
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 3 2 6 85 5 4
[,1] [,2]
[1,] 0.0657808 0.9342192
[1] 0
我做错了什么?
谢谢,
巴斯蒂安
问题似乎出在这一行:
W <- tf$Variable(tf$zeros(shape(6L, 1L)))
当你用零初始化权重矩阵时,所有的梯度也将是零。因此,即使经过一些训练迭代 W
仍然是一个零矩阵。解决方案是使用小的随机值来初始化这个矩阵。
我想通了,为什么它不适用于数据。 该代码运行得非常好,但输入数据未在 0 和 1 之间缩放。
我想所有超过 1 的值都设置为 1(例如 32kg --> 1),所以 nnet 只用填有 1 的表格进行训练。由于每个输出分类的输入值相同,结果是一个常数值。