使用tensorflow 实现rnn (1)

先使用tensorflow来做rnn图片分类器

# 以一个图片分类为例,只需要知道最后一个维度的预测结果
# 本实例中,一个图片有20行,如果以评论为例,则表示一条评论有多少个字
n_steps = 20
# 一行有200维数据,评论的话,就是一个字使用多少维数据表示
n_inputs = 200
# GRUcell 隐藏单元数
n_hidden = 800
x = tf.placeholder(tf.float32,[None,n_steps,n_inputs])
y = tf.placeholder(tf.float32,[None,3])
batch_size = 300
# 这个output就得到了所有的预测
output,_ = tf.nn.dynamic_rnn(
#     tf.contrib.rnn.GRUCell(n_hidden),
    tf.contrib.rnn.LSTMCell(n_hidden),
    x,
    dtype = tf.float32,
    sequence_length=batch_size*[n_inputs]    
)
 
# 采用tf.gather获取batch中,每一个图片最后一个预测结果,是一个n_hidden维度的特征
index = tf.range(0,batch_size)*n_steps+(n_steps-1)
flat = tf.reshape(output,[-1,int(output.get_shape()[2])])
last = tf.gather(flat,index)

# softmax进行分类
weight = tf.Variable(tf.truncated_normal([n_hidden,3],stddev=0.01))
bias   = tf.Variable(tf.constant(0.1,shape=[3]))
prediction = tf.nn.softmax(tf.matmul(last,weight)+bias)

# 交叉熵损失
cross_entropy = -tf.reduce_sum(y*tf.log(prediction))
# 优化器
optimizer = tf.train.AdamOptimizer(0.001).minimize(cross_entropy)
# 准确性
correct = tf.equal(tf.argmax(prediction,1),tf.argmax(y,1))
acc = tf.reduce_mean(tf.cast(correct,tf.float32))
# 下面训练即可

隐藏单元这一块理解了很长时间不明白到底是什么意思,现在的理解是:其有点类似于卷积神经网络扩充的层次数,一张图片刚开始读出来是3维的,第一层卷积后可能会变成32层,特征数扩充了,这个n_hidden有点类似的意思。将n_input的特征数扩充为n_hidden,在最后输出的时候也是这个n_hidden,在进行全连接的时候,weight的第一维和这个n_hidden一致就行了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值