这是我的火车代码:
x = tf.placeholder(tf.float32, [None, 2, 3])
cell = tf.nn.rnn_cell.GRUCell(10)
_, state = tf.nn.dynamic_rnn(
cell = cell,
inputs = x,
dtype = tf.float32)
# train
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
x_ = np.ones([2,2,3],np.float32)
output = sess.run(state, feed_dict= {x: x_})
print output
saver = tf.train.Saver()
saver.save(sess,'./model')
结果是:
[[ 0.12851571 -0.23994535 0.23123585 -0.00047993 -0.02450397
-0.21048039 -0.18786618 0.04458345 -0.08603278 -0.08259721]
[ 0.12851571 -0.23994535 0.23123585 -0.00047993 -0.02450397
-0.21048039 -0.18786618 0.04458345 -0.08603278 -0.08259721]]
这是我的测试代码:
x = tf.placeholder(tf.float32, [None, 2, 3])
cell = tf.nn.rnn_cell.GRUCell(10)
_, state = tf.nn.dynamic_rnn(
cell = cell,
inputs = x,
dtype = tf.float32)
with tf.Session() as sess:
x_ = np.ones([1,2,3],np.float32)
saver = tf.train.Saver()
saver.restore(sess,'./model')
output = sess.run(state, feed_dict= {x: x_})
print output
然后我得到:
[[ 0.12851571 -0.23994535 0.2312358 -0.00047993 -0.02450397
-0.21048039 -0.18786621 0.04458345 -0.08603278 -0.08259721]]
你看,结果略有改变。当我将测试批次设置为2时,结果与训练结果相同。那有什么不对?我的tf版本是0.12
答案 0 :(得分:0)
#include <iostream>
#include <vector>
class Foo
{
public:
Foo(int s) : pegs (s, &TOKEN_EMPTY){}
static char const TOKEN_EMPTY=' ';
protected:
std::vector<const char*> pegs;
};
int main() {
// ues class Foo
return 0;
}
和const pingedUsers = [];
// doodle message
const msg = {author: {id:1}};
// message event
const onMessage = (message) => {
if (pingedUsers.indexOf(message.author.id) != -1) {
console.log("user replied");
}
}
onMessage(msg); // nothing
pingedUsers.push(msg.author.id); // push the author id
onMessage(msg); // he replied!
均已弃用,并替换为tf.nn.rnn_cell.GRUCell
。
使用不赞成使用的功能,您甚至不需要保存和恢复模型,甚至无需多次运行。您所需要做的就是以奇数批处理大小运行它,并使用tf.float32作为dtype,最后的结果将略有不同。
tf.nn.dynamic_rnn
返回这样的结果
tf.keras.layers.GRU
对于奇数长度的批次,异常似乎仅出现在最后一行。
另一种观点是,单个批次是正确的,并且所有偶数大小的批次都已关闭,除最后一行奇数大小的批次以外的所有内容都已关闭。
似乎dtype = float64或dtype = float16似乎都没有发生,这两种情况似乎都很稳定。
此外,此问题仅处于隐藏状态,似乎没有出现在常规输出中。