keras训练实例-python实现

用keras训练模型并实时显示loss/acc曲线,(重要的事情说三遍:实时!实时!实时!)实时导出loss/acc数值(导出的方法就是实时把loss/acc等写到一个文本文件中,其他模块如前端调用时可直接读取文本文件),同时也涉及了plt画图方法

ps:以下代码基于网上的一段程序修改完成,如有侵权,请联系我哈!

上代码:

from keras import Sequential, initializers, optimizers
from keras.layers import Activation, Dense
import numpy as np
import pylab as pl
from IPython import display
from keras.callbacks import Callback
from keras.datasets import mnist
import keras
from keras.layers import Conv2D, MaxPooling2D
from keras.layers import Dense, Dropout, Flatten

#定义回调函数的类,用于实时显示loss/acc曲线和导出loss/acc数值
class DrawCallback(Callback):
    def __init__(self, runtime_plot=True): # 初始化

        self.init_loss = None
        self.init_val_loss = None
        self.init_acc = None
        self.init_val_acc = None
        self.runtime_plot = runtime_plot

        self.xdata = []
        self.ydata = []
        self.ydata2 = []
        self.ydata3 = []
        self.ydata4 = []
    def _plot(self, epoch=None):
        epochs = self.params.get("epochs")
        pl.subplot(121) #画第一个图,121表示纵向1个图,横向2个图,当前第1个图
        pl.ylim(0, int(self.init_loss*1.2)) #限制坐标轴范围
        pl.xlim(0, epochs)
        pl.plot(self.xdata, self.ydata,‘r‘, label=‘loss‘) #xdata/ydata均为不断增长的一维数组,同时定义了线段颜色/类型/图例
        pl.plot(self.xdata, self.ydata2, ‘b--‘, label=‘val_loss‘)
        pl.xlabel(‘Epoch {}/{}‘.format(epoch or epochs, epochs)) #坐标轴显示变化的标签
        pl.ylabel(‘Loss {:.4f}‘.format(self.ydata[-1]))
        pl.legend() #显示图例,不加这个即便是定义图例了也没用
        pl.title(‘loss‘) #显示标题

        pl.subplot(122)
        pl.ylim(0, 1.2)
        pl.xlim(0, epochs)
        pl.plot(self.xdata, self.ydata3,‘r‘, label=‘acc‘)
        pl.plot(self.xdata, self.ydata4, ‘b--‘, label=‘val_acc‘)
        pl.xlabel(‘Epoch {}/{}‘.format(epoch or epochs, epochs))
        pl.ylabel(‘Loss {:.4f}‘.format(self.ydata[-1]))
        pl.legend()
        pl.title(‘acc‘)

    def _runtime_plot(self, epoch):
        self._plot(epoch)
        #不断的清图
        display.clear_output(wait=True)
        display.display(pl.gcf())
        pl.gcf().clear()

    def plot(self):
        self._plot()
        pl.show() #显示窗口

    def on_epoch_end(self, epoch, logs = None): #更新xdata/ydata
        logs = logs or {}
#         batch_size = self.params.get("batch_size")
        epochs = self.params.get("epochs") #获取训练相关数据
        loss = logs.get("loss")
        val_loss = logs.get("val_loss")
        acc = logs.get("acc")
        val_acc = logs.get("val_acc")

        epochs_str = str(epochs)[0:6] #为了写入txt,必须转为字符型,为了美观只保留小数点后4位
        loss_str = str(loss)[0:6]
        val_loss_str = str(val_loss)[0:6]
        acc_str = str(acc)[0:6]
        val_acc_str = str(val_acc)[0:6]

        f = open(‘logs_r/record.txt‘,‘a‘) #要用追加方式‘a’写入txt,所在行数就是当前迭代次数
        f.write(‘epochs:{}_loss:{}_val_loss:{}_acc:{}_val_acc{}‘.format(epochs_str,loss_str,val_loss_str,acc_str,val_acc_str))
        f.write(‘\n‘)
        f.close()

        if self.init_loss is None: #增加xdata/ydata内容
            self.init_loss = loss
            self.init_val_loss = val_loss
        self.xdata.append(epoch)
        self.ydata.append(loss)
        self.ydata2.append(val_loss)
        self.ydata3.append(acc)
        self.ydata4.append(val_acc)
        if self.runtime_plot:
            self._runtime_plot(epoch)

# 下面开始构建keras需要的东西
def viz_keras_fit(runtime_plot=False):
    d = DrawCallback(runtime_plot = runtime_plot) #实例化回调函数
    (x_train, y_train), (x_test, y_test) = mnist.load_data()
    x_train = x_train.reshape(-1,28,28,1)
    x_test = x_test.reshape(-1,28,28,1)
    input_shape = (28,28,1)
    x_train = x_train/255
    x_test = x_test/255
    y_train = keras.utils.to_categorical(y_train,10)
    y_test = keras.utils.to_categorical(y_test,10)
    #为了减小计算量,减少了训练/测试数据
    x_train = x_train[0:600,:,:,:]
    x_test = x_test[0:100,:,:,:]
    y_train = y_train[0:600,:]
    y_test = y_test[0:100,:]

    model = Sequential() #实例化一个模型
    #接下来一顿操作,就是搭建网络
    model.add(Conv2D(filters=32, kernel_size=(3,3),
                activation=‘relu‘, input_shape=input_shape,
                name=‘conv1‘))
    model.add(Conv2D(64,(3,3),activation=‘relu‘,name=‘conv2‘))
    model.add(MaxPooling2D(pool_size=(2,2),name=‘pool2‘))
    model.add(Dropout(0.25,name=‘dropout1‘))
    model.add(Flatten(name=‘flat1‘))
    model.add(Dense(128,activation=‘relu‘))
    model.add(Dropout(0.5,name=‘dropout2‘))
    model.add(Dense(10,activation=‘softmax‘,name=‘output‘))
    #编译网络,同时定义了loss方法/优化方法/监测内容
    model.compile(loss=keras.losses.categorical_crossentropy,
             optimizer=keras.optimizers.Adadelta(),
             metrics=[‘accuracy‘])
    #开始训练
    model.fit(x = x_train,
             y = y_train,
             epochs=30,
             verbose=0, #当值为1时,会打印训练过程
              validation_data=(x_test, y_test), #加入测试数据,不然有些数据时看不到的
             callbacks=[d]) #指定回调函数
    return d
