我需要编写一个build-cnn函数,在其中它构建卷积神经网络中的所有层,但还包括诸如Dropout和Batch Normalization等正则化技术。
基本上,我一次只能试验一种正则化技术,以查看辍学和批处理规范之间的性能差异。因此,在创建模型时:
mynewmodel = MyModel(name="network", num_classes=len(classes),
feature_maps = 32, keep_prob = 0.5, batch_norm = None,
optimizer="adam",learning_rate = 0.001)
在上面,它正在创建使用辍学而不是批量归一化的模型。如果keep_prob值不是1 ,则使用dropout。退出规范和批处理规范不能同时使用。
我现在面临的问题是仅需要执行的build-cnn函数,
def my_cnn(self,x,reuse = False, name):
with tf.variable_scope(name, reuse=reuse):
conv1 = tf.nn.conv2D(.....)
if self.batch_norm != None: #if None then don't use batch normalization
conv1 = tf.layers.batch_normalization(...)
if self.keep_prob != 1: #if 1 then don't use dropout
conv1 = tf.nn.dropout(...)
在这种情况下,如果我在批处理规范和辍学层中包括 if语句,这是否正确,取决于哪种正则化技术被使用吗?
由于keep_prob为0.5,batch_norm为None,那么它将仅在cnn中创建辍学层。
答案 0 :(得分:0)
我只是一个初学者。我认为,也许如果您使用tf.nn.dropout
,您可能会像这样drop_out=tf.nn.dropout(conv1,keep_prob)
或使用'tf.nn.batch_normalization'而不是'tf.layer.batch_normalization'。而且我认为使用if statement
来确定应该使用哪个tec是正确的。
答案 1 :(得分:0)
批处理规范化和辍学都用于处理过度拟合,可以一起使用。虽然这需要大量的调整和测试。但是出于您的目的,是是,其他应该可以解决问题!
此外,由于您使用的是tensorflow,我建议使用tensorboard可视化您的图层并绘制模型运行图。