- 35
- 0
我的项目:影评情感分类
使用工具及平台:anaconda/tensorflow/python3/RNN
神经网络结构:一层LSTM,然后接上两层普通神经网络层。
遇到的本质问题:过拟合现象严重
目前已经使用的解决方法:1,dropout;2,对后面两层普通神经网络层权值w进行了L2 regularization.
新问题:想要尝试对LSTM单元内部的权值矩阵进行L2 regularization.因为使用了tensorflow内置的模块,tf.contrib.rnn.BasicLSTMCell,我不知道怎么拿到这个LSTM单元的内部权值矩阵,或者它的名称。求大神讲解。
我的lstm层代码如下:
def lstm_cell(dropout_keep_prob,scope):
with tf.variable_scope(scope):
lstm_layer = tf.contrib.rnn.BasicLSTMCell(hidden_size,forget_bias=1,state_is_tuple=True,activation=tf.nn.softsign)
lstm = tf.contrib.rnn.DropoutWrapper(lstm_layer, output_keep_prob=dropout_keep_prob)
return lstm
# lstm layer.
lstm_layer1 = lstm_cell(dropout_keep_prob,'lstm_1')
#init state
state_1 = lstm_layer1.zero_state(batch_size, tf.float32)
# get lstm rnn output.
lstm_rnn_1_in = tf.unstack(input_data_lookup, num=time_steps, axis=1)
lstm_rnn_1_out, _ =tf.contrib.rnn.static_rnn(lstm_layer1,lstm_rnn_1_in,initial_state=state_1,scope='lstm_1')
我目前的尝试方案:
tv = tf.trainable_variables()
l2_term = 0.01 * sum(
tf.nn.l2_loss(tf_var)
for tf_var in tv
if tf_var.name == 'lstm_1/basic_lstm_cell/kernel:0'
)
loss=tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=y_predict,labels=labels))
regularization = tf.nn.l2_loss(dnn_weights) + tf.nn.l2_loss(out_weights)
loss = tf.reduce_mean(loss + 0.01 * regularization + l2_term, name = 'loss')
这样好像不太对,而且那个LSTM内部的权值矩阵名字也会变,不一定是'lstm_1/basic_lstm_cell/kernel:0',可能是'RNN/basic_lstm_cell/Matrix:0',并且,这个权值矩阵的shape也很奇怪,跟我设置的lstm的hidden_size,time_step都没有关系。
综上所述:
问题一:lstm单元内部的shape是怎么来的,怎么解释?
问题二:如何给Lstm单元权值矩阵改名字,比如命名为lstm_weigths,这样就可以确保我用tf_var.name == lstm_weights能找到它?
问题三:我的L2 regularization写错了吗?
tensorlow新手上路,求诸位大佬指点,感激不尽。
- 共 0 条
- 全部回答
-
想亂叒偲箶 普通会员 1楼
在TensorFlow中,
BasicLSTMCell的内部有一个叫做weight_matrix的参数,它是一个形状为(num_layers, num_units)的矩阵,其中num_layers表示LSTM层的数量,num_units表示每一层的神经元数量。如果你想要获取
weight_matrix的名称,你可以在创建BasicLSTMCell时指定一个名称,然后在训练或者评估时使用这个名称来访问这个参数。例如:```python from tensorflow.contrib.rnn import BasicLSTMCell
创建一个LSTMCell,指定名称为'regular'
cell = BasicLSTMCell(num_units=128, name='regular')
使用这个cell
outputs, states = cell.zero_state(num_units=1, dtype=tf.float32)
假设你想要获取
weight_matrix的名称print(cell.get_weights()) ```
在这个例子中,
cell.get_weights()会返回一个包含weight_matrix所有维度的矩阵。如果你想要获取weight_matrix的名称,你可以使用cell.get_weights_names()方法,这将返回一个包含所有维度名称的列表。
- 扫一扫访问手机版
回答动态

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器更新之后。服务器里面有部分玩家要重新创建角色是怎么回事啊?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题函数计算不同地域的是不能用内网吧?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题ARMS可以创建多个应用嘛?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题在ARMS如何申请加入公测呀?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题前端小程序接入这个arms具体是如何接入监控的,这个init方法在哪里进行添加?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器刚到期,是不是就不能再导出存档了呢?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器的游戏版本不兼容 尝试更新怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器服务器升级以后 就链接不上了,怎么办?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器转移以后服务器进不去了,怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器修改参数后游戏进入不了,是什么情况?预计能赚取 0积分收益
- 回到顶部
- 回到顶部
