用tensorflow和源代码实现的,但是因为是参考着参考书写的,在传入自己的数据之后,数据维度方面有很大问题,麻烦大家看看
以下是我的数据维度:
传入时格式设置如下:
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)
有哪位神人可以帮帮我吗 谢谢🥹