适配1维y_train/y_test的VIME半监督代码报错求助
VIME半监督代码适配1维标签报错解决
问题背景
VIME的TensorFlow实现中vime_semi.py默认输入的标签y_train、y_test是2维独热编码数组,但我的数据集标签是1维类别索引数组。修改代码后运行出现以下报错:
ValueError: Cannot feed value of shape (128,) for Tensor Placeholder_1:0, which has shape (None, 1000)
报错位置在_, y_loss_curr = sess.run([solver, y_loss],处。
错误原因分析
修改代码时存在两个核心错误:
- label_dim计算错误:原代码
label_dim = len(y_train[0, :])是获取独热编码的维度(即类别总数),但你改成了label_dim = len(y_train),这得到的是训练样本数量而非类别数,导致占位符和输出层维度完全错误。 - 占位符与损失函数不匹配:原代码用
softmax_cross_entropy损失,要求标签是2维独热编码;而1维类别索引需要用sparse_softmax_cross_entropy损失,同时占位符的形状和数据类型也需要对应调整。
解决方案
步骤1:修正label_dim的计算
将标签维度改为数据集中的类别总数:
# 替换原错误的label_dim计算 label_dim = len(np.unique(y_train))
步骤2:调整y_input占位符的形状和类型
因为是1维类别索引,占位符形状设为[None],类型用整数型:
# 替换原y_input定义 y_input = tf.compat.v1.placeholder(tf.int32, [None])
步骤3:修改损失函数为稀疏交叉熵
使用适配1维标签的sparse_softmax_cross_entropy:
# 替换原y_loss定义 y_loss = tf.compat.v1.losses.sparse_softmax_cross_entropy(labels=y_input, logits=y_hat_logit)
步骤4:确认标签数据处理保持1维
你代码中对y_train、y_valid、y_batch的切片处理是正确的,保持1维即可,无需额外扩展维度。
修改后的关键代码片段
# Basic parameters data_dim = len(x_train[0, :]) # 修正label_dim计算 label_dim = len(np.unique(y_train)) print("LABEL DIM: ", label_dim) # ... 省略中间代码 ... # Input placeholder # Labeled data tf.compat.v1.disable_eager_execution() x_input = tf.compat.v1.placeholder(tf.float32, [None, data_dim]) # 修正y_input的形状和类型 y_input = tf.compat.v1.placeholder(tf.int32, [None]) # ... 省略中间代码 ... # Defin losses # Supervised loss # 替换为稀疏交叉熵损失 y_loss = tf.compat.v1.losses.sparse_softmax_cross_entropy(labels=y_input, logits=y_hat_logit) # Unsupervised loss yu_loss = tf.compat.v1.reduce_mean(tf.nn.moments(yv_hat_logit, axes=0)[1])
内容的提问来源于stack exchange,提问作者Sahil Sahu
相关产品推荐
相关产品推荐

