详解TensorFlow报”AbortedError: Incompatible shapes: [num_classes] vs. [num_classes,] “的原因以及解决办法

yizhihongxing

问题概述

当在TensorFlow中定义一个神经网络模型时,有时候会遇到这个错误“AbortedError: Incompatible shapes: [num_classes] vs. [num_classes,]”。

问题分析

这是由于在定义网络时,我们定义了一个数组,而另一个是一个矢量(向量)。

解决方案

在定义变量时,需要维度一致,一般情况下,在TensorFlow中定义向量时,推荐使用行向量,而不是列向量。

具体实现方法:

使用reshape或tf.expand_dims来解决这个问题

使用reshape:

定义变量时,将数组转换为行向量:

num_classes = 10
weights = tf.Variable(tf.random_normal([num_classes]))
biases = tf.Variable(tf.random_normal([num_classes]))

在softmax层时,对预测值进行reshape:

logits = tf.matmul(x, weights) + biases
logits = tf.reshape(logits, [-1, num_classes])
y_pred = tf.nn.softmax(logits)

这会将预测值变成一个行向量,并且在运行时不会引发"Incompatible shapes"错误。

使用tf.expand_dims:

定义变量时,将向量用tf.expand_dims扩展一维:

num_classes = 10
weights = tf.Variable(tf.random_normal([num_classes]))
biases = tf.Variable(tf.random_normal([num_classes]))

在softmax层时,使用tf.expand_dims为预测值增加一个维度,并将其转换为行向量:

logits = tf.matmul(x, weights) + biases
y_pred = tf.nn.softmax(tf.expand_dims(logits, axis=0))
y_pred = tf.reshape(y_pred, [-1, num_classes])

这样就可以将预测值转换为一个行向量,并在运行时避免"Incompatible shapes"错误。

使用tf.squeeze解决这个问题

将定义变量时,将向量保存为列向量:

num_classes = 10
weights = tf.Variable(tf.random_normal([num_classes, 1]))
biases = tf.Variable(tf.random_normal([num_classes, 1]))

在softmax层时,使用tf.squeeze来去掉多余的维度:

logits = tf.matmul(x, weights) + biases
logits = tf.squeeze(logits)
y_pred = tf.nn.softmax(logits)

这样预测值就变成了一个行向量,并且可以在运行时避免"Incompatible shapes"错误。

总结

在TensorFlow中,避免使用列向量,而是使用行向量来定义向量类型的变量。如果必须要使用列向量,则需要使用tf.expand_dims或tf.squeeze进行处理。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解TensorFlow报”AbortedError: Incompatible shapes: [num_classes] vs. [num_classes,] “的原因以及解决办法 - Python技术站

(0)
上一篇 2023年3月19日
下一篇 2023年3月19日

相关文章

合作推广
合作推广
分享本页
返回顶部