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()

tensorflow2.0入门之多层感知机进行二分类_第1张图片
可以看到模型的acc最后准确率比较高,但是有很大的震荡,说明模型一直在最优处变化,梯度下降优化方法一直到达不了极小值处,猜测可能是学习率较大。后续优化可以考虑加深网络层数、调整学习率等。

你可能感兴趣的:(tensorflow2.0,深度学习,keras,tensorflow,分词,感知机,算法,神经网络)