我想用 VGG16
模型来对RAVDESS视频_歌曲数据集进行分类。为了做到这一点,我从每个视频中每秒提取3帧。然后,我使用InceptionV3从这些帧中提取特征,将其保存到csv文件中。现在,我试图训练一个模型,根据给定的输入来预测情绪。
我使用的是 train_test_split
来将我的数据分成随机的训练和测试子集。
p_x_train, p_x_test, p_y_train, p_y_test = train_test_split(deep_features_csv, emotion_classes_csv, test_size=.3, random_state=42, stratify=emotion_classes_csv)
x_train = preprocess_input(p_x_train.values)
x_test = preprocess_input(p_x_test.values)
y_train = preprocess_input(p_y_train.values)
y_test = preprocess_input(p_y_test.values)
在这之后,我建立了我的模型,在这种情况下是VGG16,并尝试着去适应它。
emotions = { 0: "neutral", 1: "calm", 2: "happy", 3: "sad", 4: "angry", 5: "fearful" }
num_classes = len(emotions)
input_tensor = Input(shape=x_train[0].shape, name='input_tensor')
vgg16 = VGG16(weights='imagenet', include_top=False)
vgg16.trainable = False
x = tf.keras.layers.Flatten(name='flatten')(vgg16)
x = tf.keras.layers.Dense(512, activation='relu', name='fc1')(vgg16)
x = tf.keras.layers.Dense(512, activation='relu', name='fc2')(x)
x = tf.keras.layers.Dense(10, activation='softmax', name='predictions')(x)
new_model = tf.keras.models.Model(inputs=vgg16.input, outputs=x)
new_model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
hist_vgg16 = new_model.fit(x_train, y_train,
batch_size = 32,
epochs = 50,
verbose = 1,
validation_data = (x_test, y_test)
)
这个模型的形状 x_train[0]
是 (2048,)
.
我在(google colab)[colab.research.google.com]上运行这个代码,这就是我得到的错误。
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-30-311ade600318> in <module>()
8 vgg16.trainable = False
9
---> 10 x = tf.keras.layers.Flatten(name='flatten')(vgg16)
11 x = tf.keras.layers.Dense(512, activation='relu', name='fc1')(vgg16)
12 x = tf.keras.layers.Dense(512, activation='relu', name='fc2')(x)
2 frames
/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/input_spec.py in assert_input_compatibility(input_spec, inputs, layer_name)
164 spec.min_ndim is not None or
165 spec.max_ndim is not None):
--> 166 if x.shape.ndims is None:
167 raise ValueError('Input ' + str(input_index) + ' of layer ' +
168 layer_name + ' is incompatible with the layer: '
AttributeError: 'Model' object has no attribute 'shape'
谁能帮帮我?
问题是在错误行中,你引入了VGG16模型作为输入,而你想要的是引入最后一层的输出,对吗?
所以,你应该修改下一行。
x = tf.keras.layers.Flatten(name='flatten')(vgg16.output)
x = tf.keras.layers.Dense(512, activation='relu', name='fc1')(x) #I suppose the input of this layer, is the output of Flatten
还有一件事,你的input_tensor似乎没有被使用,我说错了吗? 是你的vgg16的输入还是你想要一个多输入模型?
如果你的input_tensor是vgg16的输入,所以你要改。
vgg16 = VGG16(input_tensor=input_tensor, weights='imagenet', include_top=False)