用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. DOM、事件面试题

    1.DOM 事件级别有哪些? DOM0 a. 通过定义执行函数 element.onclick = function (){ } b. 直接在标签中添加执行语句 Onclick = '语句' 优点:很 ...

  2. eclipse 界面复原

    Windows-----Perspective-----Reset perspective

  3. Java实现 LeetCode 754 到达终点数字(暴力+反向)

    754. 到达终点数字 在一根无限长的数轴上,你站在0的位置.终点在target的位置. 每次你可以选择向左或向右移动.第 n 次移动(从 1 开始),可以走 n 步. 返回到达终点需要的最小移动次数 ...

  4. (Java实现)洛谷 P1164 小A点菜

    题目背景 uim神犇拿到了uoi的ra(镭牌)后,立刻拉着基友小A到了一家--餐馆,很低端的那种. uim指着墙上的价目表(太低级了没有菜单),说:"随便点". 题目描述 不过ui ...

  5. 如何获取CSDN的积分?

    个人感觉就是写博客就给积分 具体给多少? CSDN应该有自己的积分规则 总之一句话:写博客涨积分

  6. Java实现 蓝桥杯VIP 算法训练 回文数

    import java.util.Scanner; public class 回文数 { static int time = 0; public static int change(String st ...

  7. 视频处理之OSD

    欲观原文,请君移步 OSD简介 OSD,on-screen display的简称,即屏幕菜单式调节方式.一般我们按一下Menu键后屏幕弹出的显示器各项调节项目信息的矩形菜单,比如调亮度,色调,饱和度等 ...

  8. BigDecimal的setScale常用方法(ROUND_UP、ROUND_DOWN、ROUND_HALF_UP、ROUND_HALF_DOWN)

    BigDecimal的setScale四大常用方法总结 // 设置小数点后第三位数字一大一小观察效果BigDecimal num = new BigDecimal("3.3235667&qu ...

  9. 架构C02-商业模式与架构设计

    商业模式与架构设计:A段架构与B段架构 <思考软件创新设计:A段架构师思考技术> A段架构师必须具备鲜活的创新思维,睿智的策略思考,犀利的洞察力和灵活的战术才能把握稍纵即逝的商机     ...

  10. rgb格式颜色与#000000格式颜色的转换

    首先,#000000格式的颜色被成为十六进制颜色码: 6位数分为三组,每两位数一组,依次是红.黄.蓝颜色的强度: 而与此对应的,rgb(39,137,202)依次是十进制的红黄蓝颜色: 因此将rgb格 ...