Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
PaddlePaddle
VisualDL
提交
ca59c51a
V
VisualDL
项目概览
PaddlePaddle
/
VisualDL
1 年多 前同步成功
通知
88
Star
4655
Fork
642
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
10
列表
看板
标记
里程碑
合并请求
2
Wiki
5
Wiki
分析
仓库
DevOps
项目成员
Pages
V
VisualDL
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
10
Issue
10
列表
看板
标记
里程碑
合并请求
2
合并请求
2
Pages
分析
分析
仓库分析
DevOps
Wiki
5
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
未验证
提交
ca59c51a
编写于
2月 02, 2018
作者:
D
daminglu
提交者:
GitHub
2月 02, 2018
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Add keras mnist demo (#238)
上级
4e384421
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
216 addition
and
0 deletion
+216
-0
demo/keras/TUTORIAL_CN.md
demo/keras/TUTORIAL_CN.md
+95
-0
demo/keras/keras_mnist_demo.py
demo/keras/keras_mnist_demo.py
+121
-0
未找到文件。
demo/keras/TUTORIAL_CN.md
0 → 100644
浏览文件 @
ca59c51a
# 如何在Keras中使用VisualDL
下面我们演示一下如何在Keras中使用VisualDL,从而可以把Keras的训练过程可视化出来。我们将以Keras用卷积神经网络(CNN, Convolutional Neural Network)来训练
[
MNIST
](
http://yann.lecun.com/exdb/mnist/
)
数据集作为例子。
程序的主体来自Keras的官方GitHub
[
Example
](
https://github.com/keras-team/keras/blob/master/examples/mnist_cnn.py
)
。
我们只需要在代码里面创建 VisualDL 的数据采集 loggers
```
python
# create VisualDL logger
logdir
=
"/workspace"
logger
=
LogWriter
(
logdir
,
sync_cycle
=
100
)
# mark the components with 'train' label.
with
logger
.
mode
(
"train"
):
# create a scalar component called 'scalars/'
scalar_keras_train_loss
=
logger
.
scalar
(
"scalars/scalar_keras_train_loss"
)
image_input
=
logger
.
image
(
"images/input"
,
1
)
image0
=
logger
.
image
(
"images/image0"
,
1
)
image1
=
logger
.
image
(
"images/image1"
,
1
)
histogram0
=
logger
.
histogram
(
"histogram/histogram0"
,
num_buckets
=
50
)
histogram1
=
logger
.
histogram
(
"histogram/histogram1"
,
num_buckets
=
50
)
```
然后在Keras提供的回调函数(callback)中插入我们的数据采集代码就可以了。
```
python
train_step
=
0
class
LossHistory
(
keras
.
callbacks
.
Callback
):
def
on_train_begin
(
self
,
logs
=
{}):
self
.
losses
=
[]
def
on_batch_end
(
self
,
batch
,
logs
=
{}):
global
train_step
# Scalar
scalar_keras_train_loss
.
add_record
(
train_step
,
logs
.
get
(
'loss'
))
# get weights for 2 layers
W0
=
model
.
layers
[
0
].
get_weights
()[
0
]
# 3 x 3 x 1 x 32
W1
=
model
.
layers
[
1
].
get_weights
()[
0
]
# 3 x 3 x 32 x 64
weight_array0
=
W0
.
flatten
()
weight_array1
=
W1
.
flatten
()
# histogram
histogram0
.
add_record
(
train_step
,
weight_array0
)
histogram1
.
add_record
(
train_step
,
weight_array1
)
# image
image_input
.
start_sampling
()
image_input
.
add_sample
([
28
,
28
],
x_train
[
0
].
flatten
())
image_input
.
finish_sampling
()
image0
.
start_sampling
()
image0
.
add_sample
([
9
,
32
],
weight_array0
)
image0
.
finish_sampling
()
image1
.
start_sampling
()
image1
.
add_sample
([
288
,
64
],
weight_array1
)
image1
.
finish_sampling
()
train_step
+=
1
self
.
losses
.
append
(
logs
.
get
(
'loss'
))
```
训练结束后,各个组件的可视化结果如下:
关于误差的数值图的如下:
<p
align=
center
>
<img
width=
"70%"
src=
"https://github.com/daming-lu/large_files/blob/master/keras_demo_figs/keras_scalar.png?raw=true"
/>
</p>
输入图片以及训练过后的第一,第二层卷积权重图的如下:
<p
align=
center
>
<img
width=
"70%"
src=
"https://github.com/daming-lu/large_files/blob/master/keras_demo_figs/keras_image.png?raw=true"
/>
</p>
训练参数的柱状图的如下:
<p
align=
center
>
<img
width=
"70%"
src=
"https://github.com/daming-lu/large_files/blob/master/keras_demo_figs/keras_histogram.png?raw=true"
/>
</p>
完整的演示程序可以在
[
这里
](
./keras_mnist_demo.py
)
下载。
demo/keras/keras_mnist_demo.py
0 → 100644
浏览文件 @
ca59c51a
from
__future__
import
print_function
import
keras
from
keras.datasets
import
mnist
from
keras.models
import
Sequential
from
keras.layers
import
Dense
,
Dropout
,
Flatten
from
keras.layers
import
Conv2D
,
MaxPooling2D
from
keras
import
backend
as
K
from
visualdl
import
LogWriter
batch_size
=
2000
num_classes
=
10
epochs
=
10
# input image dimensions
img_rows
,
img_cols
=
28
,
28
# the data, shuffled and split between train and test sets
(
x_train
,
y_train
),
(
x_test
,
y_test
)
=
mnist
.
load_data
()
if
K
.
image_data_format
()
==
'channels_first'
:
x_train
=
x_train
.
reshape
(
x_train
.
shape
[
0
],
1
,
img_rows
,
img_cols
)
x_test
=
x_test
.
reshape
(
x_test
.
shape
[
0
],
1
,
img_rows
,
img_cols
)
input_shape
=
(
1
,
img_rows
,
img_cols
)
else
:
x_train
=
x_train
.
reshape
(
x_train
.
shape
[
0
],
img_rows
,
img_cols
,
1
)
x_test
=
x_test
.
reshape
(
x_test
.
shape
[
0
],
img_rows
,
img_cols
,
1
)
input_shape
=
(
img_rows
,
img_cols
,
1
)
x_train
=
x_train
.
astype
(
'float32'
)
x_test
=
x_test
.
astype
(
'float32'
)
x_train
/=
255
x_test
/=
255
print
(
'x_train shape:'
,
x_train
.
shape
)
print
(
x_train
.
shape
[
0
],
'train samples'
)
print
(
x_test
.
shape
[
0
],
'test samples'
)
# convert class vectors to binary class matrices
y_train
=
keras
.
utils
.
to_categorical
(
y_train
,
num_classes
)
y_test
=
keras
.
utils
.
to_categorical
(
y_test
,
num_classes
)
model
=
Sequential
()
model
.
add
(
Conv2D
(
32
,
kernel_size
=
(
3
,
3
),
activation
=
'relu'
,
input_shape
=
input_shape
))
model
.
add
(
Conv2D
(
64
,
(
3
,
3
),
activation
=
'relu'
))
model
.
add
(
MaxPooling2D
(
pool_size
=
(
2
,
2
)))
model
.
add
(
Dropout
(
0.25
))
model
.
add
(
Flatten
())
model
.
add
(
Dense
(
128
,
activation
=
'relu'
))
model
.
add
(
Dropout
(
0.5
))
model
.
add
(
Dense
(
num_classes
,
activation
=
'softmax'
))
model
.
compile
(
loss
=
keras
.
losses
.
categorical_crossentropy
,
optimizer
=
keras
.
optimizers
.
Adadelta
(),
metrics
=
[
'accuracy'
])
# create VisualDL logger
logdir
=
"/workspace"
logger
=
LogWriter
(
logdir
,
sync_cycle
=
100
)
# mark the components with 'train' label.
with
logger
.
mode
(
"train"
):
# create a scalar component called 'scalars/'
scalar_keras_train_loss
=
logger
.
scalar
(
"scalars/scalar_keras_train_loss"
)
image_input
=
logger
.
image
(
"images/input"
,
1
)
image0
=
logger
.
image
(
"images/image0"
,
1
)
image1
=
logger
.
image
(
"images/image1"
,
1
)
histogram0
=
logger
.
histogram
(
"histogram/histogram0"
,
num_buckets
=
50
)
histogram1
=
logger
.
histogram
(
"histogram/histogram1"
,
num_buckets
=
50
)
train_step
=
0
class
LossHistory
(
keras
.
callbacks
.
Callback
):
def
on_batch_end
(
self
,
batch
,
logs
=
{}):
global
train_step
# Scalar
scalar_keras_train_loss
.
add_record
(
train_step
,
logs
.
get
(
'loss'
))
# get weights for 2 layers
W0
=
model
.
layers
[
0
].
get_weights
()[
0
]
# 3 x 3 x 1 x 32
W1
=
model
.
layers
[
1
].
get_weights
()[
0
]
# 3 x 3 x 32 x 64
weight_array0
=
W0
.
flatten
()
weight_array1
=
W1
.
flatten
()
# histogram
histogram0
.
add_record
(
train_step
,
weight_array0
)
histogram1
.
add_record
(
train_step
,
weight_array1
)
# image
image_input
.
start_sampling
()
image_input
.
add_sample
([
28
,
28
],
x_train
[
0
].
flatten
())
image_input
.
finish_sampling
()
image0
.
start_sampling
()
image0
.
add_sample
([
9
,
32
],
weight_array0
)
image0
.
finish_sampling
()
image1
.
start_sampling
()
image1
.
add_sample
([
288
,
64
],
weight_array1
)
image1
.
finish_sampling
()
train_step
+=
1
history
=
LossHistory
()
model
.
fit
(
x_train
,
y_train
,
batch_size
=
batch_size
,
epochs
=
epochs
,
verbose
=
1
,
validation_data
=
(
x_test
,
y_test
),
callbacks
=
[
history
])
score
=
model
.
evaluate
(
x_test
,
y_test
,
verbose
=
0
)
print
(
'Test loss:'
,
score
[
0
])
print
(
'Test accuracy:'
,
score
[
1
])
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录