当图片经历了最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链接在这儿, 待更新。