BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / ml-dm / #22265同步于 2016/12/28
该镜像源已超过 30 天没有更新,可能在源站已被删除。
ML_DM机器人发帖

【问题】Keras 泛型模型 如何实现类似“串并联”网络

Richard1024
2016/12/28镜像同步5 回复
比如 https://keras-cn.readthedocs.io/en/latest/getting_started/functional_API/#_7 视频问答模型中利用视觉问答模型,如第二行代码 ``` video_input = Input(shape=(100, 3, 224, 224)) # this is our video encoded via the previously trained vision_model (weights are reused) encoded_frame_sequence = TimeDistributed(vision_model)(video_input) # the output will be a sequence of vectors encoded_video = LSTM(256)(encoded_frame_sequence) # the output will be a vector ``` 例子中做视频问答,直接引用了先前做图片识别的模型vision_model,有没有可能让vision_model的参数在大网络中可以继续更新? 因为考虑直接利用训练好的model进来,也会将误差导入,使这个要重用的小model在整个网络中训练的话,结果会不会好点? #### 转化成通俗的问题就是:如何在一个大的网络中在其并联支路上重复使用某个model模块?
订阅后,新回复会通过你的通知中心匿名送达。
5 条回复
silvermoon机器人#1 · 2016/12/28
要不要训练某个部分,可以通过设定trainable的flag,范例如下: https://keras.io/getting-started/faq/#how-can-i-freeze-keras-layers 如何使用某个pretrained model中某个layer的weight,可以读取hdf5来实现,相关issue如下: https://github.com/fchollet/keras/issues/1873
Richard1024机器人#2 · 2016/12/28
跟这个还不太一样,我没把问题说清。是这样的,像视频识别中提出的这个LRCN模型,如下图最左边。 http://jeffdonahue.com/lrcn/images/lrcn_tasks.png 就是一帧帧的图像分别进入CNN,然后将这多帧的输出又是一个序列就进入了LSTM中,像Keras如何实现这种有多个支路并联而且都是这些支路都是重复使用的模型(这些支路上的参数应该也一样)?比如视频有50帧,每一帧分别进入CNN(或者这块儿会是更复杂的模型,后边也都用CNN指代)特征提取,然后这50个特征序列再进入LSTM,用keras该如何描述? 我先前是这样想的:假设图片大小是(100,100),每次输入就是50帧,既然针对每帧图像的处理方法都是一样的,那么用一个CNN来依次处理这个序列中的图像结果应该一样,所以利用泛型模型 ``` inputs=Input (shape=(50,1,100,100)) # 假定就都是单通道的照片 #然后输入CNN cn_1=Convolution2D(64,5,5,border_mode='same')(inputs) cn_2=Convolution2D(64,5,5,border_mode='same')(cn_1) ``` 此时输出应该是(50,64,100,100),然后 reshape(1,cn2.output_shape[0],-1)#这不知该如何写使其也能作为tensor返回 整合成了一个序列,进入LSTM,分类,一条例子训练结束。 然后自己循环实现 这样模拟网络中的串并联合理么?这种模型keras的例子感觉很少啊
silvermoon机器人#3 · 2016/12/28
按我对LSTM的理解,这里看起来很多并联CNN,但实际上只有一个,你就一张张组成seq进去就好。不过我也没有玩过CNN+LSTM,不确定是否可行。按理说,LSTM的loss是可以传回去的。
Richard1024机器人#4 · 2016/12/29
再请教下哈,keras不太关注examples的大小,如果泛型模型中最开始定义的inputs=Input(shape=(100,2,3)),并且想让每次训练的输入就是这样的3维数据,这样在模型内部就可以充分利用第一个参数的位置,从而做出更多转换。那么就不能用fit(),又该如何训练呢,也试过fit_generator(),并设置samples_per_epoch=1,按理说每次输入的就是一条记录(x,y)了啊,其中x就是如上的3维数据,但是总说实际输入的ndim比期望的要多1,是不是Input中声明的shape也等于(None,100,2,3)这样? 囿于接口参数中都有sample的限制 ,感觉做不动了。。。 【 在 silvermoon 的大作中提到: 】 : 按我对LSTM的理解,这里看起来很多并联CNN,但实际上只有一个,你就一张张组成seq进去就好。不过我也没有玩过CNN+LSTM,不确定是否可行。按理说,LSTM的loss是可以传回去的。
silvermoon机器人#5 · 2016/12/30
我不是很理解你说的情况,如果你是想随意改变seq的窗口大小,可能用fit_generator加些处理会比较好。