1. win10+GPU+Keras+Tensorflow搭建
1.1 硬件配置
当前配置为:显卡 NIVDIA GTX 1050Ti,win10 64bit
1.2 安装流程
- 1.2.1 安装cuda_8.0.61_win10.exe (https://developer.nvidia.com/cuda-downloads),或者其他版本;
- 1.2.2 安装cudnn,cudnn-8.0-windows10-x64-v5.1 (英伟达官网上),将解压出的cuDNN三个文件夹下的文件(\bin, \include, \lib)复制到cuda对应的文件夹下;
- 1.2.3 下载Anaconda3 的win10 64bit 版,清华镜像(https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/),注意这里还是选择清华镜像好了,以防止报错;
- Anaconda3安装好之后,直接在windows命令窗口敲 Python 可以看到Python版本,并且并未报错;
- 1.2.4 创建tensorflow虚拟环境, 在Windows命令窗口输入 conda create -n tensorflow-gpu python=3.5
- 1.2.5 激活虚拟环境:在Windows命令窗口输入 activate tensorflow-gpu
- 1.2.6 安装GPU版本的TensorFlow: 在上一条命令后(TensorFlow的虚拟环境下),命令窗口接着输入:pip install --ignore-installed --upgrade https://storage.googleapis.com/tensorflow/windows/gpu/tensorflow_gpu_1.2.0_cp35-cp35m-win_amd64.whl;
- 1.2.7 测试一下,命令窗口依次输入:“python” “import tensorflow as tf”
- 1.2.8 安装keras: pip install keras
- 安装完成。
1.3 可能有的bug解决方法
测试import tensorflow as tf 报 “找不到DLL模块”,可能的原因是:没有安装visual studio,也有可能是cudnn版本有问题,换个版本试试就好了;
2. Keras图片分类
2.1 文件存放
图片分三类:Train, Test, Valid,放置格式如下,文件名即为类别名。
2.2 主函数
from _future_ import print_function
from _future_ import division
import os
from keras import callbacks
from keras.optimizers import Adam
import math
from selfNet import self_net
from keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array,load_img
from keras.utils import plot_model
import numpy as np
import h5py
if _name_ == "main":
#初始化设置
os.environ["CUDA_VISIBLE_DEVICES"] = '0'
logs_path = './classify_2Parts'
batch_size = 5
epochs = 2048
learning_rate = 1e-5
#训练集和验证集的数据增广
datagen = ImageDataGenerator(featurewise_center=True, rotation_range=5,
shear_range=0.2, zoom_range=0.2,horizontal_flip=True)
#测试集的数据增广
datagenTest = ImageDataGenerator(featurewise_center=True)
train_generator = datagen.flow_from_directory('./Train',batch_size=20,target_size=(200,200),color_mode='grayscale')
valid_generator = datagen.flow_from_directory('./Valid',batch_size=20,target_size=(200,200),color_mode='grayscale')
model = self_net(shape(200,200,1),conv_num = 32, class_num = 6)
opt = Adam(lr=learning_rate)
model.compile(optimizer=opt, loss='categorical_crossentropy', metrics=['accuracy'])
#保存训练权重
checkpoint_fn = os.path.join(logs_path,'checkpoint.{epoch:02d}-{val_loss:.2f}.h5')
checkpointer = callbacks.ModelCheckpoint(filepath=checkpoint_fn, verbose=1,save_best_only=True)
csv_fn = os.path.join(logs_path,'train_log.csv')
csv_logger = callbacks.CSVLogger(csv_fn)
#训练
model.fit_generator(train_generator, steps_per_epoch=math.ceil(600),epochs = epochs,
validation_data=valid_generator,
callbacks = [checkpointer, csv_logger])
#测试
#用已经训练好的权重测试
model.load_weights(os.path.join(logs_path,'checkpoint.17-1.07.h5'))
test_generator = datagenTest.flow_from_directory('./Test',batch_size=20,target_size=(200,200),color_mode='grayscale')
scoreseg = model.evaluate_generator(test_generator)
print("Accuracy = ", scoreseg[1])
2.3 self_net是自己定义的网络,它的代码如下:
from __future__ import print_function
from keras.layers import Conv2D, Input, Dense, Flatten, MaxPooling2D, Activation, BatchNormalization, Dropout
from keras.models import Model
from keras import backend as K
from keras.engine.topology import Layer
from keras.utils import plot_model
def self_net(shape = (None, 150,150,1), conv_num = 32, class_num = 2):
img_input = Input(shape)
#block1
x = Conv2D(conv_num, (3,3), activation='relu', padding='same', name='block1_conv1')(img_input)
x = Conv2D(conv_num, (3,3), activation='relu', padding='same', name='block1_conv2')(x)
x = MaxPooling2D((2,2), name = 'block1_pool')(x)
#block2
x = Conv2D(conv_num, (3,3), activation='relu', padding='same', name='block2_conv1')(x)
x = Conv2D(conv_num, (3,3), activation='relu', padding='same', name='block2_conv2')(x)
x = MaxPooling2D((2,2), name = 'block2_pool')(x)
#block3
x = Conv2D(conv_num * 2, (3,3), activation='relu', padding='same', name='block3_conv1')(x)
x = Conv2D(conv_num * 2, (3,3), activation='relu', padding='same', name='block3_conv2')(x)
x = MaxPooling2D((2,2), name = 'block3_pool')(x)
#block4
x = Conv2D(conv_num, (3,3), activation='relu', padding='same', name='block4_conv1')(x)
x = Conv2D(conv_num, (3,3), activation='relu', padding='same', name='block4_conv2')(x)
x = MaxPooling2D((2,2), name = 'block4_pool')(x)
#flatten
x = Flatten(x)
x = Dense(2048, activation = 'relu', name = 'fc1')(x)
x = Dropout(0.5)(x)
x = Dense(512, activation = 'relu', name = 'fc2')(x)
x = Dropout(0.5)(x)
x = Dense(128, activation = 'relu', name = 'fc3')(x)
x = Dropout(0.5)(x)
x = Dense(64, activation = 'relu', name = 'fc4')(x)
predictions = Dense(class_num, activation='softmax',name='predictions')(x)
model = Model(inputs = img_input, outsputs = predictions)
return model
if _name_ == 'main':
self_net = self_net(shape=(None,150,150,1),conv_num=32,class_num=6)
plot_model(self_net,to_file='self_net.pdf',show_shapes=True)
用这个网络得到的医学图像分类,测试效果并不好,改成VGG16会更好,但都没有大杀器 SVM+HOG效果好。
3. SVM+HOG的MATLAB实现图片分类
用SVM+HOG对医学图像分类,在测试集上的表现可以达到88%,目前看是最好的分类方法
具体实现代码可以参照https://blog.youkuaiyun.com/cuixing001/article/details/70908064/该篇博客下的叙述。