你能转置/反转 Tensorflow 占位符中的形状吗?



假设我的输入数据x具有形状(2000,2(,其中2000是样本数量,2是特征数量。

因此,对于这些输入数据,我可以设置这样的占位符:x=tf.占位符(tf.float32,shape=[无,2],name="功能"(

我的问题是,如果我转置我的输入数据x,使形状现在是(2000(,其中2000仍然是样本数,我将如何更改tf.placeholder中的"shape"参数?

我试过设置shape=[2,None],但我只是得到了一个错误。"shape"参数中的第一个元素是否总是必须为"None"?这里我得到的错误是:"ValueError:应该定义Dense输入的最后一个维度。找到None。">

import tensorflow as tf
# Binary Classifier Implementation
# Training data
x_train = np.transpose(X) #shape=(2, 2000)
y_train = np.hstack((np.zeros((1, 1000)),np.zeros((1, 1000)) + 1)) #shape=(1, 2000)

# Variables
x = tf.placeholder(tf.float32, shape=[2, None], name='features')
y_ = tf.placeholder(tf.int64, shape=[1, None], name='labels')
h1 = tf.layers.dense(inputs=x, units=50, activation=tf.nn.relu) #one hidden layer with 50 neurons
y = tf.layers.dense(inputs=h1, units=1, activation=tf.nn.sigmoid) #one output layer with 1 neuron

# Functions
#loss
cross_entropy = tf.losses.sigmoid_cross_entropy(multi_class_labels=y_, logits=y)
train_step = tf.train.GradientDescentOptimizer(0.1).minimize(cross_entropy)

# Initializer
init = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
for i in range(1000):
sess.run([cross_entropy], feed_dict={x: x_train, y_: y_train})

我认为你可能会遇到形状不一致的问题,而不是转换或在第一个dim之外的其他地方有未定义的尺寸
以下几件事对我来说很好:

import tensorflow as tf
x = tf.placeholder(tf.float32, shape=[None, 2])
x_t = tf.transpose(x)
y = tf.placeholder(tf.float32, shape=[2, None])
print(x_t.shape)
>> TensorShape([Dimension(2), Dimension(None)])
print(y.shape)
>> TensorShape([Dimension(2), Dimension(None)])

我假设第一个尺寸可能是你的批量大小?你是否可能与此不一致,或者输入了错误形状的数据
或者您试图手动更改张量的形状?(如果是这样,那么你就不需要了。tf会处理好这一点,这在我的例子中很明显(
这是最有帮助的方法,而不需要你给出你所得到的错误的想法、代码片段或任何模糊和一般的描述,但我希望它仍然有帮助
祝你好运!


由于更新的问题而更新:
您得到的错误准确地告诉您问题是什么。您可以转置任何您想要的,但dense层特别不能接受最后维度为None的张量。这是有道理的;例如,如果不知道权重矩阵的大小,就无法创建完全连接的层
如果你正在转换x,那么你说你有2000个特征(和2个数据点(,NN需要知道这一点,以便创建你要训练的参数
如果你仍然认为自己有两个功能,尽管有很多例子,那么你一开始就不应该使用(2000(的形状
尝试以下操作:

# Training data
x_train = X #shape=(2000, 2)
y_train = np.hstack((np.zeros((1000, 1)),np.zeros((1000, 1)) + 1)) #shape=(2000, 1)

# Variables
x = tf.placeholder(tf.float32, shape=[None, 2], name='features')
y_ = tf.placeholder(tf.int64, shape=[None, 1], name='labels')
h1 = tf.layers.dense(inputs=x, units=50, activation=tf.nn.relu) #one hidden layer with 50 neurons
y = tf.layers.dense(inputs=h1, units=1, activation=tf.nn.sigmoid) #one output layer with 1 neuron

# Functions
#loss
cross_entropy = tf.losses.sigmoid_cross_entropy(multi_class_labels=y_, logits=y)
train_step = tf.train.GradientDescentOptimizer(0.1).minimize(cross_entropy)

# Initializer
init = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
for i in range(1000):
sess.run([cross_entropy], feed_dict={x: x_train, y_: y_train})

希望这能有所帮助。


在一个完全不同和无关的注释上:我希望你知道当以这种方式在50维空间中嵌入2个特征时你在做什么。

最新更新