python-3.x - ValueError:尝试共享变量 rnn/multi_rnn_cell/cell_0/lstm_cell/kernel
问题描述
代码:
import tensorflow as tf
from tensorflow.python.ops import rnn_cell
cell = rnn_cell.LSTMCell(64, state_is_tuple=True)
multi_layer_cell = tf.nn.rnn_cell.MultiRNNCell([cell for i in range(2)])
x = tf.placeholder("float", [None, 10, 1])
output, state = tf.nn.dynamic_rnn(multi_layer_cell, x, dtype = tf.float32)
错误:
ValueError: Trying to share variable rnn/multi_rnn_cell/cell_0/lstm_cell/kernel, but specified shape (128, 256) and found shape (65, 256).
版本:Tensorflow 1.2.1 Python 3.5.4
这里的变体似乎不起作用:ValueError: Trying to share variable rnn/multi_rnn_cell/cell_0/basic_lstm_cell/kernel
解决方案
问题是您正在制作重复两次相同对象的列表
multi_layer_cell = tf.nn.rnn_cell.MultiRNNCell([cell for i in range(2)])
cell 不仅为多层单元指定参数,还直接使用对象。但是,对于您的神经网络,您的第一个单元格会将大小为 1 的输入映射到 64,然后您的第二个单元格会将 64 映射到 64。
您看到的形状是每个单元格的内核大小,至少它们应该是什么。LSTM 内核可以被视为大小 n + mx 4m,其中 n 是输入大小,m 是状态大小。因子 4 来自于有 4 个需要矩阵权重的门这一事实。n + m 来自于将输入 -> 门转换堆叠在状态 -> 门转换之上。例如,在您的第一个单元格中,n = 1 和 m = 64,因此您会看到大小 (65, 256),这显然不适用于需要大小为 (128, 256) 的内核的第二个单元格(因为 64 + 64 = 128 不是 65)。
要解决此问题,只需制作两个不同的单元格对象:
cell_1 = rnn_cell.LSTMCell(64, state_is_tuple=True)
cell_2 = rnn_cell.LSTMCell(64, state_is_tuple=True)
multi_layer_cell = tf.nn.rnn_cell.MultiRNNCell([cell_1,cell_2])
推荐阅读
- flutter - 键入'_CompactLinkedHashSet
' 不是 'Widget' 类型的子类型 - excel - 无法理解 Dir 在循环中使用时如何遍历下一个目录
- android - 如何为回收器适配器提供点击监听接口的实现?
- python - face_encoding 函数返回错误
- javascript - URL localhost 上的 Codeigniter Jquery Ajax 请求错误
- php - if ($_POST['username'] && $_POST['pass'])
- flutter - 从 Firestore Flutter 创建读取详细信息列表
- css - 想要根据用户选择加载浅色或深色主题
- php - 如何让我的自定义门在 Laravel 中工作?
- apollo - 响应后如何在 Apollo GraphQl 中重新定义查询的形状