Python深度学习:Tensorflow简单使用

2024.02前Python学习小结

1、Python数据分析:对饮食与健康数据的分析与可视化
2、Python机器学习:Scikit-learn简单使用
3、Python深度学习:Tensorflow简单使用



前言

本文旨在对以往学习的相关内容进行总结回顾,通过Tensorflow对饮食与健康数据进行分析,侧重体现神经网络、梯度下降法部分特点:

  1. 详细叙述神经网络和梯度下降内容
  2. 练习方法为主,不太注重准确度
  3. 代码尽量详细说明

一、技术简介

TensorFlow简介

TensorFlow是一个由Google开发的开源机器学习框架,用于构建和训练各种机器学习模型。它是一个强大的数值计算库,特别适用于深度学习任务,如神经网络的构建和训练。

笔者选择理由:

  1. 常用就TensorFlow和PyTorch,都差不多
  2. 笔者看的弗朗索瓦·肖莱的“Python 深度学习”,里面用的TensorFlow
  3. 另外,非常推荐斋藤康毅的“深度学习入门”。笔者一口气读完,酣畅淋漓。作者用平实的语言讲解了卷积神经网络各部分知识,徐徐展开很有魅力。

Keras简介

弗朗索瓦·肖莱称为Keras之父。

Keras 是一个高层神经网络 API,用于构建和训练深度学习模型。它是一个建立在低层深度学习框架之上的用户友好的接口,旨在快速实现和实验各种深度学习模型。

它有几个特点:

  1. 和Scikit-learn类似有着简洁高效的API
  2. 丰富的检查方法用来观察模型
  3. 包含在TensorFlow2.0内

二、数据处理

1.引入库

代码如下:

