keras构建神经网络

1、使用keras构建神经网络基本工作流程:
训练数据–创建模型–配置模型–训练模型–训练好的模型做预测、对模型效果进行评估。
(1)创建模型:
在 Keras 中有两类主要的模型:Sequential 顺序模型 和 使用函数式 API 的 Model 类模型。
这些模型有许多共同的方法和属性:
model.layers 是包含模型网络层的展平列表。
model.inputs 是模型输入张量的列表。
model.outputs 是模型输出张量的列表。
model.summary() 打印出模型概述信息。 它是 utils.print_summary 的简捷调用。
model.get_config() 返回包含模型配置信息的字典。
通过以下代码,就可以根据这些配置信息重新实例化模型:

config = model.get_config()
model = Model.from_config(config)
或者,对于 Sequential:
model = Sequential.from_config(config)

具体见keras中文文档:https://keras.io/zh/models/about-keras-models/

from keras.models import Sequential
from keras.layers import Dense,Activation
from keras import optimizers

#1、定义模型 通过序贯模型
model=Sequential()#定义了一个序贯模型
#2、叠加网络层
#序贯模型的第一层网络需要定义网络的输入形状或尺寸input_shape 或input_dim  数据本身的维度即可  不用包含输入数据的批量大小batch
#input_shape要求是一个元组类型的数据,input_dim要求是 一个整数类型的数据  input_shape=(784,)等价于 input_dim=784
model.add(Dense(32,input_shape=(784,)))#通过add可以把需要的网络层按照顺序一层层的叠加到模型上
model.add(Activation('relu'))
model.add(Dense(10))#Dense和Activation都是keras的网络层
model.add(Activation('softmax'))
#注:Dense全连接层 /稠密层 要求制定神经元的个数 Dense(10)表示这一层有10个神经元输出数据的shape也是10,
#如果是第一层输入层还需要制定输入数据的shape 否则则不需要指定
#Activation激活层 是对该层的输出施加激活函数 常用的激活函数包括 sigmoid relu tanh等
#Dropout 随机失活层 是防止模型过拟合的一种方式 Dropout层会指定一个更新参数(0-1之间的概率值) Dropout将在训练过程中每次更新参数时按一定概率随即断开输入神经元
#model.add(Dropout(0.5))
#也可以省略add 直接将网络层传递给序贯模型  如下
# model=Sequential([
#     Dense(32,units=784),
#     Activation('relu'),
#     Dense(10),
#     Activation('softmax')
# ])

#3、模型的编译  :对模型的学习过程进行配置
#优化器optizmizer  损失函数loss 评价指标列表metrics
model.compile(
    optizmizer='rmsprop',
    loss='mse',
    metrics=['mse','mae']
)
'''
(1)优化器optizmizer 随机梯度下降算法 等优化方法
优化算法决定了神经网络参数以何种方式在训练中被更新 这是网络训练前需要知道的 需要在模型训练前配置好
常见的优化器 SGD Adam RMSprop AdaGrad AdaDelta 
指定优化器 把优化器的名字直接作为参数传给 optizmizer 即可
有时 需要对优化算法的参数做一定的设置 比如Clipnorm Clipvalue对梯度进行裁剪 或者设置学习率lr以及学习率的衰减率 decay 
这时需要先设置优化器 在传递给optizmizer
sgd=optimiizers.SGD(lr=0.01,decay=0.0001)
model.compile(loss='mean_squared_error',optimizer=sgd)
(2)损失函数loss
回归问题常用损失函数 mse/mean_squared_error 均方误差  mae/mean_absolute_error 平均绝对误差 
分类问题 categorical_crossentropy 交叉熵
(3)性能评估metrics
和损失函数差不多 
'''
#4、训练模型
model.fit(X,Y,nb_epoch=150,batch_size=16)
'''
X,Y用于训练的输入数据
nb_epoch训练的轮数 当所有的训练数据都被训练了一次之后 被称为一个opoch
batch_size每一批次的数据量 训练数据不是一次性被输入网络进行训练的,而是分批进入 每一个批量batch都会对网络进行一次参数更新 
'''
#5、使用训练好的模型进行预测
y_pred=model.predict(x_pred,batch_size=32)
#6、模型的评估  在训练数据上进行
model.evaluate(X,Y)

(2)配置训练模型

compile(optimizer, loss=None, metrics=None, loss_weights=None, 
sample_weight_mode=None, weighted_metrics=None, target_tensors=None)

