Traceback (most recent call last):
File "I_train.py", line 171, in
tf.app.run()
File "/home/snake/anaconda3/envs/tf12/lib/python3.6/site-packages/tensorflow/python/platform/app.py", line 125, in run
_sys.exit(main(argv))
File "I_train.py", line 48, in main
graph, sess = IMod.build()
File "/media/snake/新加卷/Stem/IPCodec-master/networks/I_model.py", line 35, in build
self.build_train()
File "/media/snake/新加卷/Stem/IPCodec-master/networks/I_model.py", line 91, in build_train
self.train_ops = opt.apply_gradients(average_gradients(tower_grads), global_step=self.global_step)
File "/media/snake/新加卷/Stem/IPCodec-master/utils/utils.py", line 160, in average_gradients
grad = tf.stack(grads, 0)
File "/home/snake/anaconda3/envs/tf12/lib/python3.6/site-packages/tensorflow/python/ops/array_ops.py", line 867, in stack
value_shape = ops.convert_to_tensor(values[0], name=name)._shape_tuple() # pylint: disable=protected-access
File "/home/snake/anaconda3/envs/tf12/lib/python3.6/site-packages/tensorflow/python/framework/ops.py", line 1050, in convert_to_tensor
as_ref=False)
File "/home/snake/anaconda3/envs/tf12/lib/python3.6/site-packages/tensorflow/python/framework/ops.py", line 1146, in internal_convert_to_tensor
ret = conversion_func(value, dtype=dtype, name=name, as_ref=as_ref)
File "/home/snake/anaconda3/envs/tf12/lib/python3.6/site-packages/tensorflow/python/framework/constant_op.py", line 229, in _constant_tensor_conversion_function
return constant(v, dtype=dtype, name=name)
File "/home/snake/anaconda3/envs/tf12/lib/python3.6/site-packages/tensorflow/python/framework/constant_op.py", line 208, in constant
value, dtype=dtype, shape=shape, verify_shape=verify_shape))
File "/home/snake/anaconda3/envs/tf12/lib/python3.6/site-packages/tensorflow/python/framework/tensor_util.py", line 430, in make_tensor_proto
raise ValueError("None values not supported.")
ValueError: None values not supported.
这个错误是ValueError异常,你仔细看看你写的average_gradients函数的tf.stack(grads, 0)操作
根据给出的错误信息,问题是在调用 tf.stack()
函数时传入了一个 None
值。
问题可能出在 average_gradients
函数中,当处理 tower_grads
列表时,某个梯度值为 None
。
可以尝试在 average_gradients
函数中,添加一个检查机制,过滤掉值为 None
的梯度。以下是一个示例:
def average_gradients(tower_grads):
avg_grads = []
for grad in tower_grads:
if grad is not None:
avg_grads.append(tf.expand_dims(grad, 0))
if avg_grads:
grad = tf.stack(avg_grads, 0)
else:
grad = tf.constant(0.0)
return grad
这样,当处理 tower_grads
列表时,average_gradients
函数会跳过值为 None
的梯度,并尝试对非空的梯度列表进行处理。
如果问题仍然存在,请检查你的数据预处理和模型训练过程中是否存在可能导致梯度为 None
的情况。
ChatGPT: 这个错误表明在你的 TensorFlow 训练过程中出现了一个值为 None 的情况,而 TensorFlow 不支持处理 None 值。根据你提供的堆栈跟踪,问题可能出现在 utils.py
中的 average_gradients
函数中,尝试检查该函数的实现和调用是否存在问题。以下是一些可能的解决方法:
检查梯度计算:
首先检查 average_gradients
函数的参数 grads
是否包含了 None 值。在计算梯度的过程中,如果某个操作或层没有梯度,就会返回 None。你需要确保所有的梯度都不为 None。
调试梯度计算:
在调用 average_gradients
函数之前,尝试打印出每个梯度值,以查看是否有 None 值。你可以在 utils.py
文件中的 average_gradients
函数中添加打印语句,以帮助你调试。
检查模型构建:
错误信息中的堆栈跟踪表明问题出现在 I_model.py
文件中的 build_train
方法中。确保你在构建模型的过程中没有出现 None 值。
检查训练数据:
有时候训练数据中可能包含 None 值,导致计算梯度时出现问题。确保训练数据的每个样本都是完整的且不包含 None 值。
检查优化器设置:
你在训练时使用了优化器,并且在 self.train_ops
中应用了梯度。确保优化器和梯度的设置正确,没有出现 None 值。
检查其他函数调用:
如果在 average_gradients
函数以外的其他地方也有可能产生 None 值,需要仔细检查整个训练流程,确保没有 None 值传递到需要 Tensor 的地方。
通过逐步检查上述问题,你应该能够找到造成这个错误的具体原因,并进行相应的修复。如果问题仍然存在,考虑提供更多的代码片段或上下文,以便我能够更准确地帮助你诊断问题。
结合chatgpt
这个错误提示"None values not supported"说明代码中使用了None值,而TensorFlow框架不支持处理None值。在你的代码中,可能是在计算梯度时出现了None值的情况。
你可以尝试以下方法来排查并解决这个错误:
检查输入数据:确保输入数据没有None值。如果你使用了tf.placeholder()定义输入占位符,那么你需要在喂入数据时保证数据中没有None值。
检查模型定义:查看你的模型定义中是否有可能产生None值的操作或参数初始化方式。例如,某个操作可能依赖于其他操作的输出,如果其中任何一个操作产生了None值,则会导致错误。
检查优化器和梯度计算:查看你的优化器和梯度计算相关的代码段。确保这些部分正确处理了None值,或者加入异常处理来处理可能的None值情况。
检查损失函数定义:如果你使用了自定义的损失函数,确保在计算损失值时没有产生None值。
调试代码:你可以使用print语句或调试器来跟踪代码执行过程,找出导致None值错误的具体位置。检查每个变量和操作的值,以及计算梯度的过程中是否出现了None值。
希望以上方法能帮助你解决问题。如果问题仍然存在,请提供更多的代码细节,我会尽力帮助你。
【以下回答由 GPT 生成】
这个错误通常发生在TensorFlow框架中的某个操作中,其中包含了一个未被定义的变量或张量的值为None
。以下是一些可能的解决方案:
None
值。可以使用tf.debugging.check_numerics()
函数在训练过程中验证输入数据的值是否合法。例如:input_data = ...
valid_inputs = tf.debugging.check_numerics(input_data, "Invalid input values", name="input_data")
检查模型定义:检查模型定义中的变量或张量是否有未被赋值的情况。确保所有变量都已被正确初始化。
检查优化器使用:检查使用的优化器是否正确处理了所有变量。有时候优化器需要手动指定需要训练的变量列表,例如:
variables = tf.trainable_variables()
optimizer = tf.train.AdamOptimizer()
train_op = optimizer.minimize(loss, var_list=variables)
检查梯度计算:检查梯度计算的过程是否正确。错误的梯度计算可能导致梯度为None
值。可以使用tf.print()
函数在训练过程中输出相关的张量值,以便调试梯度计算的过程。
检查损失函数:检查损失函数的定义是否正确。有些损失函数在计算过程中可能会返回None
值,需要确保损失函数的计算过程正确无误。
这些是一些常见的解决方案,可以根据具体情况进行尝试。如果以上方法都不起作用,可能需要进一步调试代码,以找出引起该错误的具体原因。
该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索并已验证可行,得到内容具体如下:
根据你提供的错误信息,似乎在使用 TensorFlow 框架训练模型时遇到了一个错误。错误信息显示"None values not supported.",这可能是由于某个变量的值为 None 导致的。以下是一些可能的解决方法:
1、 检查数据和输入:确保你的输入数据没有缺失或错误值。检查你的训练数据集,确保数据集中没有任何样本或特征的值是 None。如果数据集中存在 None 值,你可以通过填充缺失值或排除具有 None 值的样本来处理它们。
2、 检查模型定义:检查你的模型定义代码,确保没有任何层或操作的输出设置为 None。在模型构建过程中,确保所有的层和操作都具有正确的输入和输出维度,避免在计算过程中出现 None 值。
3、 检查优化器和梯度计算:根据错误信息,问题似乎出现在 opt.apply_gradients(average_gradients(tower_grads))
这一行代码中。你可以检查梯度计算的过程,确保所有的梯度值都是有效的,没有为 None。如果梯度计算过程中存在 None 值,可能是由于模型定义或优化器设置的问题。
4、 查找其他报错信息:错误信息提供了一系列的追踪信息,你可以进一步检查这些信息,尤其是与你自己编写的代码相关的部分。检查追踪信息中的代码行,查找可能导致 None 值的变量或操作。
如果上述方法无法解决问题,建议提供更多的上下文和代码细节。
如果以上回答对您有所帮助,点击一下采纳该答案~谢谢
这个先贴代码再贴报错吧
可能是在 I_model.py 文件的 build 方法中出现了问题。检查 build 方法内部的代码,确保没有出现返回 None 的情况。
参考gpt:
结合自己分析给你如下建议:
您的梯度计算中有None值。这可能是由于您的模型中有一些变量没有被正确初始化,或者没有被包含在优化器的变量列表中。您需要检查您的变量初始化和优化器设置,确保所有需要更新的变量都有梯度值。
您的张量维度中有None值。这可能是由于您在创建张量时没有指定某些维度的大小,或者使用了不合适的操作导致维度丢失。您需要确保您的张量维度都是固定的,或者使用tf.shape或tf.size等函数来动态获取张量维度。
返回值为None
你创建张量时是不是使用了一个空的列表或数组或者使用了一个包含None值的列表或数组,导致无法将其转换为张量
源训练代码如下,测试的时候没问题,训练时出问题了,希望有大佬帮忙解决,本人有点小白刚接触深度学习框架【大哭】
def main(unused_argv):
args = parse_args()
IConfig.cckpt(args)
print(args)
print(IConfig)
#model and train config
os.environ['CUDA_VISIBLE_DEVICES']=','.join(["%d"%id for id in IConfig.gpus_list])
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'
if not os.path.isdir(IConfig.info_dir):
os.makedirs(IConfig.info_dir)
show_step = IConfig.show_step
total_batch_size = IConfig.total_batch_size
#built the IModel
IMod = IModel(is_train=True)
graph, sess = IMod.build()
steps_per_epoch = IMod.train_len//total_batch_size
valid_len = IMod.valid_len
batch_num = int(IConfig.total_batch_size/len(IConfig.gpus_list))
#open graph context manager
with graph.as_default():
actual_step = 0
tic = time()
# 使用pipeline的时候需要调用该线程启动
coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(sess=sess, coord=coord)
if IConfig.is_multi:
weight_alpha_list = generate_weight_list(IConfig.alpha[0], IConfig.alpha[1])
print("the weighted alpha list is \n", weight_alpha_list)
for step in range(3000000):
if actual_step>2500002:
break
if actual_step % 5000 == 0 and actual_step > 0:
IMod.ckpt_write(actual_step)
input_image = sess.run(IMod.train_next)
# print("the input shape is ", np.shape(input_image))
# input_image = load_single_image("./kodak/kodim01.png", is_zero_one=False) #True 为0-1; False为-1-1
if IConfig.is_multi:
index_rand = np.random.randint(0, len(IConfig.lambda_list)-1)
alpha_rand = random.choice(weight_alpha_list)
l_onehot = alpha_rand*IConfig.lambda_onehot[index_rand] + (1-alpha_rand)*IConfig.lambda_onehot[index_rand+1]
if IConfig.gpus_list:
feed_dict = {}
for idx, _ in enumerate(IConfig.gpus_list):
if IConfig.is_multi:
feed_dict.update({IMod.tower_input[idx]:input_image[idx*batch_num:(idx+1)*batch_num], IMod.tower_onehot[idx]:l_onehot})
else:
feed_dict.update({IMod.tower_input[idx]:input_image[idx*batch_num:(idx+1)*batch_num]})
else:
# use CPU, not a good method
if IConfig.is_multi:
feed_dict = ({IMod.input_image_in:input_image, IMod.lambda_onehot:l_onehot})
else:
feed_dict = {IMod.input_image_in:input_image}
try:
actual_step, _ = sess.run([IMod.global_step, IMod.train_ops], feed_dict=feed_dict)
# actual_step, recon_image, input_feature, weight_q= sess.run([IMod.global_step, IMod.recon_image, IMod.Net.H[1], IMod.Net.W_q[1]], feed_dict=feed_dict)
except:
print('the inf or NAN happened')
continue
# 训练基本,epoch输出
train_choose = 'train_whole'
sys.stdout.write("actual_step %d: epoch: %d, %.2f%% in a epoch, train_op: %s\r" % (
actual_step, actual_step // steps_per_epoch, 100 * (actual_step % steps_per_epoch) / (steps_per_epoch),
train_choose))
sys.stdout.flush()
if actual_step % show_step == 0:
lambda_train, total_loss, psnr, ms_ssim, bpp, bpp_y, LR = sess.run([IMod.lambda_train, IMod.total_loss, IMod.psnr, IMod.ms_ssim, IMod.bpp, IMod.bpp_y, IMod.LR],feed_dict=feed_dict)
toc = time()
nowtime = datetime.now().strftime('%Y-%m-%d %H:%M:%2S')
print("%s -- %d steps, %d epoch, fps %.2f, lambda:%.2f, total_loss:%.2e, psnr %.4f, ssim %.5f, bpp %.5f, bpp_y %.5f, LR %.5f" % (
nowtime, actual_step, actual_step // steps_per_epoch + 1, (toc - tic) / show_step, lambda_train, total_loss, psnr, ms_ssim, bpp, bpp_y, LR))
with open(os.path.join(IConfig.info_dir, "/info.txt"), "a+") as f:
f.write("%s -- %d steps, %d epoch, fps %.2f, lambda:%.2f, total_loss:%.2e, psnr %.4f, ssim %.5f, bpp %.5f, bpp_y %.5f, LR %.5f" % (
nowtime, actual_step, actual_step // steps_per_epoch + 1, (toc - tic) / show_step, lambda_train, total_loss, psnr, ms_ssim, bpp, bpp_y, LR))
f.write("\n")
tic = time()
if step > 0:
IMod.summary_write(actual_step, feed_dict)
if actual_step % 20000 == 0 and step > 1:
psnr_all = 0.0
msssim_all = 0.0
total_loss_all = 0.0
valid_bpp_all = 0.0
valid_bpp_y_all = 0.0
sess.run(IMod.init_valid) # 每次都重新开始初始化valid iteration迭代器,重头开始
for iter in tqdm(range(int(valid_len / total_batch_size))):
try:
valid_image_batch = sess.run(IMod.valid_next)
if IConfig.is_multi:
feed_dict={IMod.input_image_in:valid_image_batch, IMod.lambda_onehot:IConfig.lambda_onehot[2]}
else:
feed_dict={IMod.input_image_in:valid_image_batch}
initial_learning_rate, total_loss, psnr, ms_ssim, bpp, bpp_y = sess.run([IMod.initial_learning_rate,
IMod.total_loss, IMod.psnr, IMod.ms_ssim, IMod.bpp, IMod.bpp_y], feed_dict=feed_dict)
psnr_all += psnr
msssim_all += ms_ssim
total_loss_all += total_loss
valid_bpp_all += bpp
valid_bpp_y_all += bpp_y
except tf.errors.OutOfRangeError:
print("Consume all valid samples ")
break
with open(os.path.join(IConfig.info_dir, "valid_log.txt"), "a+") as f:
f.write('test: steps %d, total_loss %.8f, psnr %.4f, ssim %.6f, bpp: %.4f, bpp_y: %.4f, learng_rate: %.e, batch: %.d' %
(actual_step, total_loss_all / int(valid_len / total_batch_size),\
psnr_all / int(valid_len / total_batch_size),\
msssim_all / int(valid_len / total_batch_size),\
valid_bpp_all / int(valid_len / total_batch_size),\
valid_bpp_y_all / int(valid_len / total_batch_size),\
initial_learning_rate,\
total_batch_size))
f.write('\n')
if __name__ == '__main__':
tf.app.run()
用tensorflow框架训练模型时遇见错误 None values not supported.解决方法
在tensorflow建模中,在网络输出层那里加了一个attention:
sd_weights = tf.Variable(
tf.random_uniform([self.vocabulary_size1, 5], 0, 1.0), name="sd_weight")
遇到了一个bug:
ValueError: Tried to convert 'input' to a tensor and failed. Error: None values not supported.
大致意思就是有的变量没有求得的梯度的value,这样后面这一步的时候,对于那个没有值的变量,就没法求loss。
grad1 = opt.compute_gradients(total_loss)
最终把修改为
side_weight0 = tf.get_variable('side_weight', initializer=tf.random_uniform([data['num_classes'], 5], 0, 1.0), trainable=True)
bug解决!
不过没搞明白为啥把Variable变成get_variable,就可以解决
调用 tf.stack() 函数时,传入了一个 None 值,用列表解析或过滤函数(如 filter)来排除none
这个错误说了,你的代码尝试将 None 值传递给 TensorFlow 操作,而 TensorFlow 不支持 None 值。错误发生在 tf.stack(grads, 0) 这一行,它尝试将 None 值传递给 tf.stack 操作。
grads 是一个梯度列表,列表中的元素应该是 TensorFlow 张量。如果列表中存在 None 值,那么 tf.stack 操作就会失败。需要检查 grads 列表,确保其中没有 None 值。你可以使用 Python 的 filter() 函数来过滤掉 None 值,:
grads = list(filter(None, grads))
这将从 grads 列表中过滤掉 None 值,然后将其转换回列表。
确保你传递给tf.stack()函数的参数是正确的