TensorFlow2利用Cifar10数据集实现卷积神经网络

1. 导入所需的库

import tensorflow as tf
import matplotlib.pyplot as plt

for i in [tf]:
    print(i.__name__,": ",i.__version__,sep="")

输出:

tensorflow: 2.2.0

2. 下载并导入数据cifar10数据集

(train_images, train_labels),(test_images, test_labels) = tf.keras.datasets.cifar10.load_data()
train_images, test_images = train_images/255.0, test_images/255.0

for i in [train_images, train_labels, test_images, test_labels]:
    print(i.shape)

输出:

(50000, 32, 32, 3)
(50000, 1)
(10000, 32, 32, 3)
(10000, 1)

3. 展示数据

class_names = ["airplane","automobile","bird","cat","deer","dog","frog","horse","ship","truck"]

plt.figure(figsize=(10,10))
for i in range(25):
    plt.subplot(5,5,i+1)
    plt.xticks([])
    plt.yticks([])
    plt.grid(False)
    plt.imshow(train_images[i],cmap=plt.cm.binary)
    plt.xlabel(class_names[train_labels[i][0]])
plt.show()

输出:

4. 构建网络模型

将一定数量的卷积层和池化层堆叠在一起,最后加上全连接层,就形成了经典的卷积神经网络。

注意:卷积神经网络的输入格式为:[batch_size, height, width, channels]

model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Conv2D(32,(3,3),activation="relu",input_shape=(32,32,3)))
model.add(tf.keras.layers.MaxPooling2D((2,2)))
model.add(tf.keras.layers.Conv2D(64,(3,3),activation="relu"))
model.add(tf.keras.layers.MaxPooling2D((2,2)))
model.add(tf.keras.layers.Conv2D(64,(3,3),activation="relu"))

model.add(tf.keras.layers.Flatten())
model.add(tf.keras.layers.Dense(64, activation="relu"))
model.add(tf.keras.layers.Dense(10))

model.summary()

输出:

Model: "sequential_1"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d (Conv2D)              (None, 30, 30, 32)        896       
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 15, 15, 32)        0         
_________________________________________________________________
conv2d_1 (Conv2D)            (None, 13, 13, 64)        18496     
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 6, 6, 64)          0         
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 4, 4, 64)          36928     
_________________________________________________________________
flatten (Flatten)            (None, 1024)              0         
_________________________________________________________________
dense (Dense)                (None, 64)                65600     
_________________________________________________________________
dense_1 (Dense)              (None, 10)                650       
=================================================================
Total params: 122,570
Trainable params: 122,570
Non-trainable params: 0
_________________________________________________________________

5. 编译并训练模型

model.compile(optimizer="adam",
             loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
             metrics=["accuracy"])

history = model.fit(train_images, train_labels, epochs=20,
                    validation_data=(test_images, test_labels))

输出:

Epoch 1/20
1563/1563 [==============================] - 8s 5ms/step - loss: 0.5518 - accuracy: 0.8050 - val_loss: 0.9361 - val_accuracy: 0.7016
Epoch 2/20
1563/1563 [==============================] - 8s 5ms/step - loss: 0.5153 - accuracy: 0.8189 - val_loss: 0.9369 - val_accuracy: 0.7082
Epoch 3/20
1563/1563 [==============================] - 8s 5ms/step - loss: 0.4857 - accuracy: 0.8282 - val_loss: 0.9817 - val_accuracy: 0.7086
Epoch 4/20
1563/1563 [==============================] - 8s 5ms/step - loss: 0.4478 - accuracy: 0.8412 - val_loss: 1.0160 - val_accuracy: 0.7084
Epoch 5/20
1563/1563 [==============================] - 8s 5ms/step - loss: 0.4194 - accuracy: 0.8496 - val_loss: 1.0763 - val_accuracy: 0.6965
Epoch 6/20
1563/1563 [==============================] - 8s 5ms/step - loss: 0.3917 - accuracy: 0.8594 - val_loss: 1.1418 - val_accuracy: 0.6911
Epoch 7/20
1563/1563 [==============================] - 8s 5ms/step - loss: 0.3643 - accuracy: 0.8701 - val_loss: 1.1781 - val_accuracy: 0.6978
Epoch 8/20
1563/1563 [==============================] - 8s 5ms/step - loss: 0.3469 - accuracy: 0.8761 - val_loss: 1.2179 - val_accuracy: 0.6875
Epoch 9/20
1563/1563 [==============================] - 8s 5ms/step - loss: 0.3228 - accuracy: 0.8845 - val_loss: 1.2916 - val_accuracy: 0.6938
Epoch 10/20
1563/1563 [==============================] - 8s 5ms/step - loss: 0.3012 - accuracy: 0.8906 - val_loss: 1.3111 - val_accuracy: 0.6903
Epoch 11/20
1563/1563 [==============================] - 7s 5ms/step - loss: 0.2833 - accuracy: 0.8979 - val_loss: 1.3923 - val_accuracy: 0.6916
Epoch 12/20
1563/1563 [==============================] - 8s 5ms/step - loss: 0.2600 - accuracy: 0.9057 - val_loss: 1.4629 - val_accuracy: 0.6849
Epoch 13/20
1563/1563 [==============================] - 8s 5ms/step - loss: 0.2488 - accuracy: 0.9084 - val_loss: 1.5491 - val_accuracy: 0.6860
Epoch 14/20
1563/1563 [==============================] - 8s 5ms/step - loss: 0.2367 - accuracy: 0.9132 - val_loss: 1.5958 - val_accuracy: 0.6779
Epoch 15/20
1563/1563 [==============================] - 8s 5ms/step - loss: 0.2197 - accuracy: 0.9207 - val_loss: 1.5827 - val_accuracy: 0.6848
Epoch 16/20
1563/1563 [==============================] - 8s 5ms/step - loss: 0.2120 - accuracy: 0.9240 - val_loss: 1.7106 - val_accuracy: 0.6784
Epoch 17/20
1563/1563 [==============================] - 8s 5ms/step - loss: 0.2015 - accuracy: 0.9275 - val_loss: 1.7326 - val_accuracy: 0.6799
Epoch 18/20
1563/1563 [==============================] - 8s 5ms/step - loss: 0.1852 - accuracy: 0.9324 - val_loss: 1.8658 - val_accuracy: 0.6809
Epoch 19/20
1563/1563 [==============================] - 8s 5ms/step - loss: 0.1849 - accuracy: 0.9322 - val_loss: 2.0047 - val_accuracy: 0.6689
Epoch 20/20
1563/1563 [==============================] - 8s 5ms/step - loss: 0.1734 - accuracy: 0.9380 - val_loss: 1.9625 - val_accuracy: 0.6820

6. 评估模型

plt.plot(history.history["accuracy"], label="accuracy")
plt.plot(history.history["val_accuracy"],label="val_accuracy")
plt.xlabel("Epoch")
plt.ylabel("Accuracy")
plt.ylim([0.0,1])
plt.legend()

test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=2)

输出:

313/313 - 1s - loss: 1.9625 - accuracy: 0.6820

print(test_acc)

输出:

0.6865000128746033

 

 

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值