卷积神经网络
- 参考以下两个链接
- https://blog.csdn.net/weixin_42398658/article/details/84392845
- https://blog.csdn.net/stdcoutzyx/article/details/41596663
实战
import matplotlib as mpl
import matplotlib.pyplot as plt
%matplotlib inline
import numpy as np
import sklearn
import pandas as pd
import os
import sys
import time
import tensorflow as tf
from tensorflow import keras
print(tf.__version__)
print(sys.version_info)
for module in mpl, np ,pd, sklearn, tf, keras:
print(module.__name__, module.__version__)
2.1.0
sys.version_info(major=3, minor=7, micro=4, releaselevel='final', serial=0)
matplotlib 3.1.1
numpy 1.16.5
pandas 0.25.1
sklearn 0.21.3
tensorflow 2.1.0
tensorflow_core.python.keras.api._v2.keras 2.2.4-tf
fashion_mnist = keras.datasets.fashion_mnist
(x_train_all, y_train_all),(x_test, y_test) = fashion_mnist.load_data()
x_valid, x_train = x_train_all[:5000],x_train_all[5000:]
y_valid, y_train = y_train_all[:5000],y_train_all[5000:]
print(x_valid.shape, y_valid.shape)
print(x_train.shape, y_train.shape)
print(x_test.shape, y_test.shape)
(5000, 28, 28) (5000,)
(55000, 28, 28) (55000,)
(10000, 28, 28) (10000,)
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
x_train_scaled = scaler.fit_transform(
x_train.astype(np.float32).reshape(-1, 1)).reshape(-1, 28, 28, 1)
x_valid_scaled = scaler.transform(
x_valid.astype(np.float32).reshape(-1, 1)).reshape(-1, 28, 28, 1)
x_test_scaled = scaler.transform(
x_test.astype(np.float32).reshape(-1, 1)).reshape(-1, 28, 28, 1)
model = keras.models.Sequential()
model.add(keras.layers.Conv2D(filters=32, kernel_size=3,
padding='same',
activation="selu",
input_shape=(28, 28 ,1)))
model.add(keras.layers.Conv2D(filters=3, kernel_size=3,
padding='same',
activation="selu"
))
model.add(keras.layers.MaxPool2D(pool_size=2))
model.add(keras.layers.Conv2D(filters=64, kernel_size=3,
padding='same',
activation="selu"
))
model.add(keras.layers.Conv2D(filters=64, kernel_size=3,
padding='same',
activation="selu"
))
model.add(keras.layers.MaxPool2D(pool_size=2))
model.add(keras.layers.Conv2D(filters=128, kernel_size=3,
padding='same',
activation="selu"
))
model.add(keras.layers.Conv2D(filters=128, kernel_size=3,
padding='same',
activation="selu"
))
model.add(keras.layers.MaxPool2D(pool_size=2))
model.add(keras.layers.Flatten())
model.add(keras.layers.Dense(128,activation="selu"))
model.add(keras.layers.Dense(10,activation="softmax"))
model.compile(loss="sparse_categorical_crossentropy",
optimizer="sgd",
metrics = ["accuracy"])
model.summary()
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d (Conv2D) (None, 28, 28, 32) 320
_________________________________________________________________
conv2d_1 (Conv2D) (None, 28, 28, 3) 867
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 14, 14, 3) 0
_________________________________________________________________
conv2d_2 (Conv2D) (None, 14, 14, 64) 1792
_________________________________________________________________
conv2d_3 (Conv2D) (None, 14, 14, 64) 36928
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 7, 7, 64) 0
_________________________________________________________________
conv2d_4 (Conv2D) (None, 7, 7, 128) 73856
_________________________________________________________________
conv2d_5 (Conv2D) (None, 7, 7, 128) 147584
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 3, 3, 128) 0
_________________________________________________________________
flatten (Flatten) (None, 1152) 0
_________________________________________________________________
dense (Dense) (None, 128) 147584
_________________________________________________________________
dense_1 (Dense) (None, 10) 1290
=================================================================
Total params: 410,221
Trainable params: 410,221
Non-trainable params: 0
_________________________________________________________________
logdir = os.path.join("cnn-selu-callbacks")
if not os.path.exists(logdir):
os.mkdir(logdir)
output_model_file = os.path.join(logdir,"fashion_mnist_model.h5")
callbacks = [
keras.callbacks.TensorBoard(log_dir=logdir),
keras.callbacks.ModelCheckpoint(output_model_file,
save_best_only=True),
keras.callbacks.EarlyStopping(patience=5, min_delta=1e-3),
]
history = model.fit(x_train_scaled, y_train, epochs=10,
validation_data=(x_valid_scaled, y_valid),
callbacks = callbacks)
Train on 55000 samples, validate on 5000 samples
Epoch 1/10
55000/55000 [==============================] - 155s 3ms/sample - loss: 0.4501 - accuracy: 0.8370 - val_loss: 0.3343 - val_accuracy: 0.8812
Epoch 2/10
55000/55000 [==============================] - 168s 3ms/sample - loss: 0.3022 - accuracy: 0.8898 - val_loss: 0.2922 - val_accuracy: 0.8946
Epoch 3/10
55000/55000 [==============================] - 161s 3ms/sample - loss: 0.2558 - accuracy: 0.9066 - val_loss: 0.2948 - val_accuracy: 0.8926
Epoch 4/10
55000/55000 [==============================] - 156s 3ms/sample - loss: 0.2238 - accuracy: 0.9187 - val_loss: 0.2599 - val_accuracy: 0.9068
Epoch 5/10
55000/55000 [==============================] - 151s 3ms/sample - loss: 0.1973 - accuracy: 0.9283 - val_loss: 0.2458 - val_accuracy: 0.9112
Epoch 6/10
55000/55000 [==============================] - 158s 3ms/sample - loss: 0.1742 - accuracy: 0.9371 - val_loss: 0.2477 - val_accuracy: 0.9102
Epoch 7/10
55000/55000 [==============================] - 154s 3ms/sample - loss: 0.1529 - accuracy: 0.9448 - val_loss: 0.2383 - val_accuracy: 0.9142
Epoch 8/10
55000/55000 [==============================] - 147s 3ms/sample - loss: 0.1339 - accuracy: 0.9518 - val_loss: 0.2625 - val_accuracy: 0.9100
Epoch 9/10
55000/55000 [==============================] - 150s 3ms/sample - loss: 0.1157 - accuracy: 0.9580 - val_loss: 0.2491 - val_accuracy: 0.9164
Epoch 10/10
55000/55000 [==============================] - 152s 3ms/sample - loss: 0.0995 - accuracy: 0.9639 - val_loss: 0.2732 - val_accuracy: 0.9146
def plot_learning_curves(history):
pd.DataFrame(history.history).plot(figsize=(8, 5 ))
plt.grid(True)
plt.gca().set_ylim(0, 3)
plt.show()
plot_learning_curves(history)

model.evaluate(x_test_scaled, y_test, verbose=2)
10000/10000 - 8s - loss: 0.3132 - accuracy: 0.9030
[0.3131856933772564, 0.903]