我的任务是实现一个基本的LSTM网络,用于从Android手机的运动传感器数据识别字母,而无需使用tf.contrib中的任何模块。输入数据具有形状(?,150,3) - > ?:字母数,150:值数,3:x,y,z坐标。
计划是构建LSTM Cell并使用Adam Optimizer调整权重。问题是,fct。在我在sess.run()中提供数据之前执行LSTM。如何防止图表执行?我是否必须将所有代码放在一个类中,还是有另一种方式?
代码
x = tf.placeholder(tf.float32, shape=[None, n_features * fixed_length_of_feed_array])
y_ = tf.placeholder(tf.float32, shape=[None, 5])
x_r = tf.reshape(x, [-1, fixed_length_of_feed_array, 3])
states = [tf.random_normal([hidden, hidden]), tf.random_normal([hidden, hidden])]
def LSTM_Cell(hidden, inputs, states):
x_i = tf.add(tf.matmul(x_r, wx[:, :hidden]), bx[:, :hidden])
x_f = tf.add(tf.matmul(x_r, wx[:, hidden:hidden * 2]), bx[:, hidden:hidden * 2])
x_c = tf.add(tf.matmul(x_r, wx[:, hidden * 2:hidden * 3]), bx[:, hidden * 2:hidden * 3])
x_o = tf.add(tf.matmul(x_r, wx[:, hidden * 3:]), bx[:, hidden * 3:])
hi = tf.sigmoid(tf.concat([tf.matmul(states[0], wh[:, :hidden]), x_i], 1))
hf = tf.sigmoid(tf.concat([tf.matmul(states[0], wh[:, hidden:hidden * 2]), x_f], 1))
ho = tf.sigmoid(tf.concat([tf.matmul(states[0], wh[:, hidden * 2:hidden * 3]), x_o], 1))
hc = tf.tanh(tf.concat([tf.matmul(states[0], wh[:, hidden * 3:]), x_c], 1))
c = tf.multiply(hf, states[1]) + tf.multiply(hi, hc)
h = tf.multiply(ho, tf.tanh(c))
return h, c
def LSTM(hidden, inputs, states):
arr_inputs = inputs.split()
return LSTM_Cell(hidden, arr_inputs, states)
# pred
h, c = LSTM(hidden, x_r, states)
states[0], states[1] = h, c
y = tf.softmax(tf.add(tf.matmul(h, wy), by))
答案 0 :(得分:0)
在使用session.run提供数据之前,不会执行LSTM。相反,你的python代码执行并构建一个图形,只能在以后进行评估。