tensorflow2.0之多层感知机进行二分类
程序员文章站
2022-10-19 13:02:06
tensorflow2.0封装了Keras的高阶API,可以很方便的调用Keras里面的函数实现各类算法Keras 是一个用 Python 编写的高级神经网络 API,它能够以 TensorFlow, CNTK, 或者 Theano 作为后端运行。Keras可以很明确的定义了层的概念,反过来层与层之间的参数反倒是用户不需要关心的对象,所以构建神经网络的方法对于普通开发者来说,相对tensorflow,Keras更易上手。并且Keras也是tensorflow官方在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最后准确率比较高,但是有很大的震荡,说明模型一直在最优处变化,梯度下降优化方法一直到达不了极小值处,猜测可能是学习率较大。后续优化可以考虑加深网络层数、调整学习率等。
本文地址:https://blog.csdn.net/qq_44971458/article/details/107107939