基本LSTM内核的尴尬形状

时间:2018-10-24 09:16:19

标签: python tensorflow machine-learning lstm

我想知道为什么LSTM内核和偏见具有我不想要的形状。 我已经在简单的DNN模型上运行了LSTM模型。 我的特征数据的结构(批量大小,每个示例的序列,特征)为(50、20、41)。 DNN具有3层(包括I / O层),每层具有41、20、10个节点。 DNN输出层的序列长度与RNN单元的输入层的序列相匹配。 精确地,每个DNN层意味着RNN的每个输入数据序列。 具有大小为20(序列)的RNN像元的RNN结构具有形状为(20,6)的权重向量和形状为(6)的偏差向量,而6表示一次热点的类数。 成本函数是预测类别和实际类别之间的均方差的均值,以标量值为单位。 优化器功能是Adam-Optimizer,以最大程度地降低成本。 *有我要解决的问题: 当我尝试使用张量流定义优化器时,会出现错误

"ValueError: No gradients provided for any variable, check your graph for ops that do not support gradients, between variables
[...(DNN Variables)...,
<'tf.Variable 'dense:#' shape(20,10) dtype=float32_ref'>,
<'tf.Variable 'rnn/basic_lstm_cell/kernel:0' shape=(30, 80) dtype=float32_ref'>,
<'tf.Variable 'rnn/basic_lstm_cell/bias:0' shape=(80) dtype=float32_ref'>]

我可以理解,“ 80”是一个值乘以20(序列)* 4(忘记,输入,输出,更新),但是我是如何得出“ 30”的。 我想知道如何精细地连接两个神经网络。 下面是简短的代码。

import tensorflow as tf
import numpy as np
tf.reset_default_graph()
tf.set_random_seed(777)
features = np.random.rand(50,20,41)
labels = np.random.randint(0,high=5,size=(50,6))
X = tf.placeholder(tf.float32, shape=[None, 20, 41])
Y = tf.placeholder(tf.float32, shape=[None, 6])
Xt = tf.transpose(X, (1,0,2))
Xr = tf.reshape(Xt, (-1,41))
Xs = tf.split(Xr, 20)
layers = [41, 20, 10]
input_rnn = []
for i in range(20):
  D = []
  for j in range(len(layers)):
    if j == 0:
      T = Xs[i]
    else:
      T = D[-1]
    D.append(tf.layers.dense(T, layers[j], activation = tf.nn.relu, kernel_initializer = tf.contrib.layers.xavier_initializer())
  input_rnn.append(D[-1])
R = {'w': tf.Variable(tf.random_normal([20,6],stddev=0.01),dtype=tf.float32), 'b': tf.Variable(tf.random_normal([6],stddev=0.01),dtype=tf.float32)}
    cell = tf.nn.rnn_cell.BasicLSTMCell(20)
outputs, states = tf.contrib.rnn.static_rnn(cell, input_rnn, dtype=tf.float32)
output =tf.matmul(outputs[-1], R['w'])+R['b']
cost = tf.metrics.mean(tf.square(tf.argmax(output,1)-tf.argmax(Y,1)))
optimizer = tf.train.AdamOptimizer(learning_rate=0.001).minimize(cost)

因此,在我看来,成本函数可能是个问题,因为结果是一个标量值,但是,我无法理解为什么这个问题会突然出现。 当我尝试将cost函数更改为“ softmax_cross_entropy_with_logits_v2”时,优化器函数定义正确。 但是,我想对每个班级应用成本权重,以使预测班级与实际班级之间的距离越长,权重越大,因此随着班级距离变小,总成本会下降。

0 个答案:

没有答案