问题概述
当在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进行处理。
此文章发布者为:Python技术站作者[metahuber],转载请注明出处:https://pythonjishu.com/tensorflow-error-106/