TensorFlow新手求助:出现Check failed: NDIMS == new_sizes.size() (2 vs.1)错误
解决TensorFlow中维度不匹配错误(NDIMS == new_sizes.size() (2 vs. 1))
嘿,我来帮你搞定这个头疼的错误!你遇到的Check failed: NDIMS == new_sizes.size() (2 vs. 1)是典型的张量维度不匹配问题,结合错误码0xC0000409(通常是程序内部断言失败导致的崩溃),咱们直接定位问题根源:
问题根源
你在计算交叉熵的时候,labels(也就是y)和logits的维度完全不匹配:
logits是全连接层输出的张量,形状为[None, 3](对应你设置的n_output=3),是二维张量- 而你用
y = tf.to_float(action)得到的y,是tf.nn.top_k(logits,1)的输出,形状为[None, 1],虽然也是二维,但最后一维长度是1,和logits的最后一维长度3无法对齐,触发了TensorFlow内部的维度检查断言。
另外,env.step()需要接收单个整数动作,你直接传入的action_val是二维数组(比如[[0]]),这也会埋下运行隐患。
修复步骤
1. 将动作索引转换为One-Hot编码标签
把原来的y = tf.to_float(action)替换为以下代码,让y的形状和logits完全一致:
# 先压缩action的冗余维度,再转换为One-Hot编码 y = tf.one_hot(tf.squeeze(action, axis=1), depth=n_output)
tf.squeeze(action, axis=1):去掉action中长度为1的维度,把[batch_size,1]变成[batch_size]tf.one_hot(...):把每个动作索引转换成长度为n_output的One-Hot向量,最终y的形状为[batch_size, 3],和logits完美匹配。
2. 修正传入环境的动作格式
在调用env.step()时,需要从action_val中取出具体的整数值:
# 替换原来的 env.step(action_val) obs, reward, done, info = env.step(action_val[0][0])
因为sess.run([action, gradients])返回的action_val是二维数组(比如[[2]]),而env.step()只接受单个整数作为动作参数。
修复后的核心代码片段
这里是修改后的关键部分,方便你直接替换:
logits = tf.layers.dense(hidden,n_output,kernel_initializer=initializer) outputs = tf.nn.softmax(logits) index,action = tf.nn.top_k(logits,1) # 替换原有的y定义 y = tf.one_hot(tf.squeeze(action, axis=1), depth=n_output) cross_entropy = tf.nn.softmax_cross_entropy_with_logits_v2(labels=y,logits=logits)
# 游戏循环中的step执行部分 action_val,gradient_val = sess.run([action,gradients], feed_dict={X: obs.reshape(1, n_inputs)}) # 修正动作传入方式 obs, reward, done, info = env.step(action_val[0][0])
验证修改
做完这两处调整后,再运行代码,应该就能解决维度不匹配的断言错误了。本质上就是让交叉熵计算的两个输入张量维度完全对齐,同时给环境传入正确格式的动作参数。
内容的提问来源于stack exchange,提问作者Varsius
相关产品推荐
相关产品推荐

