TensorFlow搭建和图片分类实例

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/该篇博客下的叙述。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值