(七) Keras 绘制网络结构和cpu,gpu切换

视频学习来源

https://www.bilibili.com/video/av40787141?from=search&seid=17003307842787199553

笔记


首先安装pydot

conda install pydot

会自动安装graphviz


如果出现TypeError: softmax() got an unexpected keyword argument 'axis' 错误,可降级keras或者用本文代码标黄的部分解决


切换cpu和gpu运算

https://www.cnblogs.com/jins-note/p/9756050.html

conda安装keras-gpu (conda会自动查询依赖安装需要的相关包,如TensorFlow)

(如果环境出现问题,用conda移除相关包,重新安装keras-gpu即可)

在导入keras前,插入代码

import os
os.environ["CUDA_DEVICE_ORDER"]="PCI_BUS_ID"
# The GPU id to use, usually either "0" or "1"
os.environ["CUDA_VISIBLE_DEVICES"] = "0"   #使用gpu
os.environ["CUDA_VISIBLE_DEVICES"] = "-1"  #为使用CPU  


import numpy as np
from keras.datasets import mnist  #将会从网络下载mnist数据集
from keras.utils import np_utils
from keras.models import Sequential  #序列模型
#Convolution2D 是2维卷积
#MaxPooling2D 是2维最大池化
#Flatten 数据扁平化(降维)
from keras.layers import Dense,Dropout,Convolution2D,MaxPooling2D,Flatten  #在这里导入dropout
from keras.optimizers import Adam
from keras.utils.vis_utils import plot_model
import matplotlib.pyplot as plt
import tensorflow as tf
#需要安装pydot和graphviz
#graphviz需要在官网安装,安装后需要添加环境变量,程序所在目录的bin文件夹加入系统变量


#载入数据
(x_train,y_train),(x_test,y_test)=mnist.load_data()
#查看格式
#(60000,28,28)
print('x_shape:',x_train.shape)
#(60000)
print('y_shape:',y_train.shape)

#转化为4维
#最后一个维度图片深度,1表示黑白,3表示彩色
#rgb是红绿蓝三通道0-255表示各个通道的颜色深度
#(60000,28,28)->(60000,28,28,1)
#-1表示自动设置
#除以255是做数据归一化处理
x_train=x_train.reshape(-1,28,28,1)/255.0 #转换数据格式
x_test=x_test.reshape(-1,28,28,1)/255.0 #转换数据格式
#label标签转换成 one  hot 形式
y_train=np_utils.to_categorical(y_train,num_classes=10) #分成10类
y_test=np_utils.to_categorical(y_test,num_classes=10) #分成10类

#定义序列模型
model=Sequential()

#第一个卷积层
#input_shape 输入平面
#filters 卷积核/滤波器个数
#kernel_size 卷积窗口大小
#strides 步长
#padding padding方式 same/valid
#activation 激活函数
model.add(Convolution2D(
    input_shape=(28,28,1),#只需要在第一次添加输入平面
    filters=32,
    kernel_size=5,
    strides=1,
    padding='same',
    activation='relu'
))

#平面大小28x28,用same padding得到的和上一次一样,也是28x28,有32个特征图
#池化后变成14x14,32个特征图

#第一个池化层
model.add(MaxPooling2D(
    pool_size=2,  # 池化窗口大小 2x2的窗口
    strides=2,
    padding='same'
))

#第二个卷积层
#filters=64 kernel_seize=5  
model.add(Convolution2D(64,5,strides=1,padding='same',activation='relu'))

#第二个卷积层后64个特征图,14x14
#第二个池化层后64个特征图,7x7

#第二个池化层
model.add(MaxPooling2D(2,2,'same'))

#把第二个池化层的输出扁平化为1维
#长度 64x7x7 
model.add(Flatten())

#第一个全连接层
#1024个神经元
model.add(Dense(1024,activation='relu'))

#Dropout
#训练时百分之40个神经元不工作
model.add(Dropout(0.4))

#第二个全连接层
model.add(Dense(10,activation=(tf.nn.softmax)))

##定义优化器
##学习速率为10的负4次方
#adam=Adam(lr=1e-4)
#
#
##定义优化器,损失函数,训练效果中计算准确率
#model.compile(
#    optimizer=adam, #sgd优化器
#    loss='categorical_crossentropy',  #损失用交叉熵,速度会更快
#    metrics=['accuracy'],  #计算准确率
#)
#
##训练
##六万张,每次训练64张,训练10个周期(六万张全部训练完算一个周期)
#model.fit(x_train,y_train,batch_size=64,epochs=10)
#
##评估模型
#loss,accuracy=model.evaluate(x_test,y_test)
#
#print('\ntest loss',loss)
#print('\ntest accuracy',accuracy)
#
#loss,accuracy=model.evaluate(x_train,y_train)
#
#print('\ntrain loss',loss)
#print('\ntrain accuracy',accuracy)


#TB代表从上往下,LR表示从左往右
plot_model(model,to_file='model.png',show_shapes=True,show_layer_names='False',rankdir='TB')
plt.figure(figsize=(20,20))
img=plt.imread('model.png')
plt.imshow(img)
plt.axis('off')
plt.show()


index

posted @ 2019-03-01 00:06  雪夜羽  阅读(1998)  评论(0编辑  收藏  举报