参数说明:
① optimizer: 字符串(优化器名)或者优化器对象。
② loss: 字符串(目标函数名)或目标函数。 如果模型具有多个输出,则可以通过传递损失函数的字典或列表,在每个输出上使用不同的损失。模型将最小化的损失值将是所有单个损失的总和。
③ metrics: 在训练和测试期间的模型评估标准。通常你会使用 metrics = [‘accuracy’]。 要为多输出模型的不同输出指定不同的评估标准,还可以传递一个字典,如 metrics = {‘output_a’:‘accuracy’}。
④ loss_weights: 指定标量系数(Python浮点数)的可选列表或字典,用于加权不同模型输出的损失贡献。 模型将要最小化的损失值将是所有单个损失的加权和,由 loss_weights 系数加权。 如果是列表,则期望与模型的输出具有 1:1 映射。 如果是张量,则期望将输出名称(字符串)映射到标量系数。
⑤ sample_weight_mode: 如果你需要执行按时间步采样权重(2D 权重),请将其设置为 temporal。 默认为 None,为采样权重(1D)。如果模型有多个输出,则可以通过传递 mode 的字典或列表,以在每个输出上使用不同的 sample_weight_mode。
⑥ weighted_metrics: 在训练和测试期间,由 sample_weight 或 class_weight 评估和加权的度量标准列表。
⑦ target_tensors: 默认情况下,Keras 将为模型的目标创建一个占位符,在训练过程中将使用目标数据。相反,如果你想使用自己的目标张量(反过来说,Keras 在训练期间不会载入这些目标张量的外部 Numpy 数据),您可以通过 target_tensors 参数指定它们。它应该是单个张量(对于单输出 Sequential 模型)。
(3)训练模型

fit(x=None, y=None, batch_size=None, epochs=1, verbose=1, callbacks=None, 
validation_split=0.0, validation_data=None, shuffle=True, class_weight=None, 
sample_weight=None, initial_epoch=0, steps_per_epoch=None, validation_steps=None)

参数说明具体见 keras中文文档
(4)评估模型

evaluate(x=None, y=None, batch_size=None, verbose=1, sample_weight=None, steps=None)

参数说明:
① x: 训练数据的 Numpy 数组。 如果模型中的输入层被命名,你也可以传递一个字典,将输入层名称映射到 Numpy 数组。 如果从本地框架张量馈送(例如 TensorFlow 数据张量)数据,x 可以是 None(默认)。
② y: 目标(标签)数据的 Numpy 数组。 如果模型中的输出层被命名,你也可以传递一个字典,将输出层名称映射到 Numpy 数组。 如果从本地框架张量馈送(例如 TensorFlow 数据张量)数据,y 可以是 None(默认)。
③ batch_size: 整数或 None。每次提度更新的样本数。如果未指定,默认为 32.
④ verbose: 0, 1。日志显示模式。0 = 安静模式, 1 = 进度条。
⑤ sample_weight: 训练样本的可选 Numpy 权重数组,用于对损失函数进行加权(仅在训练期间)。 您可以传递与输入样本长度相同的平坦(1D)Numpy 数组(权重和样本之间的 1:1 映射),或者在时序数据的情况下,可以传递尺寸为 (samples, sequence_length) 的 2D 数组,以对每个样本的每个时间步施加不同的权重。在这种情况下,你应该确保在 compile() 中指定 sample_weight_mode=“temporal”。
⑥steps: 整数或 None。 声明评估结束之前的总步数(批次样本)。默认值 None。
(5)预测模型

predict(x, batch_size=None, verbose=0, steps=None)

x: 输入数据,Numpy 数组(或者如果模型有多个输入,则为 Numpy 数组列表)。
batch_size: 整数。如未指定,默认为 32。
verbose: 日志显示模式,0 或 1。
steps: 声明预测结束之前的总步数(批次样本)。默认值 None。

2、手写数字识别

import keras
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense,Activation,Dropout
from keras.optimizers import RMSprop

#1、定义程序用到的参数 通常是与训练过程有关的参数
#每个训练批量的大小
batch_size=128
#模型的输出是多少个类别  回归问题一般只有一个输出
num_classes=10
#训练的轮数
epochs=20

#2、数据准备
(x_train,y_train),(x_test,y_test)=mnist.load_data()
print("train data shape",x_train.shape)
print("train label shape",y_train.shape)
print("test data shape",x_test.shape)
print("test label shape",y_test.shape)
#3、把训练集中的几个数据打印出来  灰度图像
import matplotlib.pyplot as plt
plt.subplot(221)
plt.imshow(x_train[0],cmap=plt.get_cmap('gray'))
plt.subplot(222)
plt.imshow(x_train[1],cmap=plt.get_cmap('gray'))
plt.subplot(223)
plt.imshow(x_train[2],cmap=plt.get_cmap('gray'))
plt.subplot(224)
plt.imshow(x_train[3],cmap=plt.get_cmap('gray'))
plt.show()
#4、数据预处理
x_train=x_train.reshape(60000,784)
x_test=x_test.reshape(10000,784)
x_train=x_train.astype('float32')
x_test=x_test.astype('float32')
x_train/=255
x_test/=255
y_train=keras.utils.to_categorical(y_train,num_classes)
y_test=keras.utils.to_categorical(y_test,num_classes)