最后运行

viz_keras_fit(runtime_plot=True) #调用函数

  

最后运行:

viz_keras_fit(runtime_plot=True) #调用函数

显示结果:

原文地址:https://www.cnblogs.com/niulang/p/11752914.html

时间: 2024-08-30 17:43:24

keras训练实例-python实现的相关文章

使用Keras训练神经网络备忘录

使用Keras训练神经网络备忘录 小书匠 深度学习 文章太长,放个目录: 1.优化函数的选择 2.损失函数的选择 2.2常用的损失函数 2.2自定义函数 2.1实践 2.2将损失函数自定义为网络层 3.模型的保存 3.1同时保持结构和权重 3.2模型结构的保存 3.3模型权重的保存 3.5选择网络层载入 4.训练历史的保存 4.1检测运行过程的参数 4.2保持训练过程得到的所有数据 5.陷阱:validation_split与shuffle 1.优化函数的选择 先写结论,后面再补上每个优化函数的

【python】实例-python实现两个字符串中最大的公共子串

由于python中的for循环不像C++这么灵活,因此该用枚举法实现该算法: C="abcdefhe" D="cdefghe" m=0 n=len(C) E=[] b=0 while(m<n): i=n-m while(i>=0): E.append(C[m:m+i]) i-=1 m+=1 for x in E: a=0 if x in D: a=len(x) c=E.index(x) if a > b:#保存符合要求的最长字符串长度和地址 b=a

keras训练cnn模型时loss为nan

1.首先记下来如何解决这个问题的:由于我代码中 model.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy']) 即损失函数用的是categorical_crossentropy所以,在pycharm中双击shift键,寻找该函数,会出现keras.loss模块中有该函数,进入该函数后, 原函数为: def categorical_crossentropy(y_true, y_pred):

keras训练函数fit和fit_generator对比,图像生成器ImageDataGenerator数据增强

1. [深度学习] Keras 如何使用fit和fit_generator https://blog.csdn.net/zwqjoy/article/details/88356094 ps:解决样本数量不均衡:fit_generator中设置参数class_weight = 'auto' 2. 实现批量数据增强 | keras ImageDataGenerator使用 https://www.jianshu.com/p/3da7ffb5d950 ps:数据量不足时一定要加上数据增强 原文地址:h

梯度迭代树(GBDT)算法原理及Spark MLlib调用实例(Scala/Java/python)

梯度迭代树(GBDT)算法原理及Spark MLlib调用实例(Scala/Java/python) http://blog.csdn.net/liulingyuan6/article/details/53426350 梯度迭代树 算法简介: 梯度提升树是一种决策树的集成算法.它通过反复迭代训练决策树来最小化损失函数.决策树类似,梯度提升树具有可处理类别特征.易扩展到多分类问题.不需特征缩放等性质.Spark.ml通过使用现有decision tree工具来实现. 梯度提升树依次迭代训练一系列的

Python全栈--6.1-match-search-findall-group(s)的区别以及计算器实例

Python全栈--6.1-match-search-findall-group(s)的区别以及计算器实例match.search.findall.group(s) 区别12345    import re# match findall经常用# re.match() #从开头匹配,没有匹配到对象就返回NONE# re.search() #浏览全部字符,匹配第一个符合规则的字符串# re.findall() # 将匹配到的所有内容都放置在一个列表中一.match有两种情况 -------  有分组

Python while 循环使用实例

while循环是在Python中的循环结构之一. while循环继续,直到表达式变为假.表达的是一个逻辑表达式,必须返回一个true或false值,本文章向码农介绍Python while 循环使用方法,需要的朋友可以看一下本文章. 一个循环是一个结构,导致第一个程序要重复一定次数.重复不断循环的条件仍是如此.当条件变为假,循环结束和程序的控制传递给后面的语句循环. while循环: while循环是在Python中的循环结构之一. while循环继续,直到表达式变为假.表达的是一个逻辑表达式,

python的静态成员变量、实例成员变量、静态方法、类方法、实例方法

静态成员变量(类变量)和普通成员变量(实例变量) 静态成员变量只能通过类名.变量名获得,实例成员变量,通过该实例引用.变量名获得. 在实例对静态成员变量赋值时,实例 python是动态类型的语言,没有特别的标志区分静态成员变量和普通成员变量 如果你使用类名.成员变量    那这个成员变量现在就是静态成员变量(类变量) 如果你使用实例.成员变量    那这个成员变量现在就是普通成员变量(实例变量) 静态方法.类方法.实例方法      实例方法,类中的普通方法,由实例调用 类方法,被@classm

最痛心以前做的笔记 Python 练习实例1

人世间最痛心以前做的笔记的就是我以前做的笔记找不到了.唉,多年的心血啊,都 是经验所得 题目:有四个数字:1.2.3.4,能组成多少个互不相同且无重复数字的三位数?各是多少? 程序分析:可填在百位.十位.个位的数字都是1.2.3.4.组成所有的排列后再去 掉不满足条件的排列. 程序源代码: 实例(Python 2.0+) #!/usr/bin/python # -*- coding: UTF-8 -*- for i in range(1,5): for j in range(1,5): for