1.问题描述

loss => tf.losses.sparse_softmax_cross_entropy

loss_op = tf.losses.sparse_softmax_cross_entropy(y, y_pred)

`````` 为什么grads_vars第一列返回的元素为None?
``````

2.相关代码

``````import tensorflow as tf
import numpy as np
import time
import keras

# 加载数据集
x_dataset=np.random.rand(1000,28,28,1)
y_dataset=np.random.randint(0,10,size=(1000,))
act = tf.nn.leaky_relu

epoch = 200
batch_size = 5000
n_batch = len(x_dataset) // batch_size

# 把 batch 分成多少个 sub batch 来计算
subdivisions = 50
subdivisions_batch_size = int(np.ceil(batch_size / subdivisions))

# 是否使用 sub batch 方法，设置为 False 代表使用默认方法
is_on_subdivisions = True
def get_model(is_train=True, reuse=False):
with tf.variable_scope('model', reuse=reuse):
net = keras.models.Sequential()
return net

x = tf.placeholder(tf.float32, [None, 28, 28, 1])
y = tf.placeholder(tf.int32, [None,])

net = get_model()
y_pred=tf.cast(tf.argmax(net.outputs[0],axis=-1),dtype=tf.float32)
loss_op = tf.losses.sparse_softmax_cross_entropy(y, y_pred)
var_list=tf.trainable_variables()
for gv in grads_vars:
print(gv)
# 删掉没梯度的参数, 倒序删除，减少麻烦
for i in range(len(grads_vars))[::-1]:
if grads_vars[i][0] is None:
#因为返回的第一列为None，所以所有变量都被删除了，导致后面的异常！

grads_cache = [tf.Variable(np.zeros(t[0].shape.as_list(), np.float32), trainable=False) for t in grads_vars]

# 清空梯度缓存op，每一 batch 开始前调用
clear_grads_cache_op = tf.group([gc.assign(tf.zeros_like(gc)) for gc in grads_cache])

# 累积梯度op，累积每个 sub batch 的梯度

# 求平均梯度，
mean_grad = [gc/tf.to_float(subdivisions) for gc in grads_cache]

# 组装梯度列表
new_grads_vars = [(g, gv[1]) for g, gv in zip(mean_grad, grads_vars)]

# 应用梯度op，累积完所有 sub batch 的梯度后，应用梯度

# 原来的 optim ，跟上面做对照
ori_optim_op = tf.train.AdamOptimizer(0.01).minimize(loss_op, var_list=net.all_params)

config = tf.ConfigProto()
config.gpu_options.allow_growth = True
config.allow_soft_placement = True
sess = tf.Session(config=config)
sess.run(tf.global_variables_initializer())

for e in range(epoch):
loss_sum = 0
for b in progressbar(range(n_batch)):
x_batch = x_dataset[b * batch_size: (b + 1) * batch_size]
y_batch = y_dataset[b * batch_size: (b + 1) * batch_size]

if is_on_subdivisions:
# 每一批开始前需要清空梯度缓存

sub_loss_sum = 0
for s in range(subdivisions):
x_sub_batch = x_batch[s * subdivisions_batch_size: (s + 1) * subdivisions_batch_size]
y_sub_batch = y_batch[s * subdivisions_batch_size: (s + 1) * subdivisions_batch_size]
if len(x_sub_batch) == 0:
break
feed_dict = {x: x_sub_batch, y: y_sub_batch}
_, los = sess.run([accumulate_grad_op, loss_op], feed_dict)
sub_loss_sum += los
loss_sum += sub_loss_sum / subdivisions

# 梯度累积完成，开始应用梯度
# 本批次结束
else:
feed_dict = {x: x_batch, y: y_batch}
_, los = sess.run([ori_optim_op, loss_op], feed_dict)
loss_sum += los
time.sleep(0.2)
print('loss', loss_sum / n_batch)
``````

3.报错信息

``````grads_vars:
(None, <tf.Variable 'model/c1/kernel:0' shape=(3, 3, 1, 128) dtype=float32_ref>)
(None, <tf.Variable 'model/c1/bias:0' shape=(128,) dtype=float32_ref>)
(None, <tf.Variable 'model/dense_1/kernel:0' shape=(128, 10) dtype=float32_ref>)
(None, <tf.Variable 'model/dense_1/bias:0' shape=(10,) dtype=float32_ref>)
(None, <tf.Variable 'model_1/c1/kernel:0' shape=(3, 3, 1, 128) dtype=float32_ref>)
(None, <tf.Variable 'model_1/c1/bias:0' shape=(128,) dtype=float32_ref>)
(None, <tf.Variable 'model_1/dense_2/kernel:0' shape=(128, 10) dtype=float32_ref>)
(None, <tf.Variable 'model_1/dense_2/bias:0' shape=(10,) dtype=float32_ref>)
(None, <tf.Variable 'model_2/c1/kernel:0' shape=(3, 3, 1, 128) dtype=float32_ref>)
(None, <tf.Variable 'model_2/c1/bias:0' shape=(128,) dtype=float32_ref>)
(None, <tf.Variable 'model_2/dense_3/kernel:0' shape=(128, 10) dtype=float32_ref>)
(None, <tf.Variable 'model_2/dense_3/bias:0' shape=(10,) dtype=float32_ref>)

