tensorflow2.0入门之多层感知机进行二分类
tensorflow2.0封装了Keras的高阶API,可以很方便的调用Keras里面的函数实现各类算法
-
Keras 是一个用 Python 编写的高级神经网络 API,它能够以 TensorFlow, CNTK, 或者 Theano 作为后端运行。 Keras可以很明确的定义了层的概念,反过来层与层之间的参数反倒是用户不需要关心的对象,所以构建神经网络的方法对于普通开发者来说,相对tensorflow,Keras更易上手。 并且Keras也是tensorflow官方在tensorflow2.0开始极力推荐使用的。 下面我们就利用tf.keras实现一个多层感知机进行二分类,然后用此模型对乳腺癌数据集进行预测
import numpy as np import pandas as pd import matplotlib.pyplot as plt import tensorflow as tf import warnings warnings.filterwarnings(ignore) from sklearn import datasets
# 导入一个二分类数据集,乳腺癌数据集,转成pd.DataFrame的形式 data = datasets.load_breast_cancer() attributes = data.data target = data.target label = data.feature_names df = pd.DataFrame(attributes,columns = label) df["target"] = target df.head()
-
先看一下标签值的情况,可以看到标签只有1和0两类,表示是和否
df.iloc[:,-1].value_counts() X = df.iloc[:, :-1] # 取出特征数据 y = df.iloc[:, -1] # 取出目标数据,即标签 >> 1 357 0 212 Name: target, dtype: int64
-
建立顺序模型,其中用了两个隐藏层,由于是二分类模型所以最后一层激活函数用了sigmod
# 建立顺序模型 model = tf.keras.Sequential() # .Dence的三个参数,第一个是输出的神经元个数,第二个是输入的形状,最后activation是激活函数 model.add(tf.keras.layers.Dense(10, input_shape=(30,),activation = relu)) model.add(tf.keras.layers.Dense(10, activation = relu)) model.add(tf.keras.layers.Dense(1, activation = sigmoid)) model.summary() >> Model: "sequential_1" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= dense_3 (Dense) (None, 10) 310 _________________________________________________________________ dense_4 (Dense) (None, 10) 110 _________________________________________________________________ dense_5 (Dense) (None, 1) 11 ================================================================= Total params: 431 Trainable params: 431 Non-trainable params: 0 _________________________________________________________________
-
由于二分类模型用了sigmod激活,所以需要使用交叉熵损失函数
# 二分类问题激活函数用的是sigmoid,损失函数用的是交叉熵 model.compile( optimizer=adam, loss = binary_crossentropy, metrics=[acc] ) history = model.fit(X,y,epochs=500) >> Train on 569 samples Epoch 1/500 569/569 [==============================] - 1s 1ms/sample - loss: 102.6028 - acc: 0.3726 Epoch 2/500 569/569 [==============================] - 0s 42us/sample - loss: 61.2871 - acc: 0.3726 Epoch 3/500 569/569 [==============================] - 0s 56us/sample - loss: 32.3962 - acc: 0.3726 ... Epoch 498/500 569/569 [==============================] - 0s 49us/sample - loss: 0.0840 - acc: 0.9701 Epoch 499/500 569/569 [==============================] - 0s 46us/sample - loss: 0.0800 - acc: 0.9684 Epoch 500/500 569/569 [==============================] - 0s 47us/sample - loss: 0.0850 - acc: 0.9649
-
下面画图分析一下训练的结果
history.history.keys() # 读出训练的loss和acc y1 = history.history[loss] y2 = history.history[acc] plt.figure(figsize=(20,8),dpi = 80) # plt.plot(history.epoch,y1,c = r) plt.plot(history.epoch,y2,c = b) plt.grid()
可以看到模型的acc最后准确率比较高,但是有很大的震荡,说明模型一直在最优处变化,梯度下降优化方法一直到达不了极小值处,猜测可能是学习率较大。后续优化可以考虑加深网络层数、调整学习率等。
上一篇:
JS实现多线程数据分片下载
下一篇:
Kafka跨网闸,使用映射地址无法连接