tensorflow--cifar10数据集

2020-06-09  本文已影响0人  tu7jako

Cifar10数据集有6w张图片,每张图片有32行32列像素点的红绿蓝三通道数据,其中5w张十分类彩色图片用于训练,1w张用于测试。
十分类分别是:


cifar10.png

导入数据集:

cifar10 = tf.keras.datasets.cifar10
(x_train, y_train), (x_test, y_test) = cifar10.load_data()

搭建一个一层卷积、两侧全连接的网络来训练cifar10数据集:

import tensorflow as tf
from tensorflow.keras import Model
from tensorflow.keras.layers import Conv2D, BatchNormalization, 
    Activation, MaxPool2D, Dropout, Flatten, Dense
import matplotlib.pyplot as plt

import os


# 加载数据集
cifar10 = tf.keras.datasets.cifar10
(x_train, y_train), (x_test, y_test) = cifar10.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0

#  构建神经网路
class BaseLine(Model):
    def __init__(self):
        super(BaseLine, self).__init__()
        #  一层卷积(CBAPD)
        self.c1 = Conv2D(filters=6, kernel_size=(5, 5), padding="same")
        self.b1 = BatchNormalization()
        self.a1 = Activation("relu")
        self.p1 = MaxPool2D(pool_size=(2, 2), strides=2, padding="same")
        self.d1 = Dropout(0.2)

        # 两层全连接
        self.flatten = Flatten()
        self.f1 = Dense(128, activation="relu")
        self.d2 = Dropout(0.2)
        self.f2 = Dense(10, activation="softmax")

    # 完成神经网路的前向传播
    def call(self, x):
        x = self.c1(x)
        x = self.b1(x)
        x = self.a1(x)
        x = self.p1(x)
        x = self.d1(x)
        x = self.flatten(x)
        x = self.f1(x)
        x = self.d2(x)
        y = self.f2(x)
        return y


model = BaseLine()

# 配置训练方法
model.compile(
    optimizer="adam",
    loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),
    metrics=["sparse_categorical_accuracy"]
)

# 断点续训,读取模型
checkpoint_save_path = "cifar10/BaseLine.ckpt"
if os.path.exists(checkpoint_save_path + ".index"):
    print("*******load the model******")
    model.load_weights(checkpoint_save_path)
cp_callback = tf.keras.callbacks.ModelCheckpoint(
    filepath=checkpoint_save_path,
    save_weights_only=True,
    save_best_only=True
)

# 训练模型
history = model.fit(x_train, y_train, batch_size=32, epochs=5, validation_data=(x_test, y_test),
                    validation_freq=1, callbacks=[cp_callback])

# 打印网络结构和参数
model.summary()

# 写入参数
with open("cifar10_weights.txt", "w") as f:
    for v in model.trainable_variables:
        f.write(str(v.name) + "\n")
        f.write(str(v.shape) + "\n")
        f.write(str(v.numpy()) + "\n")


# 显示训练和预测的acc、loss曲线
acc = history.history["sparse_categorical_accuracy"]
val_acc = history.history["val_sparse_categorical_accuracy"]
loss = history.history["loss"]
val_loss = history.history["val_loss"]
plt.subplot(1, 2, 1)
plt.plot(acc, label="train acc")
plt.plot(val_acc, label="validation acc")
plt.title("train & validation acc")
plt.legend()
plt.subplot(1, 2, 2)
plt.plot(loss, label="train loss")
plt.plot(val_loss, label="validation loss")
plt.title("train & validation loss")
plt.legend()
plt.show()

打印结果:(有省略)

_________________________________________________________________
flatten (Flatten)            multiple                  0         
_________________________________________________________________
dense (Dense)                multiple                  196736    
_________________________________________________________________
dropout_1 (Dropout)          multiple                  0         
_________________________________________________________________
dense_1 (Dense)              multiple                  1290      
=================================================================
Total params: 198,506
Trainable params: 198,494
Non-trainable params: 12

绘图结果:


myplot.png
上一篇下一篇

猜你喜欢

热点阅读