keras实战_1.分类模型之模型构建

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]}

在这里插入图片描述

  • 没有通过归一化得出的数据结果很差
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值