您的代码有多个问题,我认为您在这里发布的错误是最不重要的错误之一。
让我们看看你的代码,让我评论一些事情。我希望这比修理单间更有用
ValueError
.
首先定义两个占位符变量
X
和
y
y_cls
作为
argmax
属于
是的
是的
然后继续定义权重和偏差。对于重量,你可以选择
tf.Variable
而对于你使用的偏见
tf.constant
. 我不认为这是故意的,事实上你希望偏见是不可训练的。
所以请注意:如果你使用
tf.常数
,您将创建一个将来无法更改的常量值。因此,偏压张量在训练过程中不会更新。请阅读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
有形状
(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函数是
idempotent
,这完全没有效果(除了创建更大的计算图)。所以所有的数字
layer_1
与中相同
层
.
你再这样做一次
outs
. 所以
就跟
和
.
然后继续添加另一个激活函数:softmax。此函数的应用程序有点隐藏,因为它与
cross_entropy
是经过计算的。至少可以说,以这种方式将relu激活(或三个)和softmax结合起来是“非常规的”。有趣的是,你用
第1层
作为你的
logits
参数与否
或
出局
当你计算你的精度时,你将输出
tf.equal(y_pred, y_cls)
浮16。为什么选择浮动16?
tf.equal
返回bool类型,若要使用此掩码进行计算,必须对其进行强制转换。但如果你只想得到总数,那么
int
似乎更合理。然而,我怀疑你并不是真的想把总数当作你的“准确度”,而是真阳性率和样本总数的比值。看一看
tf.metrics.accuracy!
在第二个代码片段中,您可以调用
optimize
我们不知道其源代码的函数。
optimize(sess, training_op, X_train, X_test, y_train, y_test, epoch=20)
我希望你能
training_op
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_检验
作为网络的输入,因此将其用作占位符的值
十
你在开头定义的。
然后修改你的整个代码,当你遇到麻烦的时候,你可以自由地提出新的问题。