我尝试获得预测和学习网络。
这是我的网络参数
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 Variables and Constants
现在定义第一层:
layer = tf.nn.relu_layer(X, weights, bias, name="relu_layer")
此处发生的情况如下:对于批次中的每个x
长度向量,都会计算X_train.shape[1]
该值u=x*W+b
,并将此结果传递给relu
函数,该函数基本上将所有值 <0 设置为零,而其他所有内容保持原样。所以你的输出是z=max(0,x*W+b)
在元素上取最大值的地方。输出z
具有 shape (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
. Soouts
与layer_1
and相同layer
。
然后你继续添加另一个激活函数:softmax。这个函数的应用有点隐蔽,因为它与cross_entropy
计算同时发生。至少可以说,以这种方式结合 relu 激活(或三个)和 softmax 是“非常规的”。有趣的是,您使用layer_1
作为logits
参数而不是layer
or outs
。
当您计算准确度时,您将输出转换tf.equal(y_pred, y_cls)
为 float16。为什么是 float16?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
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 教程。
然后修改您的整个代码,并在遇到麻烦时随时提出新问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句