笔记笔记,给自己看的傻瓜式教学笔记
# matplotlib 用于绘图
import matplotlib as mpl
import matplotlib.pyplot as plt
# 处理数据的库
import numpy as np
import sklearn
import pandas as pd
# 系统库
import os
import sys
import time
# TensorFlow的库
from tensorflow import keras
'''python使用tensrflow读取csv文件训练深度学习DNN模型'''
import tensorflow as tf
import functools
import numpy as np
from sklearn.preprocessing import StandardScaler
from tensorflow import keras
from sklearn.model_selection import train_test_split
#tf.compat.v1.disable_eager_execution()
#首先要用tersonflow提取数据加载date.Dataset 才能被DNN所使用
'''从csv里面加载数据'''
train_file_path='C:/Users/70473/Desktop/tra.csv'
data=pd.read_csv(train_file_path) #通过read_csv方法读取文件 调用之后它的type为<class 'pandas.core.frame.DataFrame'>
#data_shape=data.shape
#s=data.head(5) head方法查看数据 查看一下自己读取文件是否成功 要注意的是这里直接读取出来的文件 还不能被tensorflow使用 还需要进一步转换为<class 'tensorflow.python.data.ops.dataset_ops.BatchDataset'>
'''划分数据集和测试集'''
#运用train_test_split()划分数据集和测试集
# 划分出的训练数据集数据 ,划分出的测试数据集数据 = train_test_split(带划分的数据集合,test_size=分数划分的比例)
train, test = train_test_split(data, test_size=0.2) #第一个是所要划分的样本特征集 test_size:样本占比,如果是整数的话就是样本的数量
train, val = train_test_split(train, test_size=0.2)
#print(train.head(5)) #会发现train_test_split()划分是随机的
#到这一步 在没有实现分割训练集 测试集情况下 所需要的训练集 测试集就画好了
'''dataframe格式转为BatchDataset'''
#将dataframe格式转为能被tensorflow识别的dataset格式
def df_to_dataset(dataframe, shuffle=True, batch_size=32):
c_dataframe = dataframe.copy() #把dataframe中的内容重新复制到一个新的dataframe中
labels = c_dataframe.pop('name') #print(type(labels[0])) <class 'str'> #从c_data中提取标签一列
ds = tf.data.Dataset.from_tensor_slices((dict(c_dataframe), labels.values))
# tf.data.Dataset.from_tensor_slices 用于给 给定的 元组列表张量等特征进行切片。 为了完成特征feature 和 标签label的组合 构成完整的训练数据集合([feature_1, label_1],[feature_2, label_2],......)
if shuffle:
ds = ds.shuffle(buffer_size=len(dataframe)) #随机排列列表
ds = ds.batch(batch_size) #对于训练集从数组中每次获取一个bitch_size的数据
return ds
#batch,在神经网络模型训练时,比如有1000个样本,把这些样本分为10批,就是10个batch。每个批(batch)的大小为100,就是batch size=100。每次模型训练,更新权重时,就拿一个batch的样本来更新权重
train_dataset = df_to_dataset(train, batch_size=12) #随机抽6个 函数中定义的ca_var函数 随机抽取六个排列组合
val_dataset = df_to_dataset(val, shuffle=False, batch_size=12)
test_dataset = df_to_dataset(test, shuffle=False, batch_size=12)
""" 构建DENSE类型输入层神经模型 """
for feature_batch, label_batch in train_dataset.take(1):
feature = list(feature_batch.keys())
feature_columns = [] #
# 遍历特征列表feature
for col in feature:#如果label不多的情况下 这里的feature也可以直接列一个数组 不用for循环遍历
feature_columns.append(tf.feature_column.numeric_column(col))
#构造输入层
feature_layer = tf.keras.layers.DenseFeatures(feature_columns, dtype='int64') #根据需要将原始数据转换为特征数据 输入层 将面向列的数据转换为单个tensor
#在模型的第一层,此面向列的数据应转换为单个 Tensor 。
#构造整个DNN网络
model = keras.models.Sequential([
feature_layer, #输入层
keras.layers.Dense(40, activation='selu'),
keras.layers.Dense(30, activation='selu'),
keras.layers.Dense(20, activation='selu'),
keras.layers.Dense(1, activation='sigmoid')
])
model.compile(optimizer=keras.optimizers.SGD(0.01), #优化器
loss="binary_crossentropy", #损失函数
metrics=['accuracy'] #评价函数
)
model.fit(train_dataset, validation_data=val_dataset,epochs=100)
#训练集的输入特征 标签 batch_size每一批小批量训练的大小 epochs迭代次数 validation_data = (测试集的输入特征,测试集的标签),validation_split = 从测试集中划分多少比例给训练集, validation_freq = 测试的epoch间隔数)
#Cast string to int64 is not supported 查看标签的类型是否发生改变
loss, accuracy = model.evaluate(test_dataset)
print(accuracy)