首先说下目的,我是想用tensorflow训练一个神经网络模型并预测分类结果,这里在基本模型上增加了其他增强模型,对于神经网络实现这块采用的是Keras来构建网络层,下面是介绍的是学习的一些基本Keras框架的基本知识,同时解决了问题怎么在网络中插入自己写的层。
1、Keras的网络核心要点介绍
Keras的网络,其实是一个由多个子计算图构成的大计算图当这些子计算图是顺序连接时,称为Sequential,否则就是一般的model,我们称为泛型模型。
2、泛型模型
3、keras-Sequential模型
4、增加中间层
如果是只做数据上变化不引入学习参数可以通过增加lambda层实现;如果是存在学习参数需要自己写个回掉层,结构参考Keras内置的层的写法。
要在Keras中编写一个自己的层,需要开一个从Layer(或其他层)继承的类,除了__init__以为你需要覆盖三个函数:
build,这个函数用来确立这个层都有哪些参数,哪些参数是可训练的哪些参数是不可训练的
call,这个函数在调用层对象时自动使用,里面就是该层的计算逻辑,或计算图了。显然,这个层的核心应该是一段符号式的输入张量到输出张量的计算过程
get_output_shape_for:如果你的层计算后,输入张量和输出张量的shape不一致,那么你需要把这个函数也重新写一下,返回输出张量的shape,以保证Keras可以进行shape的自动推断。增加非学习层和学习层代码参考
【注:基本上三种方法,在keras-Sequential模型下:不增加学习参数-只做数据,可改变可增加lambda层;增加学习参数,需要自己写层格式参考其他层,或者不用keras-Sequential模型改成泛型模型这样就可以直接添加了】
5、编译训练模型
a.泛型模型训练
sess= K.get_session()
x_train_batch,y_train_batch = input_fn()
#转化输入为Keras的输入形式
modle_input = keras.Input(tensor = x_train_batch,shape = input_shape)
modle_output = 【模型输出】
train_model = Model(input=modle_input, output=modle_output)
#optimizer = Adam(lr=0.001, decay=1e-6)
optimizer = RMSprop(lr=0.001, rho=0.9, epsilon=1e-08, decay=0.95)
#optimizer = SGD(lr=0.001, decay=1e-6, momentum=0.9, clipnorm=1, clipvalue=10)
y_train_batch_out = keras.Input(tensor=y_train_batch, batch_shape =y_batch_shape, name='y_labels')
y_train_batch_out = K.cast(y_train_batch_out,dtype = 'float32')
#编译模型
train_model.compile(optimizer = optimizer,loss ='categorical_crossentropy',metrics = ['accuracy'],target_tensors = [y_train_batch_out])
train_model.summary()
coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(sess, coord)
tensorboard = tf.keras.callbacks.TensorBoard(log_dir=model_save_path)
#存储训练模型
train_model_checkpoint = tf.keras.callbacks.ModelCheckpoint(filepath=model_save_path+"/saved_model.h5")
#训练模型
train_model.fit(steps_per_epoch=100, epochs = epochs ,callbacks=[tensorboard, train_model_checkpoint])
coord.request_stop()
coord.join(threads)
K.clear_session()
注:这里导入的是tfrecord中解码的序列,input_fn()是经过dataset处理后数据(不知道的参看前面笔记),tensorboard的log和最终训练模型的权重都存储在model_save_path;其实主要就是几个函数Modle/compile/fit实现整个训练,评估和预测调用evaluate/predict即可,如果只做最终结果输出这个训练模型很方便
b. keras-Sequential训练模型
# 编译模型
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
# 训练模型
history = model.fit(X, Y, nb_epoch=100, batch_size=10)
# 评估模型
loss, accuracy = model.evaluate(X, Y)
print("\nLoss: %.2f, Accuracy: %.2f%%"% (loss, accuracy*100))
# 数据预测
probabilities = model.predict(X)
predictions = [float(round(x))forxinprobabilities]
accuracy = numpy.mean(predictions == Y)
print("Prediction Accuracy: %.2f%%"% (accuracy*100))
6、修改损失函数
网友评论