基于CNN实现CIFAR100识别-tensorflow2.0实现
生活随笔
收集整理的這篇文章主要介紹了
基于CNN实现CIFAR100识别-tensorflow2.0实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
CIFAR100與mnist數據集一樣,但是復雜一些,基于CNN對CIFAR100實現的原理與對mnist的操作大同小異,程序所采用的CNN網絡為13層的VGG網絡。
經過網絡處理過程如下所示:
代碼如下:
import tensorflow as tf from tensorflow.keras import layers, optimizers, datasets, Sequential import osos.environ['TF_CPP_MIN_LOG_LEVEL']='2' tf.random.set_seed(2345) #卷積層+池化層 conv_layers = [ # 5 units of conv + max pooling# unit 1layers.Conv2D(64, kernel_size=[3, 3], padding="same", activation=tf.nn.relu),layers.Conv2D(64, kernel_size=[3, 3], padding="same", activation=tf.nn.relu),layers.MaxPool2D(pool_size=[2, 2], strides=2, padding='same'),# unit 2layers.Conv2D(128, kernel_size=[3, 3], padding="same", activation=tf.nn.relu),layers.Conv2D(128, kernel_size=[3, 3], padding="same", activation=tf.nn.relu),layers.MaxPool2D(pool_size=[2, 2], strides=2, padding='same'),# unit 3layers.Conv2D(256, kernel_size=[3, 3], padding="same", activation=tf.nn.relu),layers.Conv2D(256, kernel_size=[3, 3], padding="same", activation=tf.nn.relu),layers.MaxPool2D(pool_size=[2, 2], strides=2, padding='same'),# unit 4layers.Conv2D(512, kernel_size=[3, 3], padding="same", activation=tf.nn.relu),layers.Conv2D(512, kernel_size=[3, 3], padding="same", activation=tf.nn.relu),layers.MaxPool2D(pool_size=[2, 2], strides=2, padding='same'),# unit 5layers.Conv2D(512, kernel_size=[3, 3], padding="same", activation=tf.nn.relu),layers.Conv2D(512, kernel_size=[3, 3], padding="same", activation=tf.nn.relu),layers.MaxPool2D(pool_size=[2, 2], strides=2, padding='same') ] #對輸入圖片進行數據預處理 def preprocess(x, y):# [0~1]x = tf.cast(x, dtype=tf.float32) / 255.#在0~1之間y = tf.cast(y, dtype=tf.int32)return x,y(x,y), (x_test, y_test) = datasets.cifar100.load_data() y = tf.squeeze(y, axis=1)#y一開始并不是一個維度,所以需要把第二個維度擠壓掉。 y_test = tf.squeeze(y_test, axis=1)train_db = tf.data.Dataset.from_tensor_slices((x,y)) train_db = train_db.shuffle(1000).map(preprocess).batch(128)test_db = tf.data.Dataset.from_tensor_slices((x_test,y_test)) test_db = test_db.map(preprocess).batch(64)def main():# [b, 32, 32, 3] => [b, 1, 1, 512]conv_net = Sequential(conv_layers)#全連接層fc_net = Sequential([layers.Dense(256, activation=tf.nn.relu),layers.Dense(128, activation=tf.nn.relu),layers.Dense(100, activation=None),])conv_net.build(input_shape=[None, 32, 32, 3])fc_net.build(input_shape=[None, 512])#學習率optimizer = optimizers.Adam(lr=1e-4)# [1, 2] + [3, 4] => [1, 2, 3, 4]variables = conv_net.trainable_variables + fc_net.trainable_variablesfor epoch in range(50):for step, (x,y) in enumerate(train_db):with tf.GradientTape() as tape:# [b, 32, 32, 3] => [b, 1, 1, 512]out = conv_net(x)# flatten, => [b, 512]out = tf.reshape(out, [-1, 512])# [b, 512] => [b, 100]logits = fc_net(out)# [b] => [b, 100]y_onehot = tf.one_hot(y, depth=100)# compute lossloss = tf.losses.categorical_crossentropy(y_onehot, logits, from_logits=True)loss = tf.reduce_mean(loss)grads = tape.gradient(loss, variables)optimizer.apply_gradients(zip(grads, variables))if step %100 == 0:print(epoch, step, 'loss:', float(loss))total_num = 0total_correct = 0for x,y in test_db:out = conv_net(x)out = tf.reshape(out, [-1, 512])logits = fc_net(out)prob = tf.nn.softmax(logits, axis=1)pred = tf.argmax(prob, axis=1)pred = tf.cast(pred, dtype=tf.int32)correct = tf.cast(tf.equal(pred, y), dtype=tf.int32)correct = tf.reduce_sum(correct)total_num += x.shape[0]total_correct += int(correct)acc = total_correct / total_numprint(epoch, 'acc:', acc) if __name__ == '__main__':main()最終的訓練模型對于測試集的正確率并不是很高,而且訓練起來耗時比較嚴重,相比而言Mnist數據集訓練的效果和效率就特別高了。
總結
以上是生活随笔為你收集整理的基于CNN实现CIFAR100识别-tensorflow2.0实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Win10指纹识别功能怎么使用 Win1
- 下一篇: tar命令详解