编写GoogLeNet 网络,实现 CIFAR-10数据集的分类任务。
时间: 2023-12-14 22:38:50 浏览: 68
GoogLeNet是一个深度卷积神经网络,它在2014年ImageNet大规模视觉识别竞赛(ILSVRC)上获得了冠军。以下是一个使用GoogLeNet进行CIFAR-10分类任务的示例代码。
首先,我们需要导入必要的库:TensorFlow和Keras。
```python
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
```
然后,我们可以定义GoogLeNet网络。GoogLeNet由多个“Inception”模块组成,每个模块都有多个分支,包含不同大小的卷积和池化操作。下面是一个包含3个Inception模块的简单实现。
```python
def create_googlenet():
input_shape = (32, 32, 3)
# Input layer
inputs = keras.Input(shape=input_shape)
# First convolutional layer
x = layers.Conv2D(filters=64, kernel_size=7, strides=2, padding="same", activation="relu")(inputs)
x = layers.MaxPooling2D(pool_size=3, strides=2, padding="same")(x)
# First Inception module
x = inception_module(x, filters=[64, 96, 128, 16, 32, 32])
# Second Inception module
x = inception_module(x, filters=[128, 128, 192, 32, 96, 64])
x = layers.MaxPooling2D(pool_size=3, strides=2, padding="same")(x)
# Third Inception module
x = inception_module(x, filters=[192, 96, 208, 16, 48, 64])
# Output layer
x = layers.GlobalAveragePooling2D()(x)
outputs = layers.Dense(units=10, activation="softmax")(x)
# Create model
model = keras.Model(inputs=inputs, outputs=outputs, name="googlenet")
return model
```
Inception模块可以使用以下代码实现:
```python
def inception_module(inputs, filters):
f1, f3r, f3, f5r, f5, fp = filters
# 1x1 convolution branch
conv1 = layers.Conv2D(filters=f1, kernel_size=1, activation="relu")(inputs)
# 3x3 convolution branch
conv3r = layers.Conv2D(filters=f3r, kernel_size=1, activation="relu")(inputs)
conv3 = layers.Conv2D(filters=f3, kernel_size=3, padding="same", activation="relu")(conv3r)
# 5x5 convolution branch
conv5r = layers.Conv2D(filters=f5r, kernel_size=1, activation="relu")(inputs)
conv5 = layers.Conv2D(filters=f5, kernel_size=5, padding="same", activation="relu")(conv5r)
# Max pooling branch
pool = layers.MaxPooling2D(pool_size=3, strides=1, padding="same")(inputs)
pool_conv = layers.Conv2D(filters=fp, kernel_size=1, activation="relu")(pool)
# Concatenate branches
outputs = layers.Concatenate()([conv1, conv3, conv5, pool_conv])
return outputs
```
最后,我们可以编译和训练模型。
```python
# Load CIFAR-10 dataset
(x_train, y_train), (x_test, y_test) = keras.datasets.cifar10.load_data()
# Normalize pixel values
x_train = x_train.astype("float32") / 255.0
x_test = x_test.astype("float32") / 255.0
# Convert labels to one-hot vectors
y_train = keras.utils.to_categorical(y_train, 10)
y_test = keras.utils.to_categorical(y_test, 10)
# Create model
model = create_googlenet()
# Compile model
model.compile(loss="categorical_crossentropy", optimizer="adam", metrics=["accuracy"])
# Train model
model.fit(x_train, y_train, batch_size=128, epochs=50, validation_data=(x_test, y_test))
```
在训练完成后,我们可以使用以下代码评估模型的性能。
```python
# Evaluate model
test_loss, test_acc = model.evaluate(x_test, y_test)
print("Test accuracy:", test_acc)
```