python - Tensorflow:获得预测
问题描述
我试图获得预测和学习网络。
这是我的网络的参数
X = tf.placeholder(tf.float32, shape=(None, X_train.shape[1]), name="input")
y = tf.placeholder(tf.float32, shape=(None, y_train.shape[1]), name="y")
y_cls = tf.argmax(y, axis=1)
weights = tf.Variable(tf.truncated_normal([X_train.shape[1], y_train.shape[1]], stddev=0.05), name="weights", trainable=True)
bias = tf.constant(1.0, shape=[y_train.shape[1]], name="bias")
layer = tf.nn.relu_layer(X, weights, bias, name="relu_layer")
layer_1 = tf.nn.relu(layer)
outs = tf.nn.relu(layer_1, name="outs")
y_pred = tf.argmax(outs, axis=1)
cross_entropy = tf.nn.softmax_cross_entropy_with_logits_v2(logits=layer_1, labels=y)
cost = tf.reduce_mean(cross_entropy)
acc = tf.cast(tf.equal(y_pred, y_cls), tf.float16)
predicted = tf.reduce_sum(acc)
learning_rate = 1e-3
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate)
training_op = optimizer.minimize(cost)
并尝试通过
n_epochs = 100
batch_size = 500
n_batches = int(np.ceil(1000 / batch_size))
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
optimize(sess, training_op, X_train, X_test, y_train, y_test, epoch=20)
print(sess.run(y_pred, feed_dict={X: X_test}))
但它返回一个错误
ValueError: setting an array element with a sequence.
y_pred
我也尝试使用outs
,layer_1
但它也会返回此错误。
我该如何解决这个问题并获得预测值?
解决方案
您的代码存在多个问题,我认为您在此处发布的错误是最不重要的错误之一。
让我们看看你的代码,让我评论一些事情。我希望这将比仅修复单个ValueError
.
您从定义两个占位符变量开始X
,y
并将新张量定义y_cls
为argmax
of y
。由此我怀疑这y
是一个热编码的地面真实类向量的集合(批处理的第一个轴)。
然后你继续定义权重和偏差。对于权重,您选择tf.Variable
而对于您使用的偏差tf.constant
。我不认为这是故意的,你实际上希望这些偏见是不可训练的。所以请注意:如果您使用tf.constant
,您将创建一个将来无法更改的常量值。因此,偏差张量在训练期间不会更新。请阅读 tensorflow 中的变量和常量。这个问题可能是一个开始:TensorFlow 变量和常量
现在定义第一层:
layer = tf.nn.relu_layer(X, weights, bias, name="relu_layer")
这里发生的情况如下:对于批处理中的每个x
长度向量,计算值并将结果传递给函数,该函数基本上将所有值 <0 设置为零,并保持其他所有内容不变。所以你的输出是元素取最大值的地方。输出有 shape 。您定义的张量的输出具有形状以说明批量大小。X_train.shape[1]
u=x*W+b
relu
z=max(0,x*W+b)
z
(y_train.shape[1],)
layer
tf.nn.relu_layer
(None, y_train.shape[1])
然后你定义“有趣”的东西:
layer_1 = tf.nn.relu(layer)
outs = tf.nn.relu(layer_1, name="outs")
换种说法,你计算layer_1 = max(0,layer) = max(0,max(0,x*W+b))
。因为 relu 函数是幂等的,所以这根本没有影响(除了创建更大的计算图)。所以 中的所有数字layer_1
都与 中的相同layer
。然后,您再次使用outs
. 所以和outs
是一样layer_1
的layer
。
然后继续添加另一个激活函数:softmax。这个函数的应用有点隐蔽,因为它发生在cross_entropy
计算的同时。以这种方式结合一个 relu 激活(或三个)和一个 softmax 至少可以说是“非常规的”。有趣的是,您使用layer_1
作为logits
参数而不是layer
or outs
。
当您计算准确度时,您将输出tf.equal(y_pred, y_cls)
转换为 float16。为什么选择浮动 16?tf.equal
返回一个 bool 类型并使用此掩码进行计算,您肯定必须强制转换它。但是,如果您只想要总和,那么转换为 anint
似乎更合理。但是,我怀疑您并不是真的想要总和作为您的“准确性”,而是真正想要的比率与提供的样本总数。看看tf.metrics.accuracy!
在第二个代码片段中,您调用了一些optimize
我们不知道其源代码的函数。
optimize(sess, training_op, X_train, X_test, y_train, y_test, epoch=20)
我希望你运行你的training_op
for n_epochs
(但你将 epoch=20 传递给这个函数)X_train
作为 training data 和 ground truth labels y_train
。为什么你也通过X_test
了y_test
训练方法,我不太明白,因为通常你想在两个不同的步骤中保持训练和测试。
最后你打电话sess.run(y_pred, feed_dict={inp: X_test})
。在 feed_dict 中,您为占位符分配inp
的值X_test
。但是,您之前没有定义占位符inp
,因此无法运行此代码。我假设您想将其用作网络的输入,因此将其用作您在开始时定义X_test
的占位符的值。X
我强烈建议您阅读有关神经网络以及如何构建它们的更多信息,并阅读一些 tensorflow 教程。
然后修改您的整个代码,并在遇到麻烦时随时提出新问题。
推荐阅读
- wordpress - 合并网站、图片双ID问题
- wicket - 如何在 Wicket 中从 tinyMCE 设置宽度
- go - 无法在 Go 应用程序的另一个包中使用函数
- firefox - Mozilla firefox 忽略缓存控制标头
- node.js - 如何处理 Selenium Webdriver Node Js 中的错误。NoSuchElementError
- sql - SQL Server:基于父子关系拆分列
- python - 有没有可以去除异常值的功能?
- c# - 防止用户拥有多个并发会话
- azure - 从 ARM 模板部署逻辑应用自定义连接器时设置身份验证
- java - Java FX 中的抗锯齿管理