``````

4.尝试过的方法方式
5.相关截图

9 个月之前 回复

1个回答

9 个月之前 回复

《MySQL 性能优化》之理解 MySQL 体系结构

【资源】一个C/C++开发工程师的学习路线（已经无路可退，唯有逆风飞翔）【内附资源页】

20道你必须要背会的微服务面试题，面试一定会被问到

【CSDN编者按】1月2日，阿里巴巴发布《达摩院2020十大科技趋势》，十大科技趋势分别是：人工智能从感知智能向认知智能演进；计算存储一体化突破AI算力瓶颈；工业互联网的超融合；机器间大规模协作成为可能；模块化降低芯片设计门槛；规模化生产级区块链应用将走入大众；量子计算进入攻坚期；新材料推动半导体器件革新；保护数据隐私的AI技术将加速落地；云成为IT技术创新的中心 。 新的画卷，正在徐徐展开。...

Python+OpenCV实时图像处理

2020年一线城市程序员工资大调查

python爬取百部电影数据，我分析出了一个残酷的真相
2019年就这么匆匆过去了，就在前几天国家电影局发布了2019年中国电影市场数据，数据显示去年总票房为642.66亿元，同比增长5.4%；国产电影总票房411.75亿元，同比增长8.65%，市场占比 64.07%；城市院线观影人次17.27亿，同比增长0.64%。 看上去似乎是一片大好对不对？不过作为一名严谨求实的数据分析师，我从官方数据中看出了一点端倪：国产票房增幅都已经高达8.65%了，为什...

Windows可谓是大多数人的生产力工具，集娱乐办公于一体，虽然在程序员这个群体中都说苹果是信仰，但是大部分不都是从Windows过来的，而且现在依然有很多的程序员用Windows。 所以，今天我就把我私藏的Windows必装的软件分享给大家，如果有一个你没有用过甚至没有听过，那你就赚了????，这可都是提升你幸福感的高效率生产力工具哦！ 走起！???? NO、1 ScreenToGif 屏幕，摄像头和白板...

2020 年，大火的 Python 和 JavaScript 是否会被取而代之？
Python 和 JavaScript 是目前最火的两大编程语言，但是2020 年，什么编程语言将会取而代之呢？ 作者 |Richard Kenneth Eng 译者 |明明如月，责编 | 郭芮 出品 | CSDN（ID：CSDNnews） 以下为译文： Python 和 JavaScript 是目前最火的两大编程语言。然而，他们不可能永远屹立不倒。最终，必将像其他编程语言一...

AI 没让人类失业，搞 AI 的人先失业了

2020年，冯唐49岁：我给20、30岁IT职场年轻人的建议

B站是个宝，谁用谁知道???? 作为一名大学生，你必须掌握的一项能力就是自学能力，很多看起来很牛X的人，你可以了解下，人家私底下一定是花大量的时间自学的，你可能会说，我也想学习啊，可是嘞，该学习啥嘞，不怕告诉你，互联网时代，最不缺的就是学习资源，最宝贵的是啥？ 你可能会说是时间，不，不是时间，而是你的注意力，懂了吧！ 那么，你说学习资源多，我咋不知道，那今天我就告诉你一个你必须知道的学习的地方，人称...

loonggg读完需要2分钟速读仅需 1 分钟大家我，我是你们的校长。前几天，搜狐的董事局主席兼 CEO 张朝阳和搜狐都上热搜了。原因很简单，就是搜狐出了“考勤新规”。一封搜狐对员工发布...

【蘑菇街技术部年会】程序员与女神共舞，鼻血再次没止住。（文末内推）

Java校招入职华为，半年后我跑路了

​两年前不知如何编写代码的我，现在是一名人工智能工程师

loonggg读完需要5分钟速读仅需 2 分钟大家好，我是你们的校长。我知道大家在家里都憋坏了，大家可能相对于封闭在家里“坐月子”，更希望能够早日上班。今天我带着大家换个思路来聊一个问题...

&lt;!DOCTYPE html&gt; &lt;html lang="en"&gt; &lt;head&gt; &lt;meta charset="UTF-8"&gt; &lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt; &lt;meta http-equiv="X...
Spring框架|JdbcTemplate介绍

B 站上有哪些很好的学习资源?

【SpringBoot 系列】史上最全的springboot学习教程（会不断更新）