You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

适配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],处。

错误原因分析

修改代码时存在两个核心错误:

  1. label_dim计算错误:原代码label_dim = len(y_train[0, :])是获取独热编码的维度(即类别总数),但你改成了label_dim = len(y_train),这得到的是训练样本数量而非类别数,导致占位符和输出层维度完全错误。
  2. 占位符与损失函数不匹配:原代码用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 00:32:38