keras基础学习,与keras断点连续,minst数据集加载失败问题

**

keras基础与keras断点连续

**
什么是断点连续,刚开始学习keras是非常迷茫的,对于一些大神的代码非常的好奇,为什么他们的代码可以接着上次的训练继续训练。
我也因此在网上不停的找资源,原来这种训练方法叫断点连续,断点连续顾名思义,停下来接着上此继续训练。
而我们的模型一般分为两种,一种叫初始模型,一种叫成熟模型(个人口语,请勿当标准)。而一般的训练都是基于初始模型训练的,断点连续就是基于成熟模型训练的。

**

一 什么是初始模型

**

#初始模型构建
def model_nn():
    model=keras.Sequential()
    model.add(layers.Flatten())
    model.add(layers.Dense(64,activation='relu'))
    model.add(layers.Dense(64,activation='relu'))
    model.add(layers.Dense(64,activation='relu'))
    model.add(layers.Dense(10,activation='softmax'))
    return model

这就是一种初始模型,只有四个层,一个输入层,一个输出层,两个隐藏层(理论上隐藏层越多,训练效果越好,你可以自己删掉几层试一试)。初始模型就是这种基本搭建的模型。

#载入初始模型
 model = model_nn()

二 什么是成熟模型

成熟模型就是基础模型在训练之后的模型,所以我们在模型训练的时候才发现,像loss,acc越来越理想。
所以成熟模型就是基于数据的陶寻薰而变的更加有韵味的基础模型

#模型编译,包括优化器选择和损失函数选择
model.compile(optimizer='adam',\
loss='sparse_categorical_crossentropy',metrics=['acc'])
#模型编译50次,并同时输出预测loss和acc
model.fit(train_data,train_label,epochs=50,\
batch_size=500,validation_data=(test_data, test_label))

提示,理论上batch_size是越大越好,最好是一次就全部输出进去,但是计算机是不可能完全供应这种配置的,总而言之batch_size越大,梯度下降越理想。

三 模型载入,数据预测

接下来就是与我们断点连续息息相关的关键了,它就是模型载入
在刚才的训练后我们先保存模型

#模型保存名字为m1,地方在自己py文件同级目录下
model_label = './m1.h5'
model.save(model_label)

模型保存好当然就载入模型开始预测了呀

#载入本地模型
model = load_model(model_label)

开始预测test

#输出我们预测的值,predict为模型预测的方法,\
# 因为我们的模型是输出10个值,所以要用numpy的argmax方法,取10个值里的最大的值
x_test = np.argmax(model.predict(test_data[:10]),axis=1)
print(x_test,'\n',test_label[:10])

四 断点连续

这就是我们的关键了,断点连续,这个就相当于我们载入已经训练好的成熟的模型,在成熟的模型继续训练的概念

#载入成熟的模型
model = load_model(model_label)
#模型编译,包括优化器选择和损失函数选择
model.compile(optimizer='adam',\
loss='sparse_categorical_crossentropy',metrics=['acc'])
#在成熟模型基础上,继续编译50次,并同时输出预测loss和acc
model.fit(train_data,train_label,epochs=50,\
batch_size=500,validation_data=(test_data, test_label))
#保存模型
model.save(model_label)

这样我们就做完了断点连续,是不是非常的简单,其实只要理解这个概念就不难了,就像在最后的数据预测,需要载入本地保存的模型断点连续同样是载入本地保存的模型,在已有的基础上训练。

附加整体源代码

本代码是基于mnist数据集进行训练的

import keras
import tensorflow as tf
import numpy as np
import keras.datasets.mnist as mnist
from keras import layers
from keras.models import load_model
import os

#初始模型构建
def model_nn():
    model=keras.Sequential()
    model.add(layers.Flatten())
    model.add(layers.Dense(64,activation='relu'))
    model.add(layers.Dense(64,activation='relu'))
    model.add(layers.Dense(64,activation='relu'))
    model.add(layers.Dense(10,activation='softmax'))
    return model


#载入数据
(train_data , train_label),(test_data , test_label) = mnist.load_data()
#载入初始模型
model = model_nn()
#模型编译,包括优化器选择和损失函数选择
model.compile(optimizer='adam',\
loss='sparse_categorical_crossentropy',metrics=['acc'])
#模型编译50次,并同时输出预测loss和acc
model.fit(train_data,train_label,epochs=5,\
batch_size=500,validation_data=(test_data, test_label))

#模型保存名字为m1,地方在自己py文件同级目录下
model_label = './m2.h5'
model.save(model_label)

#载入本地模型
model = load_model(model_label)
#输出我们预测的值,predict为模型预测的方法,\
# 因为我们的模型是输出10个值,所以要用numpy的argmax方法,取10个值里的最大的值
x_test = np.argmax(model.predict(test_data[:10]),axis=1)
print('预测的十个值:',x_test,'\n','实际的十个值:',test_label[:10])

关于mnist数据集载入失败的问题解决办法

办法一

mnist数据集下载难免会出问题,链接:https://pan.baidu.com/s/17KUWe8JdQBHsAg3B4m5SNg
提取码:wyxn (csnd上找的连接)原博客地址
将下载好的文件是mnist.npz
mnist.npz
然后复制到这种路径下,根据你python安装位置而定在这里插入图片描述
在这里插入图片描述
负责成这样打开mnist.py文件,注释掉这一段就行在这里插入图片描述
这样就可以跳过下载,直接加载mnist数据集

方法二

把下载好的mnist.npz文件复制到你的程序文件下,直接定义定义以下方法。我的程序是2.py,于是我就将mnist.npz放在我的同及目录下
在这里插入图片描述

def load_data(path='mnist.npz'):
    path='mnist.npz'
    f = np.load(path)
    x_train, y_train = f['x_train'], f['y_train']
    x_test, y_test = f['x_test'], f['y_test']
    f.close()
    return (x_train, y_train), (x_test, y_test)

然后直接读取数据

(train_data , train_label),(test_data , test_label) = load_data()

方法二代码总结

import keras
import tensorflow as tf
import numpy as np
from keras import layers
from keras.models import load_model
import os

#读取mnist数据集
def load_data(path='mnist.npz'):
    path='mnist.npz'
    f = np.load(path)
    x_train, y_train = f['x_train'], f['y_train']
    x_test, y_test = f['x_test'], f['y_test']
    f.close()
    return (x_train, y_train), (x_test, y_test)
#初始模型构建
def model_nn():
    model=keras.Sequential()
    model.add(layers.Flatten())
    model.add(layers.Dense(64,activation='relu'))
    model.add(layers.Dense(64,activation='relu'))
    model.add(layers.Dense(64,activation='relu'))
    model.add(layers.Dense(10,activation='softmax'))
    return model


#载入数据
(train_data , train_label),(test_data , test_label) = load_data()
#载入初始模型
model = model_nn()
#模型编译,包括优化器选择和损失函数选择
model.compile(optimizer='adam',\
loss='sparse_categorical_crossentropy',metrics=['acc'])
#模型编译50次,并同时输出预测loss和acc
model.fit(train_data,train_label,epochs=5,\
batch_size=500,validation_data=(test_data, test_label))

#模型保存名字为m1,地方在自己py文件同级目录下
model_label = './m2.h5'
model.save(model_label)

#载入本地模型
model = load_model(model_label)
#输出我们预测的值,predict为模型预测的方法,\
# 因为我们的模型是输出10个值,所以要用numpy的argmax方法,取10个值里的最大的值
x_test = np.argmax(model.predict(test_data[:10]),axis=1)
print('预测的十个值:',x_test,'\n','实际的十个值:',test_label[:10])
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章