keras中 shape参数如何设置

论坛 期权论坛 脚本     
已经匿名di用户   2022-4-13 16:42   2008   0

莫烦老师您好,我是你的课程的忠实听众。

看了你的TensorFlow及keras课程获益匪浅,但是有一个问题我一直在实际问题中困扰了好久。例如:

 1.  需要建立一个lstm的序列预测模型
 2.  x:为一个 1行3列的数组(1*3)  y为一个1*1 的数据
 3.  每次训练的时候 输入500组x,500组y

看了很多晚上的TensorFlow 及 keras的例子。发现对于这种问题不同人的输入方式不同。有些把(x,y)设置成(500,3,1; 500,1,1)。 但是有些设置的不一样,有时候会变成(500*3,1;500,1)

我根据咱们的keras教程设置后,报告错误:x 的(500*3*1)与y的shape不相同。 这个问题已经折磨我2个月了。

请问有没有一些通用的方法,或者规律来进行序列的参数形状设置呢? 因为每一个实际项目的x,y不尽相同,有时候y会变成一个n*m的矩阵。 如果没有一些通用的方法论的话,真的会郁闷死了~

希望莫烦老师能解答我的这个问题,或者专门出一期视频来讲解神经网络当中的x,y参数的设置技巧。太谢谢啦~~

最近我也在用keras,我说下我的理解:
你说了使用LSTM时序预测,那么肯定是用递归层,其输入输出格式为:

输入shape:形如(samples,timesteps,input_dim)的3D张量
输出shape:
1)如果return_sequences=True:返回形如(samples,timesteps,output_dim)的3D张量
2)否则,返回形如(samples,output_dim)的2D张量

你的输入输出为many to one,那么return_sequences=False,也就是输入x的shape为(500,3,1),输入y的shape为(500,1)

model = Sequential()
# LSTM layer
model.add(LSTM(input_shape=(3, 1),               #输入x的维度
                        output_dim = 5,          #隐藏层数量
                        return_sequences = False))
# dense layer
model.add(Dense(output_dim=1))                   #输出y的维度

1 关于many to one的问题

我对比了一下莫烦老师的rnn lstm的代码。 他的代码如下。

# build a LSTM RNN
model.add(LSTM(
    batch_input_shape=(BATCH_SIZE, TIME_STEPS, INPUT_SIZE),       # Or: input_dim=INPUT_SIZE, input_length=TIME_STEPS,
    output_dim=CELL_SIZE,
    return_sequences=True,      # True: output at all steps. False: output as last step.
    stateful=True,              # True: the final state of batch1 is feed into the initial state of batch2
))

我对比了一下你的代码。发下有一个问题:

LSTM()的参数设置里,莫烦老师用的是batch_input_shape, 或者是 input_dim。 你的例子当中用的是input_shape

那有一个小问题就是何时采用batch_input_shape ,何时采用input_shape,何时采用input_dim呢?

即我遇到问题和莫烦老师的区别就是,他的例子是说Time_Step是说每一个x就是一个1*1的矩阵,然后对应一个Y。即x1=(1),y1=(1); x2=(2) , y2=(2)...

如果time_step=20,即每一组x1,x2...x20,一次输入20个时间点的(x,y),然后让模型自己去找这20个时间点的(x,y)之间x1,x2,x3...x20y影响大小的参数。

但是我的问题是每一个x是 一个(1*3)的矩阵,即X1=(1,2,3),Y1=(1); X2=(4,5,6),Y2=(2) 那这样的话,如果time_step=20, batch_size=500,每次的矩阵大小应该是: batch_size*time_step*x.shape=500*20*3*1 这样子的话那该如何设置呢?

2 关于return_sequences的问题

return_sequences的意思,我查了一下手册,应该说的是是否每一个x对应一个y,如果为False则表示一个time_step的x只返回一个y. 那这个变量和stateful的区别又在哪里呢?

这几个问题一直困扰着我,因为实际问题当中,这几个弄不明白的话,我的模型总感觉和普通的regressor结果差了太多。甚至还没有朴素贝叶斯的结果好。

1.1 官方文档里面里面说明了以下3种写法是等价的:

model = Sequential()
model.add(LSTM(32, input_shape=(10, 64)))
model = Sequential()
model.add(LSTM(32, batch_input_shape=(None, 10, 64)))
model = Sequential()
model.add(LSTM(32, input_length=10, input_dim=64))

我使用input_shape是因为我在model.fit里面设置了batch_size参数,个人理解应该和直接设置batch_input_shape等价,不知道对不对

另外,你需要训练的数据一共500组,还是每次训练500组,这个是两个概率,batch_size的理解可以看下深度学习中的 Batch_Size

stateful,默认的也是 false,意义是批和批之间是否有联系。直观的理解就是我们在读完二十步,第21步开始是接着前面二十步的。也就是第一个 batch中的最后一步与第二个 batch 中的第一步之间是有联系的。

return_sequences:布尔值,默认False,控制返回类型。若为True则返回整个序列,否则仅返回输出序列的最后一个输出

对于return_sequences:如果return_sequences=True:返回形如(samples,timesteps,output_dim)的3D张量;否则,返回形如(samples,output_dim)的2D张量

莫烦老师的time_step的真实含义我现在有些混乱, 是以下2种方式的哪一种呢?:

  1. 如果time_step=3 表示的是说 x是一个(3,1)维的矩阵 即: x1=(1,2,3) x2=(2,3,4) 对应y1,y2?即 time_step表示的是x的数据维度。

  2. 如果time_step=3 表示的是说 x还是1维数据(x1=(1)), 但是建立模型的时候是用(x1,x2,x3) 对应一个y1?即 time_step 表示的是每次有X的三个lag 数据。 即 Xn, Xn-1, Xn-2。如果time_step是这种意思,那如果我的X 本身是一个 (3*1)的矩阵,即 X1=(1,2,3), 那当time_step=3的时候,input_shape 是不是应该等于 input_length=time_step*3, input_dim=1

请问正确的time_step理解方式应该是哪一种呢?

第二种,相当于就是用(Xn-2,Xn-1,Xn)预测Xn+1时刻的值。
如果Xn是3维,例如X1=(1,2,3),那么input_length=3, input_dim=3,前者表示time_step,后者表示数据维度

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:81
帖子:4969
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP