用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) #调用函数

显示结果:

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

  1. keras训练cnn模型时loss为nan

    keras训练cnn模型时loss为nan 1.首先记下来如何解决这个问题的:由于我代码中 model.compile(loss='categorical_crossentropy', optimiz ...

  2. Keras 训练 inceptionV3 并移植到OpenCV4.0 in C++

    1. 训练 # --coding:utf--- import os import sys import glob import argparse import matplotlib.pyplot as ...

  3. 使用Keras训练大规模数据集

    官方提供的.flow_from_directory(directory)函数可以读取并训练大规模训练数据,基本可以满足大部分需求.但是在有些场合下,需要自己读取大规模数据以及对应标签,下面提供一种方法 ...

  4. keras训练和保存

    https://cloud.tencent.com/developer/article/1010815 8.更科学地模型训练与模型保存 filepath = 'model-ep{epoch:03d}- ...

  5. Keras 训练一个单层全连接网络的线性回归模型

    1.准备环境,探索数据 import numpy as np from keras.models import Sequential from keras.layers import Dense im ...

  6. Keras 入门实例

    使用Keras构建神经网络的基本工作流程主要可以分为 4个部分.(而这个用法和思路,很像是在使用Scikit-learn中的机器学习方法) Model definition → Model compi ...

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

    小书匠深度学习 文章太长,放个目录: 1.优化函数的选择 2.损失函数的选择 2.2常用的损失函数 2.2自定义函数 2.1实践 2.2将损失函数自定义为网络层 3.模型的保存 3.1同时保持结构和权 ...

  8. keras训练大量数据的办法

    最近在做一个鉴黄的项目,数据量比较大,有几百个G,一次性加入内存再去训练模青型是不现实的. 查阅资料发现keras中可以用两种方法解决,一是将数据转为tfrecord,但转换后数据大小会方法不好:另外 ...

  9. 【机器学习实战学习笔记(1-2)】k-近邻算法应用实例python代码

    文章目录 1.改进约会网站匹配效果 1.1 准备数据:从文本文件中解析数据 1.2 分析数据:使用Matplotlib创建散点图 1.3 准备数据:归一化特征 1.4 测试算法:作为完整程序验证分类器 ...

随机推荐

  1. Postman学习笔记(一)

    一.简介 Postman是一种网页调试与发送网页 http 请求的 chrome 插件.我们可以用来很方便的 模拟 get 或者 post 或者其他方式的请求来调试接口. 二.安装 1.chrome浏 ...

  2. Java 从入门到精通-反射机制

    导读 Java反射机制是开发者迈向结构化开发的重要一步,同时掌握了反射机制也就掌握了所有框架的核心实现思想. 认识反射机制 简单例子 通过以上的程序就会发现,除了对象的正向处理操作之外,还可以通过ge ...

  3. Shell 脚本(四) ”read 读取控制台输入” 与 “函数”

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 八.read 读取控制台输入 1.基本语法 read(选项)(参数) 选项: -p: 指定读取值时的提示 ...

  4. Java实现 LeetCode 598 范围求和 II(最小值相乘)

    598. 范围求和 II 给定一个初始元素全部为 0,大小为 m*n 的矩阵 M 以及在 M 上的一系列更新操作. 操作用二维数组表示,其中的每个操作用一个含有两个正整数 a 和 b 的数组表示,含义 ...

  5. Java实现 蓝桥杯VIP 算法提高 特殊的质数肋骨

    算法提高 特殊的质数肋骨 时间限制:1.0s 内存限制:256.0MB 问题描述 农民约翰母牛总是产生最好的肋骨.你能通过农民约翰和美国农业部标记在每根肋骨上的数字认出它们.农民约翰确定他卖给买方的是 ...

  6. Java实现第九届蓝桥杯螺旋折线

    螺旋折线 题目描述 如图p1.pgn所示的螺旋折线经过平面上所有整点恰好一次. 对于整点(X, Y),我们定义它到原点的距离dis(X, Y)是从原点到(X, Y)的螺旋折线段的长度. 例如dis(0 ...

  7. java实现第七届蓝桥杯平方圈怪

    平方圈怪 题目描述 如果把一个正整数的每一位都平方后再求和,得到一个新的正整数. 对新产生的正整数再做同样的处理. 如此一来,你会发现,不管开始取的是什么数字, 最终如果不是落入1,就是落入同一个循环 ...

  8. C#基础篇——泛型

    前言 在开发编程中,我们经常会遇到功能非常相似的功能模块,只是他们的处理的数据不一样,所以我们会分别采用多个方法来处理不同的数据类型.但是这个时候,我们就会想一个问题,有没有办法实现利用同一个方法来传 ...

  9. 温故知新-多线程-深入刨析volatile关键词

    文章目录 摘要 volatile的作用 volatile如何解决线程可见? CPU Cache CPU Cache & 主内存 缓存一致性协议 volatile如何解决指令重排序? volat ...

  10. MySQL 8.0权限认证(上)

    MySQL 8.0授权认证   一.系统权限表   user 存放用户账户信息以及全局级别(所有数据库)权限,决定了来自哪些主机的哪些用户可以访问数据库实例,如果有全局权限则意味着对所有数据库都有此权 ...