我已经解决了这个错误。标签采用onehot
编码,因此尺寸为[,10]
,而不是[,1]
。所以我用了tf.argmax()
。

ValueError:无法压缩dim [1],预期尺寸为1,为'sparse_softmax_cross_entropy_loss获得了3

共 3 个回答
高赞
时间
活跃
0

0

这里的错误来自tf.losses.sparse_softmax_cross_entropy(labels = labels,logits = logits) 。
TensorFlow文档明确指出“标签向量必须为logits的每一行提供一个用于真实类的特定索引”。因此,标签向量必须仅包含类索引(如0,1,2),而不应包括其各自的一键编码(如[1,0,0],[0,1,0],[0,0,1])。
重现错误以进一步说明:
import numpy as np
import tensorflow as tf
# Create random-array and assign as logits tensor
np.random.seed(12345)
logits = tf.convert_to_tensor(np.random.sample((4,4)))
print logits.get_shape() #[4,4]
# Create random-labels (Assuming only 4 classes)
labels = tf.convert_to_tensor(np.array([2, 2, 0, 1]))
loss_1 = tf.losses.sparse_softmax_cross_entropy(labels, logits)
sess = tf.Session()
sess.run(tf.global_variables_initializer())
print 'Loss: {}'.format(sess.run(loss_1)) # 1.44836854
# Now giving one-hot-encodings in place of class-indices for labels
wrong_labels = tf.convert_to_tensor(np.array([[0,0,1,0], [0,0,1,0], [1,0,0,0],[0,1,0,0]]))
loss_2 = tf.losses.sparse_softmax_cross_entropy(wrong_labels, logits)
# This should give you a similar error as soon as you define it
因此,请尝试在Y_Labels向量中提供类索引而不是一键编码。希望这能消除您的疑问。
0

如果使用Keras的ImageDataGenerator
,则可以添加class_mode="sparse"
以获得正确的级别:
train_datagen = keras.preprocessing.image.ImageDataGenerator(
rescale=1./255,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True)
train_generator = train_datagen.flow_from_directory(
'data/train',
target_size=(150, 150),
batch_size=32,
class_mode="sparse")
另外,您也许可以使用softmax_cross_entropy
,它似乎对标签使用onehot编码。
新手导航
- 社区规范
- 提出问题
- 进行投票
- 个人资料
- 优化问题
- 回答问题
0
我试图用本地图像替换训练和验证数据。但是,在运行训练代码时,出现了以下错误:
我不知道该如何解决。模型定义代码中没有可见变量。该代码是从TensorFlow教程中修改的。图像是jpg。
这是详细的错误消息:
这是我的代码: