【问题标题】:How does dimensions for placeholders work for tensorflow?占位符的尺寸如何适用于张量流?
【发布时间】:2020-10-27 06:55:26
【问题描述】:

所以假设我有x_trainy_train,它们是数组,并且该数组的每个元素都是一个数据点(以数组形式)(所以x_train 将采用x_train[i][j] 的形式)。所以x_train[0] 代表训练集中的第一个数据点(以数组形式),假设我想创建一个简单的回归

所以我写了这个

input = tf.placeholder(tf.float32, shape=[len(data[0]),None])
target = tf.placeholder(tf.flaot32, shape=[len(data[0]),None])

network = tf.layers.Dense(10, tf.keras.activations.relu)(input)
network = tf.layers.BatchNormalization()(network)

network = tf.layers.Dense(10,tf.keras.activations.relu)(network)
network = tf.layers.BatchNormalization()(network)

network = tf.layers.Dense(10,tf.keras.activations.linear)(network)

cost = tf.reduce_mean((target - network)**2)

optimizer = tf.train.AdamOptimizer().minimize(cost)

with tf.Session() as sess:
     for epoch in range(1000):
           _, val = sess.run([optimizer,cost], feed_dict={input: x_train, target: y_train})
           print(val)

但这是正确的吗?我不确定占位符的尺寸是否匹配。当我尝试运行此代码时, 我收到错误消息

ValueError: The last dimension of the inputs to `Dense` should be defined. Found `None`.

所以我尝试的是交换占位符的尺寸大小的位置,所以 改变的占位符是

    input = tf.placeholder(tf.float32, shape=[None,len(data[0])])
    target = tf.placeholder(tf.float32, shape=[None,len(data[0])]) 

但是有了这些,我就会收到错误消息

tensorflow.python.framework.errors_impl.FailedPreconditionError: Attempting to use uninitialized value dense/bias
 [[{{node dense/bias/read}}]]

【问题讨论】:

  • 如果你想使用Dense层,你不能有输入维度None。这就是第一个错误。为避免第二个错误,请将tf.global_variables_initializer().run() 作为with tf.Session() as sess: 上下文中的第一行运行。

标签: python tensorflow keras neural-network


【解决方案1】:

我能够通过在axis=0 上对x_trainy_train 执行np.expand_dims() 并在优化模型之前使用sess.run(tf.global_variable_initializer()) 初始化batch_norm 和网络参数来解决上述问题。

注意:None 在占位符形状的第一个维度中的存在是可以的,因为它允许 TensorFlow 在 batch_size 未知时训练模型(即使对于占位符形状的其他维度也是如此)。错误是由于输入和占位符尺寸中的不匹配。您的输入 (x_train & y_train) 可能是一维张量,而占位符要么需要二维张量,要么需要将一维向量重新整形为二维。

请在下面找到我的相同实现以及验证实现的matplotlib 图:

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

data = [[1,2,3,4,5,6,7,8,9,10],
        [11,12,13,14,15,16,17,18,19,20]]
x_train = data[0]
y_train = data[1]
x_train = np.expand_dims(x_train, 0)
y_train = np.expand_dims(y_train, 0)

input = tf.placeholder(tf.float32, shape=[None, len(data[0])])
target = tf.placeholder(tf.float32, shape=[None, len(data[1])])

network = tf.layers.Dense(10, tf.keras.activations.relu)(input)
network = tf.layers.BatchNormalization()(network)

network = tf.layers.Dense(10,tf.keras.activations.relu)(network)
network = tf.layers.BatchNormalization()(network)

network = tf.layers.Dense(10,tf.keras.activations.linear)(network)

cost = tf.reduce_mean((target - network)**2)

optimizer = tf.train.AdamOptimizer().minimize(cost)

costs = []

with tf.Session() as sess:
     sess.run(tf.global_variables_initializer())
     for epoch in range(1000):
        _, val = sess.run([optimizer,cost], feed_dict={input: x_train, target: y_train})
        costs.append(val)
        print(val)


fig, ax = plt.subplots(figsize=(11, 8))
ax.plot(range(1000), costs)
ax.set_title("Costs vs epochs")
ax.set_xlabel("Epoch")
ax.set_ylabel("Avg. val. accuracy")

这是成本与时期的关系图:

成本与时期

此外,要在新数据(例如)x_test = [[21,22,23,24,25,26,27,28,29,30]] 上测试网络,您可以使用以下代码:

 y_pred = sess.run(network,feed_dict={input: x_test})

PS:确保您使用上面创建的相同 Tensorflow Session sess 来运行推理(除非您不保存和加载模型检查点)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-08
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多