1 代码实现(能直接跑通本文中的代码)
代码中训练数据已自动生成,能直接跑通本文中的代码。
2 代码思路解析
from keras.models import Sequential
from keras.layers import *
from general import *
import os
import numpy as np
import pandas as pd
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
from sklearn import datasets
from sklearn.cross_validation import train_test_split
#生成分类数据集
def generate_classification_train_data():
lris_df = datasets.load_iris()
X_data = lris_df.data
y_data = lris_df.target
X_train,X_test,y_train,y_test=train_test_split(X_data,y_data,test_size=0.2)
x_train = np.array(X_train)
x_test = np.array(X_test)
y_train = np.array(y_train)
y_test = np.array(y_test)
return x_train, y_train, x_test, y_test
#Seque构建方式(推荐)
class SequeClassifier():
def __init__(self, units):
self.units = units
self.model = None
#构建神经网络模型:(根据各层输入输出的shape)搭建网络结构、确定损失函数、确定优化器
def build_model(self, loss, optimizer, metrics):
self.model = Sequential()
self.model.add(LSTM(self.units, return_sequences=True))
self.model.add(LSTM(self.units))
self.model.add(Dense(3, activation='softmax'))
#最后一层全连接层。对于N分类问题,最后一层全连接输出个数为N个;对于回归问题,最后一层全连接层的输出为1
#激活函数也很重要,如果没有使用激活函数或者激活函数选择不当,很有可能产生梯度消失或梯度爆炸模型无法学习
self.model.compile(loss=loss,
optimizer=optimizer, #优化器的选择很重要
metrics=metrics)
if __name__ == "__main__":
#1 获取训练数据集,并调整为三维输入格式
x_train, y_train, x_test, y_test = generate_classification_train_data()
# 二维-->三维。构建的方法:
# 方法一、直接 x_train[:, :, np.newaxis] 把原本二维数组中每一行变成二维,改变后每条记录shape变化为:(1,m)-->(m,1)
# 方法二、对于时序问题,把每行记录拓展为包含包括该条记录时刻共n个时刻的记录,改变后每条记录shape变化为:(1,m)-->(n,m)
# 方法三、对于原本二维数组中每一行,将其特征均等归类,归为k类,成为一个新的二维数组,改变后每条记录shape变化为:(1,m)-->(k,m/k)
x_train = x_train[:, :, np.newaxis]
x_test = x_test[:, :, np.newaxis]
#2 构建神经网络模型:(根据各层输入输出的shape)搭建网络结构、确定损失函数、确定优化器
units = 128 #lstm细胞个数
loss = "sparse_categorical_crossentropy" #损失函数类型
optimizer = "adam" #优化器类型
metrics = ['accuracy'] #评估方法类型
sclstm = SequeClassifier(units)
sclstm.build_model(loss, optimizer, metrics)
#3 训练模型
epochs = 30
batch_size = 64
sclstm.model.fit(x_train, y_train, epochs=epochs, batch_size=batch_size)
#4 模型评估
score = sclstm.model.evaluate(x_test, y_test, batch_size=16)
print("model score:", score)
# 模型应用:预测
#proba_prediction = sclstm.model.predict(x_test)
#5 模型持久化,把模型保存在本地
dirs = "model"
if not os.path.exists(dirs):
os.makedirs(dirs)
print("正在保存模型......")
sclstm.model.save(dirs+"/classifier_model.h5")
print("模型已保存.save path-->dirs%s"%"/classifier_model.h5")
#6 从指定模型保存的位置读取模型,做预测
from keras.models import load_model
read_model = load_model(dirs+"/classifier_model.h5")
out = read_model.predict(x_test)
print("out:%s"%out)
<1.1> 对于图片,本来就是三维数组,可直接输入深度学习模型
<1.2> 对于文本(如情感分析案例),一般需要将二维的句子索引化、索引长度规范化,然后通过嵌入层生成三维数组
<1.3> 对于传统结构化数据(如房价预测、irsi数据集分类等数据挖掘场景),二维转换为三维的方法如下:
二维-->三维。构建的方法:
方法一、直接 x_train[:, :, np.newaxis] 把原本二维数组中每一行变成二维,改变后每条记录shape变化为:(1,m)-->(m,1)
方法二、对于时序问题,把每行记录拓展为包含包括该条记录时刻共n个时刻的记录,改变后每条记录shape变化为:(1,m)-->(n,m)
方法三、对于原本二维数组中每一行,将其特征均等归类,归为k类,成为一个新的二维数组,改变后每条记录shape变化为:(1,m)-->(k,m/k)
算法构建要素
<1> 输入、输出
<2> 算法框架
<3> 损失函数
<4> 迭代优化方法
注:
最后一层全连接层,对于N分类问题,最后一层全连接输出个数为N个;对于回归问题,最后一层全连接层的输出为1
激活函数也很重要,如果没有使用激活函数或者激活函数选择不当,很有可能产生梯度消失或梯度爆炸模型无法学习
对于分类问题和回归问题,注意选择正确的损失函数和迭代器,损失函数和迭代器的选择对模型效果影响很大。
tensorflow2.x版本构建神经网络有两种方法
方法一:Seque构建方式(推荐)。用 from keras.models import Sequential模块构建网络
方法二:Func构建方式。通过各个算法自带的函数构建,如 keras.layers.LSTM()