import numpy as np
import pandas as pd
import warnings                    ## Filter warnings
warnings.filterwarnings('ignore')
from sklearn.model_selection import train_test_split ## 划分数据集
from tensorflow.keras.models import Sequential  ## 导入Keras中Sequential很重要
# 构建模型的层和激活方法
from tensorflow.keras.layers import Dense, Activation
# 数据处理的辅助工具
from tensorflow.keras import utils```

2.数据导入及处理

对数据导入及处理,在以上两个文件基础上。

#数据导入及处理
df_1 = pd.read_csv(r'D:\Pytharm\Practice\sjfenxilast\sti_sc.csv')
df_1.drop_duplicates(keep='first',inplace=True)  #删除重复
df_1['Age'] = df_1['Age'].apply(int)  #原数据年龄有太多小数
df = df_1[df_1['Age'] < 31]  #原数据基本是30以下的,只选取小于30部分

#只保留饮食习惯属性和基础信息属性
df_diet = []
df_diet=df.loc[:,['Age','Weight','Height','FAVC','FCVC','NCP','CH2O','NObeyesdad']]


#将文本类型属性转换为数字类型
df_diet.loc[df_diet['FAVC'] == 'yes', 'FAVC_'] = 1
df_diet.loc[df_diet['FAVC'] == 'no', 'FAVC_'] = 0
df_diet.drop(['FAVC'], axis="columns", inplace=True)#删除列

#也可以使用map,replace
dict = {'Insufficient_Weight' : 0, 'Normal_Weight' : 1, 'Overweight_Level_I' : 2,
        'Overweight_Level_II':3,'Obesity_Type_I' : 4,'Obesity_Type_II' : 5,'Obesity_Type_II' : 6}
df_diet["BMIex"] = df_diet["BMIex"].map(dict)
df_diet["NObeyesdad"] = df_diet["NObeyesdad"].map(dict)#有空代表没换完

#修改部分列索引,方便调用,此次BMI评价直接使用给定值
df_diet.rename(columns={'NObeyesdad': 'BMIex', 'FAVC_': 'FAVC'}, inplace=True)

#将BMIex放到最后,检测相关数据
df_diet=df_diet[['Age','Weight','Height','FAVC','FCVC','NCP','CH2O','BMIex']]

wenjian
其中,本文依然选取30岁以下人群数据,并将各属性转化为数值型。

三、神经网络

本部分用Kears进行部分操作,期望使用神经网络完成两类问题:

  1. 将样本数据分为健康和不健康两类(二分类问题)
  2. 由部分数据估算体重(回归问题)

1.二分类问题

数据导入及简单处理

本部分为了用Keras实现二分类问题,对身体状况进行分类,首先需要更改数据标签,将正常体重(‘Normal_Weight’)视为健康,其他视为不健康。

##No表示不健康,Yes表示健康
dict = {0: "No", 1: "Yes", 2: "No", 3: "No", 4: "No", 5: "No", 6: "No"}
df_diet["BMIex"] = df_diet["BMIex"].map(dict)
print(df_diet)

输出

依然以最后一列作为标签,No表示不健康,Yes表示健康。但期望输入还得是数字需要转化下。

数据集划分及热编码

为了建立模型并检验模型,需要将原数据进行划分,分为训练集和测试集。分类问题一般情况都需要进行热编码。热编码一般应用情况:

  • One-Hot编码常用于分类任务,类别标签通常需要热编码
  • 在深度学习中,热编码将类别标签转换为固定长度的二进制向量,使其能够成为神经网络的输入。
  • 非数值型标签
from tensorflow.keras import utils ## 数据处理相关
from sklearn.model_selection import train_test_split ## 数据集划分
from sklearn.preprocessing import OneHotEncoder

## 将数据集划分为训练集和测试集,7:3
train_X, test_X, train_y, test_y = train_test_split(X, y, train_size=0.7, test_size=0.3, random_state=0)
dict = {"No": 0, "Yes": 1}
df_diet["BMIex"] = df_diet["BMIex"].map(dict)
print("编码前")
print(train_y)
##
# 进行热编码
def one_hot_encode_object_array(arr):
    # 去重获取全部的类别
    uniques, ids = np.unique(arr, return_inverse=True)
    # 返回热编码的结果
    return utils.to_categorical(ids, len(uniques))

# 训练集热编码
train_y_ohe = one_hot_encode_object_array(train_y)
# 测试集热编码
test_y_ohe = one_hot_encode_object_array(test_y)
print("编码前")
print(train_y)
print("编码后")
print(train_y_ohe)

数据变化
可以看到,原理的字符型标签变成了二进制型0,1。

构建网络

数据处理后就可构建网络了,一般使用sequential方式。

## 利用sequential方式构建空模型
model = Sequential()

# 隐藏层1,激活函数是relu引入非线性,输入由input_shape指定
# 添加输入层和第一个隐藏层
model.add(Dense(units=10, activation='relu', input_dim=(7,)))
#model.add((10, activation="relu", input_shape=(7,)))

# 添加第二个隐藏层
model.add(Dense(units=10, activation='relu'))

# 添加输出层(二分类,一个神经元,sigmoid激活函数,softmax常用是多分类)
model.add(Dense(units=1, activation='sigmoid'))

如果没有relu(非线性)等激活函数,原Dense层将只包含点积分和加法,只能做线性。

本部分是二分类问题需要sigmoid激活函数,多分类也就输出层不同,改为:

model.add(Dense(7,activation="softmax"))

还需要设置损失函数和优化器。对于二分类问题,输出是个概率值,最好使用二元交叉熵损失。

# 优化器和损失,监测精度
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])

本例用adm优化器,指标用精确度。不知是否书老了,书里常用rmsprop明显感觉adam好,网上也是用adam多。

模型训练

# 模型训练:epochs,训练样本送入到网络中的次数,batch_size:每次训练的送入到网络中的样本个数
model.fit(train_X, train_y_ohe, epochs=50, batch_size=7, verbose=1)

# 计算模型的损失和准确率
loss, accuracy = model.evaluate(test_X, test_y_ohe, verbose=1)
print("Accuracy = {:.2f}".format(accuracy))

准确度0.73

2.回归问题

激活函数需要

model.add(Dense(units=1, activation='linear'))  # 线性激活函数适用于回归问题

损失函数用均方误差

model.compile(optimizer='adam', loss='mean_squared_error')  # 使用均方误差作为损失函数

回归问题需要加入一列索引,因为得有作为每行特征的值,类似文件2,此处就不写了。和分类很相似的。

总结

本部分就写这了,笔者仅尝试过Keras几个分类回归问题,对卷积神经网络仅了解原理,进行了部分简单练习未进行项目练习,本计划完成手写识别,可惜没时间了。再写意义也不大了。

时间也快转钟了。零点是人为定义的结束,太多事情本身都没意义,不过是人为强加的理解,共识的理解又形成了所谓文明的东西。

本阶段总结也到此结束吧,期望在动荡的半年后圆梦清华,为本科的学习也来个结束。

  • 21
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值