代码之家  ›  专栏  ›  技术社区  ›  Michael

训练多个模型:ValueError:变量hidden1/kernel已存在,不允许

  •  0
  • Michael  · 技术社区  · 6 年前

    我正在进行超参数搜索:

    for layer1_filters, layer1_kernels \
        in product(layer1_filters_list,layer1_kernels_list):
      cm = CifarModel()
      cm.build_train_validate_model(layer1_filters, layer1_kernels)
    

    哪里 build_train_validate_model 定义层:

    self.hidden1 = tf.layers.conv2d(self.input_layer, layer1_filters,
            layer1_kernels, activation=activation, name='hidden1')
    

    定义第二个候选模型时,在超参数搜索循环的第二次迭代中,我得到以下错误:

    ValueError: Variable hidden1/kernel already exists, disallowed.
    Did you mean to set reuse=True or reuse=tf.AUTO_REUSE in VarScope?
    

    cm = CifarModel() 因此,在多次调用 self.hidden1 = tf.layers.conv2d

    而且,在我加上

    tf.AUTO_REUSE = True
    

    在超参数搜索循环之前,问题仍然存在。


    # Build the model
    self.flat_features, self.flat_label = self.iterator.get_next()
    self.input_layer = self.flat_features
    self.hidden1 = tf.layers.conv2d(self.input_layer, layer1_filters,
            layer1_kernels, activation=activation)
    self.normal1 = tf.layers.batch_normalization(self.hidden1)
    self.hidden2 = tf.layers.conv2d(self.normal1, layer2_filters,
            layer2_kernels, activation=activation)
    self.normal2 = tf.layers.batch_normalization(self.hidden2)
    self.maxpool1 = tf.layers.max_pooling2d(self.normal2,
            (maxpool1_stride,maxpool1_stride), (maxpool1_stride,maxpool1_stride))
    self.hidden3 = tf.layers.conv2d(self.maxpool1, layer3_filters,
            layer3_kernels, activation=activation)
    self.maxpool2 = tf.layers.max_pooling2d(self.hidden3,
            (self.drop3.shape[1],self.drop3.shape[1]), (self.drop3.shape[1],self.drop3.shape[1]) )
    self.flat = tf.layers.flatten(self.maxpool2)
    self.logits = tf.layers.dense(self.flat, len(self.label_names))
    
    0 回复  |  直到 6 年前