Tensorflow特性
- 高度的灵活性
- 真正的可移植性
- 产品和科研结合
- 自动求微分
- 多语言支持
- 性能最优化
keras是什么?
- 基于python的高级神经网络API
- 是API,不是完整的库
- 以TensorFlow、CNTK、Theano为后端运行,keras必须有后端才可以运行
Tensorflow-keras
- Tensorflow对Keras API规范的实现
- 相对于以tensorflow 为后端的keras,TensorFlow-keras与TensorFlow结合更加紧密
- 实现在tf.keras空间下
分类回归与目标函数
##################################################################################################
import matplotlib as mpl #Matplotlib 是 Python 的绘图库。 它可与 NumPy 一起使用
import matplotlib.pyplot as plt #Python数据可视化matplotlib.pyplot
#%matplotlib inline #在使用jupyter notebook 或者 jupyter qtconsole的时候,经常会用到%matplotlib inline。其作用就是在你调用plot()进行画图或者直接输入Figure的实例对象的时候,会自动的显示并把figure嵌入到console中。
import numpy as np#数值计算扩展。这种工具可用来存储和处理大型矩阵
import sklearn#机器学习中常用的第三方模块,对常用的机器学习方法进行了封装,包括回归(Regression)、降维(Dimensionality Reduction)、分类(Classfication)、聚类(Clustering)等方法。
import pandas as pd#是python的一个数据分析包
import os #系统编程的操作模块,可以处理文件和目录
import sys #sys模块包含了与Python解释器和它的环境有关的函数
import time
import tensorflow as tf
from tensorflow import keras
##################################################################################################
#选择GPU
os.environ["CUDA_VISIBLE_DEVICES"] = "0"
##################################################################################################
print(tf.__version__)
print(sys.version_info)
for module in mpl, np, pd, sklearn, tf, keras:
print(module.__name__, module.__version__)
##################################################################################################
fashion_mnist = keras.datasets.fashion_mnist #从keras中导入数据集datasets
(x_train_all, y_train_all), (x_test, y_test) = fashion_mnist.load_data()# load_data导入训练集和测试集,x是图片,y是label
x_valid, x_train = x_train_all[:5000], x_train_all[5000:]#导入数据集中前x_valid5000个和x_train 为5000之后的
y_valid, y_train = y_train_all[:5000], y_train_all[5000:]#导入数据集中前y_valid5000个和y_train 为5000之后的
print(x_valid.shape, y_valid.shape)#前5000个训练集
print(x_train.shape, y_train.shape)#训练集
print(x_test.shape, y_test.shape)#测试集
##################################################################################################
#自定义显示单张图片函数
def show_single_image(img_arr):
plt.imshow(img_arr,cmap="binary")#表示显示灰度图像
plt.show()#显示图片
##################################################################################################
#展示图片
show_single_image(x_train[0])
##################################################################################################
#自定义显示多张图片函数
def show_imgs(n_rows, n_cols, x_data, y_data, class_names):#显示多少行多少列图片,x_data为图片,y_data为便签,class_names为所有的标签
assert len(x_data) == len(y_data) #限定条件,x_data = y_data
assert n_rows * n_cols < len(x_data) # 输入的图片数不得小于x_data的图像数
plt.figure(figsize = (n_cols * 1.4, n_rows * 1.6)) #每张图像显示的窗口大小(相框)
for row in range(n_rows):
for col in range(n_cols):
index = n_cols * row + col #图片放置的位置
plt.subplot(n_rows, n_cols, index+1)#在一张图中展示多个子图
plt.imshow(x_data[index], cmap="binary",
interpolation = 'nearest')#最邻近插值法(The nearest interpolation)实现图像缩放
plt.axis('off')#去掉坐标轴
plt.title(class_names[y_data[index]])#每个图像的标题为label
plt.show()
##################################################################################################
#展示图片
class_names = ['T-shirt', 'Trouser', 'Pullover', 'Dress',
'Coat', 'Sandal', 'Shirt', 'Sneaker',
'Bag', 'Ankle boot']
show_imgs(3, 5, x_train, y_train, class_names)
##################################################################################################
#使用 Keras Sequential 顺序模型
#顺序模型是多个网络层的线性堆叠。
model = keras.models.Sequential([
keras.layers.Flatten(input_shape=[28, 28]),
keras.layers.Dense(300, activation='relu'),#全连接层300个单元
keras.layers.Dense(100, activation='relu'),
keras.layers.Dense(10, activation='softmax')# 输出,10个label,输出10个
])
#也可以简单地使用 .add() 方法将各层添加到模型中:
"""
model = keras.models.Sequential()
model.add(keras.layers.Flatten(input_shape=[28, 28]))
model.add(keras.layers.Dense(300, activation="relu"))
model.add(keras.layers.Dense(100, activation="relu"))
model.add(keras.layers.Dense(10, activation="softmax"))
"""
# relu: y = max(0, x)
# softmax: 将向量变成概率分布. x = [x1, x2, x3],
##################################################################################################
#配置训练模型
model.compile(loss="sparse_categorical_crossentropy",#损失函数
optimizer = "sgd",#优化器名
metrics = ["accuracy"])
# reason for sparse: y->index. y->one_hot->[]
# 原因:y是长度等于样本数目的向量,对于每个样本来说都是一个值,sparse使用y变成一个向量
##################################################################################################
print(model.layers,model.summary())
#结果
#Layer (type) Output Shape Param #
#=================================================================
#flatten (Flatten) (None, 784) 0
#_________________________________________________________________
#dense (Dense) (None, 300) 235500
#_________________________________________________________________
#dense_1 (Dense) (None, 100) 30100
#_________________________________________________________________
#dense_2 (Dense) (None, 10) 1010
#=================================================================
#Total params: 266,610
#Trainable params: 266,610
#Non-trainable params: 0
# 开始是28*28的图片展开为784*1
# [None, 784] * W + b -> [None, 300] W.shape [784, 300], b = [300]
##################################################################################################
#开始训练
history = model.fit(x_train, y_train, epochs=10,
validation_data=(x_valid, y_valid))
##################################################################################################
print(history.history)
##################################################################################################
def plot_learning_curves(history):
pd.DataFrame(history.history).plot(figsize=(8,5))
plt.grid(True)
plt.gca().set_ylim(0,1)
plt.show()
plot_learning_curves(history)
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
flatten (Flatten) (None, 784) 0
_________________________________________________________________
dense (Dense) (None, 300) 235500
_________________________________________________________________
dense_1 (Dense) (None, 100) 30100
_________________________________________________________________
dense_2 (Dense) (None, 10) 1010
=================================================================
Total params: 266,610
Trainable params: 266,610
Non-trainable params: 0
_________________________________________________________________
[<tensorflow.python.keras.layers.core.Flatten object at 0x000001EA6D632D88>, <tensorflow.python.keras.layers.core.Dense object at 0x000001EA6D6C2AC8>, <tensorflow.python.keras.layers.core.Dense object at 0x000001EA6D9AA948>, <tensorflow.python.keras.layers.core.Dense object at 0x000001EA6D9B0808>] None
Train on 55000 samples, validate on 5000 samples
Epoch 1/10
2019-12-08 10:54:17.368157: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library cublas64_100.dll
55000/55000 [==============================] - 7s 123us/sample - loss: 52995973708189907550208.0000 - accuracy: 0.0962 - val_loss: 2.3028 - val_accuracy: 0.0914
Epoch 2/10
55000/55000 [==============================] - 5s 93us/sample - loss: 2.3027 - accuracy: 0.0983 - val_loss: 2.3029 - val_accuracy: 0.0914
Epoch 3/10
55000/55000 [==============================] - 5s 93us/sample - loss: 2.3027 - accuracy: 0.1001 - val_loss: 2.3027 - val_accuracy: 0.0986
Epoch 4/10
55000/55000 [==============================] - 5s 93us/sample - loss: 2.3027 - accuracy: 0.0978 - val_loss: 2.3029 - val_accuracy: 0.0914
Epoch 5/10
55000/55000 [==============================] - 5s 96us/sample - loss: 2.3027 - accuracy: 0.0971 - val_loss: 2.3028 - val_accuracy: 0.0986
Epoch 6/10
55000/55000 [==============================] - 5s 93us/sample - loss: 2.3027 - accuracy: 0.0991 - val_loss: 2.3027 - val_accuracy: 0.0986
Epoch 7/10
55000/55000 [==============================] - 5s 94us/sample - loss: 2.3027 - accuracy: 0.0996 - val_loss: 2.3028 - val_accuracy: 0.0914
Epoch 8/10
55000/55000 [==============================] - 5s 95us/sample - loss: 2.3027 - accuracy: 0.0996 - val_loss: 2.3029 - val_accuracy: 0.0976
Epoch 9/10
55000/55000 [==============================] - 5s 94us/sample - loss: 2.3027 - accuracy: 0.0989 - val_loss: 2.3029 - val_accuracy: 0.0980
Epoch 10/10
55000/55000 [==============================] - 5s 96us/sample - loss: 2.3027 - accuracy: 0.0985 - val_loss: 2.3027 - val_accuracy: 0.0980
{'loss': [5.299597370818991e+22, 2.302696818265048, 2.3026860407395797, 2.3026977002577347, 2.3026960491874, 2.3026771264856514, 2.3026847758206452, 2.3026794326088647, 2.3026924161390823, 2.302688461754539], 'accuracy': [0.09616364, 0.09829091, 0.100090906, 0.097781815, 0.09709091, 0.099072725, 0.099563636, 0.099581815, 0.09889091, 0.09849091], 'val_loss': [2.3028272399902345, 2.3028735733032226, 2.30267809677124, 2.302882437133789, 2.302770109176636, 2.3026850578308107, 2.302786629486084, 2.3028965690612795, 2.3029025268554686, 2.3027251117706298], 'val_accuracy': [0.0914, 0.0914, 0.0986, 0.0914, 0.0986, 0.0986, 0.0914, 0.0976, 0.098, 0.098]}
- 没有通过归一化得出的数据结果很差