m0_74946741 2024-03-13 23:10 采纳率: 75%
浏览 21

lstm输入数据维度问题

用tensorflow和源代码实现的,但是因为是参考着参考书写的,在传入自己的数据之后,数据维度方面有很大问题,麻烦大家看看

以下是我的数据维度:

img

传入时格式设置如下:

for e in range(epochs):
    print(f"-----Epoch_{e+1}-----")
    x_mb = np.zeros((figures_size, batch_size, window_size))
    for n, j in enumerate(range(n_batch)):
        print(f"-----batch {n+1}-----")
        x_mb_ori = x_train_ori[j*batch_size:(j+1)*batch_size]
        t_mb,flag = get_t(x_mb_ori, y_train[j*batch_size:(j+1)*batch_size])

lstm模型forward部分定义如下:

class LSTMLayer:
    def __init__(self, n_upper, n):
        #各项参数的初始值
        self.w = np.random.randn(4, n_upper, n)/np.sqrt(n_upper)
        self.v = np.random.randn(4, n, n)/np.sqrt(n)
        self.b = np.zeros((4, n))

    def forward(self, x, y_prev, c_prev):
        #y_prev,c_prev:前一时刻的输出数据和记忆单元
        u = np.matmul(x, self.w)+np.matmul(y_prev, self.v)+self.b.reshape(4,1,-1)

        a0 = sigmoid(u[0])           #忘记门
        a1 = sigmoid(u[1])           #输入门
        a2 = np.tanh(u[2])           #新的记忆
        a3 = sigmoid(u[3])           #输出门
        self.gates = np.stack((a0,a1,a2,a3))
        self.c = a0*c_prev + a1*a2          #记忆单元
        self.y = a3 * np.tanh(self.c)       #输出数据

请问我该怎么修改以下内容(应该主要是数据维度方面)保证我的数据传入模型并且能够正确运行呐?

#初始化LSTM
InputLayers = [LSTMLayer(window_size, n_mid)] * figures_size
DenseLayers = [LSTMLayer(n_mid, n_mid),OutputLayer(n_mid, n_out)]

#LSTM正向传播
def forward_propagation(x_figures):
    x_lst = [] 
    x_rnn = np.zeros((len(x_figures), figures_size+1, n_mid))
    y_rnn = np.zeros((len(x_figures), figures_size+1, n_mid))
    c_rnn = np.zeros((len(x_figures), figures_size+1, n_mid))
    gates_rnn = np.zeros((4, len(x_figures), figures_size, n_mid))
    y_prev = y_rnn[:, 0,:]
    c_prev = c_rnn[:, 0,:]
    for i, layer in enumerate(InputLayers):
        layer.forward(x_figures[:, i, :], y_prev, c_prev)
        x_lst.append(layer.y)
        x_rnn[ :, i, :] = layer.y
        
        y = layer.y
        y_rnn[:, i+1,:] = y
        y_prev = y
        
        c = layer.c
        c_rnn[:, i+1,:] = c
        c_prev = c
        
        gates = layer.gates
        gates_rnn[:, :, i,:] = gates
        
        
    #x = np.concatenate(x_lst, axis=1)
    y_prev = y_rnn
    c_prev = c_rnn
    for layer in DenseLayers:
        layer.forward(x_rnn,y_prev,c_prev)
        x = layer.y
    return x

按现在的设置报错如下:

ValueError                                Traceback (most recent call last)
Cell In[15], line 15
     13 if flag:
     14     true.append(t_mb)
---> 15     p = forward_propagation(x_mb)
     16     pred.append(p)
     17     backpropagation(x_mb, t_mb)

Cell In[13], line 52, in forward_propagation(x_figures)
     50 c_prev = c_rnn
     51 for layer in DenseLayers:
---> 52     layer.forward(x_rnn,y_prev,c_prev)
     53     x = layer.y
     54 return x

File ~/Gushuai/LSTM-Transformers/py_file/LSTM.py:15, in LSTMLayer.forward(self, x, y_prev, c_prev)
     13 def forward(self, x, y_prev, c_prev):
     14     #y_prev,c_prev:前一时刻的输出数据和记忆单元
---> 15     u = np.matmul(x, self.w)+np.matmul(y_prev, self.v)+self.b.reshape(4,1,-1)
     17     a0 = sigmoid(u[0])           #忘记门
     18     a1 = sigmoid(u[1])           #输入门

ValueError: matmul: Input operand 1 has a mismatch in its core dimension 0, with gufunc signature (n?,k),(k,m?)->(n?,m?) (size 16 is different from 32)

有哪位神人可以帮帮我吗 谢谢🥹

  • 写回答

5条回答 默认 最新

  • 关注

    m0_74946741 晚上好🌙🌙🌙
    本答案参考ChatGPT-3.5

    根据你提供的代码和报错信息看,有以下几个问题需要解决:

    1. 数据维度匹配问题: 根据报错信息,可以看出在LSTMLayer的forward函数中,涉及到x、y_prev、self.w和self.v之间的矩阵乘法,维度不匹配导致报错。你需要确保传入forward函数的x和y_prev的维度与self.w和self.v的维度匹配。

    2. LSTMLayer的初始化问题: 在初始化LSTMLayer时,你使用了以下代码:

      InputLayers = [LSTMLayer(window_size, n_mid)] * figures_size
      DenseLayers = [LSTMLayer(n_mid, n_mid),OutputLayer(n_mid, n_out)]
      

      这种方式将第一个LSTMLayer的实例复制了figures_size次,这样会导致每个InputLayer都共享相同的权重,可能会导致结果不正确。你可以改为使用循环来创建不同的LSTMLayer实例。

    解决方案如下:

    1. 检查数据维度是否匹配,确保传入forward函数的x和y_prev的维度与self.w和self.v的维度匹配。

    2. 修改LSTMLayer的初始化部分,确保每个InputLayer都是一个独立的实例。代码示例如下:

      InputLayers = []
      for _ in range(figures_size):
          InputLayers.append(LSTMLayer(window_size, n_mid))
      DenseLayers = [LSTMLayer(n_mid, n_mid),OutputLayer(n_mid, n_out)]
      

    希望以上解决方案对你有帮助!如果还有其他问题,请继续追问。

    评论

报告相同问题?

问题事件

  • 创建了问题 3月13日

悬赏问题

  • ¥15 单纯型python实现编译报错
  • ¥15 c++2013读写oracle
  • ¥15 c++ gmssl sm2验签demo
  • ¥15 关于模的完全剩余系(关键词-数学方法)
  • ¥15 有没有人懂这个博图程序怎么写,还要跟SFB连接,真的不会,求帮助
  • ¥15 PVE8.2.7无法成功使用a5000的vGPU,什么原因
  • ¥15 is not in the mmseg::model registry。报错,模型注册表找不到自定义模块。
  • ¥15 安装quartus II18.1时弹出此error,怎么解决?
  • ¥15 keil官网下载psn序列号在哪
  • ¥15 想用adb命令做一个通话软件,播放录音