用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])
查看标签种类
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()
准确度比较
plt.plot(history.epoch,history.history.get('acc'), label='acc')
plt.plot(history.epoch,history.history.get('val_acc'), label='val_acc')
plt.legend()
还不错嘛( ‵▽′)ψ