#5、定义模型
model=Sequential()
model.add(Dense(512,activation='relu',input_shape=(784,)))
model.add(Dropout(0.2))
model.add(Dense(512,activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(num_classes,activation='softmax'))
#打印模型结构图
print(model.summary())
#6、编译模型
model.compile(loss='categorical_crossentropy',optimizer=RMSprop(),metrics=['accuracy'])
#7、训练模型
h=model.fit(x_train,y_train,batch_size=batch_size,epochs=epochs,verbose=1,validation_data=(x_test,y_test))
print(h.history)
#8、评价模型
score=model.evaluate(x_test,y_test,verbose=0)
print('test loss:',score[0])
print('test accuracy:',score[1])
#9、预测模型
y_pred=model.predict(x_test)
print(y_pred)
神经网络模型结构
Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense (Dense)                (None, 512)               401920    
_________________________________________________________________
dropout (Dropout)            (None, 512)               0         
_________________________________________________________________
dense_1 (Dense)              (None, 512)               262656    
_________________________________________________________________
dropout_1 (Dropout)          (None, 512)               0         
_________________________________________________________________
dense_2 (Dense)              (None, 10)                5130      
=================================================================
Total params: 669,706
Trainable params: 669,706
Non-trainable params: 0

3、使用生成器批量训练大量数据
keras中用于模型训练的函数有3个:

model.fit(x_train, y_train,
          epochs=20,
          batch_size=128)
'''
fit(x=None, y=None, batch_size=None, epochs=1, verbose=1, callbacks=None, 
validation_split=0.0, validation_data=None, shuffle=True, class_weight=None, 
sample_weight=None, initial_epoch=0, steps_per_epoch=None, validation_steps=None)
'''
history_object = model.fit_generator(train_generator, 
                                     steps_per_epoch=samples_per_epoch,
                                      validation_data=validation_generator,
                                      validation_steps=nb_val_samples, 
                                     epochs=nb_epoch, verbose=1,
                                     callbacks=callbacks_list)
train_on_batch(x, y, sample_weight=None, class_weight=None)
import keras
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense,Activation,Dropout
from keras.optimizers import RMSprop

num_classes=10
#使用fit_generator函数批量训练大量数据
#定义一个生成器用于批量生成数据
def data_generator_mnist(isTrain=True,batchSize=100):
    nb_classes=10
    (X_train,y_train),(X_test,y_test)=mnist.load_data()
    X_train=X_train.reshape(60000,784)
    X_test=X_test.reshape(10000,784)
    X_train=X_train.astype('float32')
    X_test=X_test.astype('float32')
    X_train/=255
    X_test/=255
    Y_train=keras.utils.to_categorical(y_train,num_classes)
    Y_test=keras.utils.to_categorical(y_test,num_classes)
    if(isTrain):
        dataset=(X_train,Y_train)
    else:
        dataset = (X_test, Y_test)
    dataset_size=dataset[0].shape[0]
    while(True):
        i=0
        yield dataset[0][i:i+batchSize],dataset[1][i:i+batchSize]
        i+=batchSize
        if (i+batchSize>dataset_size):
            i=0

model=Sequential()
model.add(Dense(512,activation='relu',input_shape=(784,)))
model.add(Dropout(0.2))
model.add(Dense(512,activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(num_classes,activation='softmax'))
model.compile(loss='categorical_crossentropy',optimizer=RMSprop(),metrics=['accuracy'])

history=model.fit_generator(data_generator_mnist(True,batchSize=100),steps_per_epoch=60000,epochs=1,validation_data=data_generator_mnist(False,batchSize=100),validation_steps=10000)
scores=model.evaluate_generator(data_generator_mnist(False),steps=10000)
print("baseline error:%.2f%%"%(100-scores[1]*100))

60000/60000 [==============================] - 937s 16ms/step - loss: 1.6444e-04 - accuracy: 1.0000 - val_loss: 2.4502 - val_accuracy: 0.7400
baseline error:26.00%

python中yield的理解:见博客 https://blog.csdn.net/mieleizhi0522/article/details/82142856
4、在keras中重复使用模型
在定义好模型结构之后,可以保存模型,将来可以把这个保存好的模型加载出来,以便重复使用这个模型。
keras通常使用HDF5文件的格式来保存模型,文件包含的格式如下:模型的结构、模型的权值、训练配置、优化器的状态。
将模型的一切打包成HDF5文件:model.save(‘my_model.h5’)
加载模型:
from keras.models import load_model
model=load_model(‘my_model.h5’)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值