眼底图分类(二) 初试keras-sequential模型


当图片经历了最naive的预处理后,我决定用最naive的方法跑一遍图像分类的流程。  

于是会遇到三个主要突破口: 

1. 熟悉keras框架的sequential模型。 

2. 熟悉如何在中间记录训练的参数,方便后面debug

3. 熟悉在远程服务器上跑通自己的代码 


一. keras的sequential模型初探

1. 最主要的肯定是看它的官方链接咯~ 讲真无论是安装、还是快速上手,写的真的好。 英语不好的话配合google翻译一起用效率更佳~

2. 首先新建一个模型 self.model = Sequential()

3. 然后就可以一层层往里加了,以我的简历模型的第一个block(conv-pool-conv-pool)为例的话就是

def comment_build(self):
        self.model = Sequential()
	#block 1
        self.model.add(Conv2D(32, (3,3),  input_shape=(512, 512, 3), kernel_regularizer=l2(0.01), bias_regularizer=l2(0.01),  padding='same',name='block1_conv1'))
        self.model.add(LeakyReLU(alpha=0.01)) 
        self.model.add(BatchNormalization())
        self.model.add(MaxPooling2D((3, 3), strides=(2, 2), name='block1_pool1'))
        self.model.add(Conv2D(32, (3,3), kernel_regularizer=l2(0.01), bias_regularizer=l2(0.01), padding='same', name='block1_conv2'))
        self.model.add(LeakyReLU(alpha=0.01))
        self.model.add(BatchNormalization())
        self.model.add(MaxPooling2D((3, 3), strides=(2, 2), name='block1_pool2'))

这里第2行的LeakyRelu也可以作为第一行的一个arguments,能运行但是会给warning

4. 第4步是compile 

sgd = SGD(lr=lr, decay=decay, momentum=0.9, nesterov=False)
self.model.compile(optimizer=sgd, loss='categorical_crossentropy',
                metrics=['categorical_accuracy', sensi, speci]) 

optimizer最常见的就是rmsprop & adagrad  loss最常见的就是⬆️和mse

metrics后面的是可以自定义的函数(例如这里的sensi, speci,一般输入都依次是y_true, y_pred)。 

5. 最后一步就是训练 model.fit

hs = self.model.fit_generator(train_generator,
                                steps_per_epoch = len(y_train)/batch_size,
                                epochs = epoch,
                                verbose = 2,
                                validation_data = validate_generator,
                                validation_steps = len(y_valid),
                                initial_epoch = 0                
                                )
     训练时可以用更容易上手的fit,也可以用我的fit_generator 

二. 关于记录参数

1. 首先还是看callbacks的官方文档咯

2. 我这里主要用到了它的3个子函数

  1)History:  如最直白的中文翻译

 hs = History()
hs = self.model.fit_generator(train_generator,....)
df = pd.DataFrame(hs.history)   #pd是pandas的缩写。 它的官方文档写的也很好

df.to_csv('%s_hist.csv' % time.strftime("%Y%m%d%H%M%S", time.localtime()))

  2)  TensorBoard: 用来打印train&test中的metrics

tb = TensorBoard(log_dir='logs', histogram_freq=5)  #意思是会保存到logs文件夹里, 每个epoch打印5次activation&weight histograms

  3)  EarlyStopping:  在训练中实时监测,如果监测量没有变更优就提前结束训练。 

es = EarlyStopping(monitor='loss', min_delta=0.0008, patience=2, mode='min',verbose = 0)
      #检测loss 如果连续2轮的min(decrease) 都

         最后结合成一个arguments callbacks = [tb, hs, es] 放到model.fit里。


三. 在远程服务器上跑通自己的程序

1. 配置安装包

pip install upgrade virtualenv

virtualenv .env
source .env/bin/activate
pip install --upgrade tensorflow
pip install keras
pip install pandas
pip install pillow
pip install -U scikit-learn

反正这里就只想感叹一下virtualenv大法好,我在mac和linux服务器上都用⬆️的法子配置好的。一开始在mac上各种sudo 感觉自己就像个傻子 emmm

2. 可能会用到scp指令跨服务器拷贝图片 

           我是参考的这个链接,感觉写的很赞。我用的是 scp -r local_folder remote_username@remote_ip:remote_folder  就可以拷贝文件夹了~

3.  防止因为电脑断线程序down掉。

还记得昨天那个月黑风高的晚上,我在0:03终于跑通了程序离开软件园,回校的路上遇到了各种发丝在风中乱扬的同类。然后,今天早上到实验室迎接我的就一个packet_write_wait: Connection to 192.168.0.15 port 22: Broken pipe的bug...emmm....

其实解决起来还是挺容易的,详见这里, 我用了其中的screen的法子,目前还挺顺溜。。 


以上。 代码和人都比较naive,欢迎指正,不胜感激。

代码github链接在这儿, 待更新。


你可能感兴趣的:(AI,in,healthcare眼底图识别)