操作具有与类型 int64 不匹配的 int32 类型

Operation has type int32 that does not match type int64

我正在尝试使用 tflearn 提供的 DNN 训练一些数据。我的 data 变量的形状为 (6605, 32),我的 labels 数据的形状为 (6605,),我在下面将其重塑为 (6605, 1)...

# Target label used for training
labels = np.array(data[label], dtype=np.float32)

# Reshape target label from (6605,) to (6605, 1)
labels = tf.reshape(labels, shape=[-1, 1])

# Data for training minus the target label.
data = np.array(data.drop(label, axis=1), dtype=np.float32)

# DNN
net = tflearn.input_data(shape=[None, 32])
net = tflearn.fully_connected(net, 32)
net = tflearn.fully_connected(net, 32)
net = tflearn.fully_connected(net, 1, activation='softmax')
net = tflearn.regression(net)

# Define model.
model = tflearn.DNN(net)
model.fit(data, labels, n_epoch=10, batch_size=16, show_metric=True)

在 运行 之后我得到两个错误,第一个是...

ValueError: Tensor conversion requested dtype int64 for Tensor with dtype int32: 'Tensor("strided_slice/stack_4:0", shape=(1,), dtype=int32)'

第二个错误是...

During handling of the above exception, another exception occurred:

TypeError: Input 'strides' of 'StridedSlice' Op has type int32 that does not match type int64 of argument 'begin'.

我不知道如何解决这个问题。所以我采取的一种方法是将 labelsdatadtype 更改为 int64...

# Target label used for training
labels = np.array(data[label], dtype=np.int64)

# Reshape target label from (6605,) to (6605, 1)
labels = tf.reshape(labels, shape=[-1, 1])

# Data for training minus the target label.
data = np.array(data.drop(label, axis=1), dtype=np.int64)

但是如果我这样做,我仍然会遇到同样的错误。我该如何解决这个问题?

这个错误似乎是由旧版本的 tensorflow 产生的。我通过使用...

更新了 tensorflow
pip3 install tensorflow --upgrade

这消除了 int64 错误。似乎在转换 long 数据类型时出现问题,例如旧版本中的 int64

更新后,由于张量的形状,我得到了不同的错误...

Shape must be rank 1 but is rank 2 for 'strided_slice' (op: 'StridedSlice') with input shapes: [6605,1], [1,16], [1,16], [1].

但这是另一个问题。

请注意,该错误指出有关整数、int64 和 int32 的 ValueError,因此有问题的转换应该是 int 而不是 float。

我在代码库中遇到过类似的情况,无法更新 tensorflow, 我正在生成一个导致 int 类型 ValueError 的索引。

如果无法升级 tensorflow 的版本,您可以转换为 int32,例如:

new_var = tf.cast(old_var, tf.int32)

如果您检查发生错误的确切行,您应该找到罪魁祸首,施放它,它应该可以工作。此解决方案应该适用于 int 和 float 铸造(使用 tf.float32)。