1:首先,我给我的MixTest文件夹里面分好了类的图片进行重命名(因为分类的时候没有注意导致命名有点不好)
def load_data(path):
Rename the picture [a tool]
for eachone in os.listdir(path):
newname = eachone[7:]
os.rename(path+"\\"+eachone,path+"\\"+newname)
但是需要注意的是:我们按照类重命名了以后,系统其实会按照图片来排序。这个时候你会看到同一个类的被排序在了一块。这个时候你不要慌张,其实这个顺序是完全不用担心的。我们只是需要得到网络对某一个图片的输出是怎么样的判断标签。这个顺序对网络计算其权重完全是没有任何的影响的
2:我在Keras中使用InceptionV3这个模型进行训练,训练模型的过程啥的我在这里就不详细说了(毕竟这个东西有点像随记那样的东西)
我们在Keras的模型里面是可以通过
H.history["val_acc"]
H.history["val_loss"]
来的得到历史交叉准确率这样的指标
3:
对于每个epoch,我们都会计算一次val_acc和val_loss,我很希望保留下我最高的val_acc的模型,那该怎么办呢?
这个时候我就会使用keras的callback函数
H = model.fit_generator(train_datagen.flow(X_train, Y_train, batch_size=batchsize),
validation_data=(X_test, Y_test), steps_per_epoch=(X_train.shape[0]) // batchsize,
epochs=epoch, verbose=1, callbacks=[tb(log_dir='E:\John\log'),
save_function])
上面的参数先查查文档把。这里我就说说我的callbacks
callbacks=[tb(log_dir = 'E\John\log')]
这个是使用tensorboard来可视化训练过程的,后面是tensorboard的log输出文件夹的路径,在网络训练的时候,相对应的训练的状态就会保存在这个文件夹下
打开终端,输入
tensorboard --log_dir <your name of the log dir> --port <the port for tensorboard>
然后输入终端指示的网址在浏览器中打开,就可以在tensorboard中看到你训练的状态了
save_function:
这是一个类的实例化:
class Save(keras.callbacks.Callback):
def __init__(self):
self.max_acc = 0.0
def on_epoch_begin(self, epoch, logs=None):
pass
def on_epoch_end(self, epoch, logs=None):
self.val_acc = logs["val_acc"]
if epoch != 0:
if self.val_acc > self.max_acc and self.val_acc > 0.8:
model.save("kears_model_"+str(epoch)+ "_acc="+str(self.val_acc)+".h5")
self.max_acc = self.val_acc
save_function = Save()
这里继承了kears.callbacks.Callback
看看on_epoch_end:
在这个epoch结束的时候,我会得到它的val_acc
当这个val_acc为历史最大值的时候,我就保存这个模型
在训练结束以后,你就挑出acc最大的就好啦(当然,你可以命名为一样的,最后的到的模型就不用挑了,直接就是acc最大的模型了)