用python搭建VGG16模型对莺尾花进行识别
时间: 2023-11-27 12:52:42 浏览: 38
好的,我们可以使用Python中的Keras库来搭建VGG16模型,并使用莺尾花数据集来训练和测试模型。
首先,我们需要安装Keras库和莺尾花数据集:
```
!pip install keras
!pip install tensorflow
!pip install sklearn
!pip install matplotlib
!pip install seaborn
```
接下来,我们导入所需的库和数据集:
```python
from keras.models import Sequential
from keras.layers import Dense, Flatten, Dropout
from keras.layers.convolutional import Conv2D, MaxPooling2D
from keras.optimizers import SGD
from keras.utils import np_utils
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# 加载莺尾花数据集
iris = load_iris()
X, y = iris.data, iris.target
# 将类标签转换为分类矩阵
y = np_utils.to_categorical(y, 3)
# 将数据集拆分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
```
接下来,我们定义VGG16模型:
```python
model = Sequential()
# 第一层卷积层
model.add(Conv2D(64, (3,3), input_shape=(4,1,1), activation='relu', padding='same'))
model.add(Conv2D(64, (3,3), activation='relu', padding='same'))
model.add(MaxPooling2D(pool_size=(2,2), strides=(2,2)))
# 第二层卷积层
model.add(Conv2D(128, (3,3), activation='relu', padding='same'))
model.add(Conv2D(128, (3,3), activation='relu', padding='same'))
model.add(MaxPooling2D(pool_size=(2,2), strides=(2,2)))
# 第三层卷积层
model.add(Conv2D(256, (3,3), activation='relu', padding='same'))
model.add(Conv2D(256, (3,3), activation='relu', padding='same'))
model.add(Conv2D(256, (3,3), activation='relu', padding='same'))
model.add(MaxPooling2D(pool_size=(2,2), strides=(2,2)))
# 第四层卷积层
model.add(Conv2D(512, (3,3), activation='relu', padding='same'))
model.add(Conv2D(512, (3,3), activation='relu', padding='same'))
model.add(Conv2D(512, (3,3), activation='relu', padding='same'))
model.add(MaxPooling2D(pool_size=(2,2), strides=(2,2)))
# 第五层卷积层
model.add(Conv2D(512, (3,3), activation='relu', padding='same'))
model.add(Conv2D(512, (3,3), activation='relu', padding='same'))
model.add(Conv2D(512, (3,3), activation='relu', padding='same'))
model.add(MaxPooling2D(pool_size=(2,2), strides=(2,2)))
# 全连接层
model.add(Flatten())
model.add(Dense(4096, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(4096, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(3, activation='softmax'))
# 编译模型
sgd = SGD(lr=0.1, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy'])
```
最后,我们训练和评估模型:
```python
# 训练模型
history = model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=100, batch_size=32)
# 评估模型
score = model.evaluate(X_test, y_test, verbose=0)
# 输出结果
print('Test loss:', score[0])
print('Test accuracy:', score[1])
# 绘制训练和验证损失
sns.set()
plt.plot(history.history['loss'], label='train')
plt.plot(history.history['val_loss'], label='test')
plt.legend()
plt.show()
```
完成后,我们可以看到模型的训练和测试准确率。