Skip to main content
 首页 » 编程设计

python之关于占位符形状的 Tensorflow 错误

2024年09月07日31cmt

我是 TensorFlow 的新手,我试图理解占位符的概念。 假设我有一个形状为 100x4 的特征集。所以我有 100 行 4 个不同的特征。目标是 100x1 的形状。如果我想将两个矩阵都用作训练集。我所做的是:

X = tf.placeholder(tf.float64, shape=X_train.shape) 
Y = tf.placeholder(tf.float64, shape=y_train.shape) 
 
W = tf.Variable(tf.random_normal([4, 1]), name="weight",dtype=tf.float32) 
b = tf.Variable(rng.randn(), name="bias",dtype=tf.float32) 
 
pred = tf.add(tf.multiply(X, W), b) 
 
cost = tf.reduce_sum(tf.pow(pred-Y, 2))/(2*n_samples) 
 
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost) 
 
init = tf.global_variables_initializer() 
 
with tf.Session() as sess: 
 
    # Run the initializer 
    sess.run(init) 
 
    # Fit all training data 
    for epoch in range(training_epochs): 
        for (x, y) in zip(X_train, y_train): 
            sess.run(optimizer, feed_dict={X: x, Y: y}) 
            ... # some plotting and printing of results 

然后导致“ValueError:无法为张量‘Placeholder:0’提供形状 (...,) 的值,其形状为‘(..., ...)’”。更具体地说,成本函数中的“子”维度不相等。

有人可以解释如何进行以及为什么吗? 提前致谢

请您参考如下方法:

如果您想批量训练您的数据,您应该使用占位符。

为什么?
当您拥有大型数据集 时,可以这样做,例如,如果您想针对图像分类问题训练分类器,但无法将所有训练图像加载到内存中。相反,所做的是通过 batch gradient descent 训练您的模型.通过这种技术,每次只加载一批图像,并且只对该批图像执行反向传播。这需要更多的 epoch 才能收敛到最小值,但每个 epoch 的训练速度更快。

怎么做?
您首先定义两个占位符,一个用于训练示例 X,一个用于它们的标签 Y,具有各自的形状 (batch_size, 4) 和 (batch_size, 1) 在你的情况下。
然后,当您想要训练模型时,您应该通过提要字典将数据提供到占位符中:

with tf.Session() as sess: 
    sess.run(train_op, feed_dict={X:x_batch, Y:y_batch}) # train_op is the operation that minimizes your cost function 

x_batch 和 y_batch 应该是 X_train 和 Y_train 数组中的随机批处理,而不是 100 个示例,他们应该有 batch_size 个示例(以便它们的尺寸与占位符的尺寸匹配)。

为什么你不应该在你的情况下这样做?
由于您有一个小数据集,它已经加载到您的内存中,您可以使用常规梯度下降。

怎么做?
只需使用变量 (tf.Variable()) 而不是占位符。

X = tf.Variable(X_train) 
Y = tf.Variable(Y_train) 

这将创建两个 Variable 类型的张量,它们在初始化时将分别采用 X_train 和 Y_train 的形状和值。

只是不要忘记在您的 session 中初始化它们:

with tf.Session() as sess: 
     sess.run(tf.global_variables_initializer()) # initialize variables 
     sess.run(train_op) # no need for a feed_dict