我试图获得预测和学习网络。
这是我的网络参数
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
,但它也会返回此错误。
如何解决该问题并获得预测值?
答案 0 :(得分:1)
您的代码存在多个问题,我认为您在此处发布的错误是最不重要的错误之一。
让我们遍历您的代码,让我对一些事情发表评论。我希望这将比仅修复单个ValueError
更有帮助。
首先定义两个占位符变量X
和y
,然后定义一个新的张量y_cls
作为argmax
的{{1}}。据此,我怀疑y
是一个单编码的地面真理类矢量(批处理的第一个轴)的集合。
然后,继续定义权重和偏差。对于权重,选择y
,而对于偏差,则选择tf.Variable
。我不认为这是故意的,实际上您希望偏见无法解决。
因此请注意:如果您使用tf.constant
,则会创建一个将来无法更改的常量值。因此,在训练期间将不会更新偏置张量。请阅读tensorflow中的变量和常量。这个问题可能是一个开始:TensorFlow Variables and Constants
现在,您定义第一层:
tf.constant
以下内容是这样的:对于批次中长度为layer = tf.nn.relu_layer(X, weights, bias, name="relu_layer")
的每个向量x
,将计算值X_train.shape[1]
,结果将通过u=x*W+b
传递。函数,基本上将所有<0的值都设置为零,并保持其他所有状态不变。因此,您的输出为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")
。因为relu函数是idempotent,所以这根本没有效果(除了创建更大的计算图之外)。因此layer_1 = max(0,layer) = max(0,max(0,x*W+b))
中的所有数字都与layer_1
中的相同。
然后,您使用layer
再次执行此操作。因此outs
与outs
和layer_1
相同。
然后继续并添加另一个激活功能:softmax。该函数的应用有点隐蔽,因为它在计算layer
的同时发生。至少可以说,以这种方式结合relu激活(或三个)和softmax是“非常规的”。有趣的是,您将cross_entropy
用作layer_1
参数,而不是logits
或layer
。
计算精度时,将outs
的输出强制转换为float16。为什么选择float16? tf.equal(y_pred, y_cls)
返回布尔类型,并且要使用此掩码进行计算,您必须强制转换它。但是,如果您只想要总和,则强制转换为tf.equal
似乎更合理。但是,我怀疑您不是真正希望将总和作为您的“准确性”,而是真实阳性与总样本数之比。看看tf.metrics.accuracy!
在第二个代码段中,调用一些int
函数,该函数的源代码未知。
optimize
我希望您以optimize(sess, training_op, X_train, X_test, y_train, y_test, epoch=20)
作为训练数据和地面真相标签training_op
为n_epochs
运行X_train
(但您将epoch = 20传递给该函数)。为什么您也将y_train
和X_test
传递给训练方法,我并不能真正理解,因为通常您希望在两个不同的步骤中进行训练和测试。
最后,您致电y_test
。在feed_dict中,为占位符sess.run(y_pred, feed_dict={inp: X_test})
分配inp
的值。但是,您之前没有定义占位符X_test
,因此该代码无法运行。我假设您想使用inp
作为网络的输入,并因此将其用作您一开始定义的占位符X_test
的值。
我强烈建议您阅读有关神经网络以及如何构建它们的更多信息,并阅读一些tensorflow教程。
然后修改您的整个代码,并在遇到麻烦时随时提出新问题。