用tf搭建NN模型

用tf搭建NN模型

Mr.GGLS 464 2022-04-17

用tf搭建NN模型

环境准备

请看多元线性回归那篇

目标

训练一个NN来分类衣服种类(fashion mnist 数据集)

环境准备

打开jupyter notebook,导入下列环境

import tensorflow as tf
from tensorflow import keras
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import collections
%matplotlib inline

数据准备

# keras自带数据集
(train_img, train_label),(test_img, test_label)=keras.datasets.fashion_mnist.load_data()

查看训练集和测试集

train_img.shape, train_label.shape
# output 60000个样本,每个样本维度是28x28(图片),60000个标签(代表不同种类衣物)
((60000, 28, 28), (60000,))
test_img.shape, test_label.shape
# output
((10000, 28, 28), (10000,))

查看部分训练集数据

for i in range(1,6):
  plt.subplot(150+i)
  plt.imshow(train_img[i])

image-20220417104653778

查看标签种类

collections.Counter(test_label)
# output 10种标签,数量都是1000个
Counter({0: 1000,
         1: 1000,
         2: 1000,
         3: 1000,
         4: 1000,
         5: 1000,
         6: 1000,
         7: 1000,
         8: 1000,
         9: 1000})

归一化数据集和训练集

# 知道图片的组成就知道为什么是/255
train_img = train_img/255
test_img = test_img/255

模型搭建

model = keras.Sequential()
# 将28x28的图片flatten成一维输入
model.add(keras.layers.Flatten(input_shape=(28,28)))
# 模型第一层,128个神经元,用relu激活函数
model.add(keras.layers.Dense(128, activation='relu'))
# dropout随机丢弃20%的神经元进行训练(防止过拟合)
model.add(keras.layers.Dropout(0.2))
model.add(keras.layers.Dense(64, activation='relu'))
# 最后一层,10个神经元,激活函数为softmax(得到和为1的概率)
model.add(keras.layers.Dense(10, activation='softmax'))

查看搭建的模型

model.summary()
# output
Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 flatten (Flatten)           (None, 784)               0         
                                                                 
 dense (Dense)               (None, 128)               100480    
                                                                 
 dropout (Dropout)           (None, 128)               0         
                                                                 
 dense_1 (Dense)             (None, 64)                8256      
                                                                 
 dense_2 (Dense)             (None, 10)                650       
                                                                 
=================================================================
Total params: 109,386
Trainable params: 109,386
Non-trainable params: 0

添加优化器和loss函数

model.compile(
    optimizer='adam',
    loss='sparse_categorical_crossentropy',
    # 每一个epoch都会输出准确度
    metrics=['acc']
)
# train your model
# validation_data意思是拿test_img和test_label做验证集
history=model.fit(train_img, train_label, epochs=10, validation_data=(test_img, test_label))
# output
Epoch 1/10
1875/1875 [==============================] - 11s 5ms/step - loss: 0.5297 - acc: 0.8088 - val_loss: 0.4275 - val_acc: 0.8446
Epoch 2/10
1875/1875 [==============================] - 7s 4ms/step - loss: 0.4008 - acc: 0.8519 - val_loss: 0.4446 - val_acc: 0.8402
Epoch 3/10
1875/1875 [==============================] - 7s 4ms/step - loss: 0.3694 - acc: 0.8658 - val_loss: 0.3884 - val_acc: 0.8536
Epoch 4/10
1875/1875 [==============================] - 7s 4ms/step - loss: 0.3489 - acc: 0.8720 - val_loss: 0.3801 - val_acc: 0.8611
Epoch 5/10
1875/1875 [==============================] - 7s 4ms/step - loss: 0.3346 - acc: 0.8758 - val_loss: 0.3531 - val_acc: 0.8700
Epoch 6/10
1875/1875 [==============================] - 7s 4ms/step - loss: 0.3220 - acc: 0.8813 - val_loss: 0.3479 - val_acc: 0.8740
Epoch 7/10
1875/1875 [==============================] - 7s 4ms/step - loss: 0.3113 - acc: 0.8844 - val_loss: 0.3333 - val_acc: 0.8807
Epoch 8/10
1875/1875 [==============================] - 8s 4ms/step - loss: 0.3016 - acc: 0.8867 - val_loss: 0.3334 - val_acc: 0.8822
Epoch 9/10
1875/1875 [==============================] - 7s 4ms/step - loss: 0.2955 - acc: 0.8889 - val_loss: 0.3295 - val_acc: 0.8824
Epoch 10/10
1875/1875 [==============================] - 7s 4ms/step - loss: 0.2886 - acc: 0.8921 - val_loss: 0.3265 - val_acc: 0.8833

测试模型

查看模型在测试集的准确度

model.evaluate(test_img, test_label)
# output
313/313 [==============================] - 1s 2ms/step - loss: 0.3265 - acc: 0.8833
[0.3264760375022888, 0.8833000063896179]

训练过程中,训练集和验证集的loss变化

plt.plot(history.epoch,history.history.get('loss'), label='loss')
plt.plot(history.epoch,history.history.get('val_loss'), label='val_loss')
plt.legend()

image-20220417105606129

准确度比较

plt.plot(history.epoch,history.history.get('acc'), label='acc')
plt.plot(history.epoch,history.history.get('val_acc'), label='val_acc')
plt.legend()

image-20220417105640015

还不错嘛( ‵▽′)ψ


# tensorflow # python