如何解决TimeDistributed 层应用几个卷积层 error
我有 tf.keras.layers.TimeDistributed 层 (https://www.tensorflow.org/api_docs/python/tf/keras/layers/TimeDistributed) 的问题。
我知道 TimeDistributed 可用于将单层(密集、卷积...)应用于一组输入,获得一组输出。
不仅如此,直到最近我才能够使用它来将整个“子模型”应用于所有输入。也就是说,一系列的层,而不仅仅是一个。 Patrice Ferlet (https://medium.com/smileinnovation/training-neural-network-with-image-sequence-an-example-with-video-as-input-c3407f7a0b0f) 在此处解释了一个示例。
以该源代码为例,我可以像这样定义一个连续的“子模型”:
import keras
from keras.layers import Conv2D,BatchNormalization,\
MaxPool2D,GlobalMaxPool2D
def build_convnet(shape=(112,112,3)):
momentum = .9
model = keras.Sequential()
model.add(Conv2D(64,(3,3),input_shape=shape,padding='same',activation='relu'))
model.add(Conv2D(64,activation='relu'))
model.add(BatchNormalization(momentum=momentum))
model.add(MaxPool2D())
model.add(Conv2D(128,activation='relu'))
model.add(Conv2D(128,activation='relu'))
model.add(BatchNormalization(momentum=momentum))
model.add(MaxPool2D())
model.add(Conv2D(256,activation='relu'))
model.add(Conv2D(256,activation='relu'))
model.add(BatchNormalization(momentum=momentum))
model.add(MaxPool2D())
model.add(Conv2D(512,activation='relu'))
model.add(Conv2D(512,activation='relu'))
model.add(BatchNormalization(momentum=momentum))
# flatten...
model.add(GlobalMaxPool2D())
return model
然后将此子模型包含在一个高级模型中,该模型使用整个初始子模型 (convnet) 调用 TimeDistributed。
from keras.layers import TimeDistributed,GRU,Dense,Dropout
def action_model(shape=(5,nbout=3):
# Create our convnet with (112,3) input shape
convnet = build_convnet(shape[1:])
# then create our final model
model = keras.Sequential()
# add the convnet with (5,3) shape
model.add(TimeDistributed(convnet,input_shape=shape))
# here,you can also use GRU or LSTM
model.add(GRU(64))
# and finally,we make a decision network
model.add(Dense(1024,activation='relu'))
model.add(Dropout(.5))
model.add(Dense(512,activation='relu'))
model.add(Dropout(.5))
model.add(Dense(128,activation='relu'))
model.add(Dropout(.5))
model.add(Dense(64,activation='relu'))
model.add(Dense(nbout,activation='softmax'))
return model
现在效果很好,我可以调用模型结构
mod=action_model()
mod.summary()
但是,如果我使用来自 keras 的预定义架构(例如 VGG16)作为主干来定义 convnet 模型,则似乎存在错误。 (我还需要通过 tf.keras.models.Sequential 更改 keras.Sequential)
import tensorflow as tf
from keras.layers import Flatten
def build_convnet():
prevModel = tf.keras.applications.vgg16.VGG16(
include_top=False,input_shape=(112,weights='imagenet' # ImageNet weights
)
model = tf.keras.models.Sequential()
model.add(prevModel)
model.add(Flatten())
return model
def action_model(shape=(5,3) input shape
convnet = build_convnet()
# then create our final model
model = tf.keras.models.Sequential()
# add the convnet with (5,activation='softmax'))
return model
当我在定义基于 VGG16 的架构后运行它时
mod=action_model()
mod.summary()
我收到以下错误:
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-106-c8c6108a1d66> in <module>()
----> 1 mod=action_model()
2 mod.summary()
1 frames
/usr/local/lib/python3.7/dist-packages/keras/layers/wrappers.py in __init__(self,layer,**kwargs)
121 'Please initialize `TimeDistributed` layer with a '
122 '`tf.keras.layers.Layer` instance. You passed: {input}'.format(
--> 123 input=layer))
124 super(TimeDistributed,self).__init__(layer,**kwargs)
125 self.supports_masking = True
ValueError: Please initialize `TimeDistributed` layer with a `tf.keras.layers.Layer` instance. You passed: <tensorflow.python.keras.engine.sequential.Sequential object at 0x7fbb36266a50>
所以现在看来 python 是在抱怨我使用的不是单层的 TimeDistributed 输入。这没有任何意义,因为初始示例运行良好,并且还涉及使用 TimeDistributed 的多个层。除此之外,几周前 VGG16 模型也运行良好。
我在 Google CoLab 中运行所有这些。
有人能帮我弄清楚这里发生了什么吗?这是由新的 tensorflow 2.5.0 版本引起的吗?我到处都能看到人们使用 TimeDistributed 来应用单个层,但到目前为止,应用整个顺序模型的效果还不错(尽管文档中没有明显提及)。
谢谢!
解决方法
您得到上述 ValueError 是由于混合了 tf.keras
和 keras
导入,而 TF2.5
不支持。
工作代码如下图
import tensorflow as tf
#from keras.layers import TimeDistributed,GRU,Dense,Dropout
from tensorflow.keras.layers import Flatten,Dropout,TimeDistributed,Dense
def build_convnet():
prevModel = tf.keras.applications.vgg16.VGG16(
include_top=False,input_shape=(112,112,3),weights='imagenet' # ImageNet weights
)
model = tf.keras.models.Sequential()
model.add(prevModel)
model.add(Flatten())
return model
def action_model(shape=(5,nbout=3):
# Create our convnet with (112,3) input shape
convnet = build_convnet()
# then create our final model
model = tf.keras.models.Sequential()
# add the convnet with (5,3) shape
model.add(TimeDistributed(convnet,input_shape=shape))
# here,you can also use GRU or LSTM
model.add(GRU(64))
# and finally,we make a decision network
model.add(Dense(1024,activation='relu'))
model.add(Dropout(.5))
model.add(Dense(512,activation='relu'))
model.add(Dropout(.5))
model.add(Dense(128,activation='relu'))
model.add(Dropout(.5))
model.add(Dense(64,activation='relu'))
model.add(Dense(nbout,activation='softmax'))
return model
mod=action_model()
mod.summary()
输出:
Model: "sequential_3"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
time_distributed_1 (TimeDist (None,5,4608) 14714688
_________________________________________________________________
gru_1 (GRU) (None,64) 897408
_________________________________________________________________
dense (Dense) (None,1024) 66560
_________________________________________________________________
dropout (Dropout) (None,1024) 0
_________________________________________________________________
dense_1 (Dense) (None,512) 524800
_________________________________________________________________
dropout_1 (Dropout) (None,512) 0
_________________________________________________________________
dense_2 (Dense) (None,128) 65664
_________________________________________________________________
dropout_2 (Dropout) (None,128) 0
_________________________________________________________________
dense_3 (Dense) (None,64) 8256
_________________________________________________________________
dense_4 (Dense) (None,3) 195
=================================================================
Total params: 16,277,571
Trainable params: 16,571
Non-trainable params: 0
_________________________________________________________________
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。