我正在使用视频帧作为输入在 Keras+Tensorflow 中构建一个 CNN-LSTM 网络。我正在设置网络,如下所示:
import tensorflow as tf
import keras
import cv2
video = keras.layers.Input(shape=(None, 299,299,3),name='video_input')
cnn = keras.applications.InceptionV3(weights='imagenet',
include_top='False',
pooling='avg')
cnn.trainable = False
encoded_frame = keras.layers.TimeDistributed(cnn)(video)
encoded_vid = keras.layers.LSTM(256)(encoded_frame)
outputs = keras.layers.Dense(128, activation='relu')(encoded_vid)
一些张量属性如下:
video
<tf.Tensor 'video_input:0' shape=(?, ?, ?, 299, 299, 3) dtype=float32>
cnn.input
<tf.Tensor 'input_1:0' shape=(?, 299, 299, 3) dtype=float32>
cnn.output
<tf.Tensor 'predictions/Softmax:0' shape=(?, 1000) dtype=float32>
encoded_frame
<tf.Tensor 'time_distributed_1/Reshape_1:0' shape=(?, ?, 1000) dtype=float32>
encoded_vid
<tf.Tensor 'lstm_1/TensorArrayReadV3:0' shape=(?, 256) dtype=float32>
outputs
<tf.Tensor 'dense_1/Relu:0' shape=(?, 128) dtype=float32>
现在我建立模型并拟合数据:
model = keras.models.Model(inputs=[video],outputs=outputs)
model.compile(optimizer='adam',
loss='mean_squared_logarithmic_error')
# Generate random targets
y = np.random.random(size=(128,))
y = np.reshape(y,(-1,128))
model.fit(x=frame_sequence, y=y, validation_split=0.0,shuffle=False, batch_size=1)
其中frame_sequence
是来自一个视频的一系列视频帧:
frame_sequence.shape
(1, 48, 299, 299, 3)
一切似乎都到了训练步骤model.fit
,我得到一个归因input_1
于 InceptionV3 模型输入中占位符的错误:
InvalidArgumentError (see above for traceback): You must feed a value for placeholder tensor 'input_1' with dtype float
[[Node: input_1 = Placeholder[dtype=DT_FLOAT, shape=[], _device="/job:localhost/replica:0/task:0/cpu:0"]()]]
我在 Keras 中的哪里输入值,input_1
或者在设置网络时我哪里出错了?
更新:如果我从头开始构建我的 CNN,或者如果我使用 VGG 而不是加载 InceptionV3,则训练不会出错。例如,将 InceptionV3 替换为:
cnn = Sequential()
cnn.add(Conv2D(64, (3, 3), activation='relu', padding='same', input_shape=(229, 229, 3)))
cnn.add(Conv2D(64, (3, 3), activation='relu'))
cnn.add(MaxPooling2D((2, 2)))
cnn.add(Conv2D(128, (3, 3), activation='relu', padding='same'))
cnn.add(Conv2D(128, (3, 3), activation='relu'))
cnn.add(MaxPooling2D((2, 2)))
cnn.add(Conv2D(256, (3, 3), activation='relu', padding='same'))
cnn.add(Conv2D(256, (3, 3), activation='relu'))
cnn.add(Conv2D(256, (3, 3), activation='relu'))
cnn.add(MaxPooling2D((2, 2)))
cnn.add(Flatten())
这是重现错误的最小示例。