2014-05-13 38 views
2

我对Python很新,我目前正在使用我需要的大型字符串格式。格式化大字符串时出错 - 如何检测错误?

发生此问题,因为我不明白大字符串格式中发生错误的位置。更确切地说,我得到一个形式的错误

Traceback (most recent call last): 
    File "/usr/lib/python2.7/dist-packages/IPython/core/interactiveshell.py", line 2731, in run_code 
    exec code_obj in self.user_global_ns, self.user_ns 
    File "<ipython-input-3-f6a3bb7fe2f9>", line 13, in <module> 
    trainCV = trainCV % (train_params) 
ValueError: unsupported format character ',' (0x2c) at index 2726 

有没有一种方法来精确检测线路得到错误发生的地方?

我的完整代码如下所示:

trainCV = open('Conv_Constructor.yaml','r').read() 
train_params = {'batch_size': 100, 
        'output_channels_h2': 64, 
        'conv_kernel_size': 8, 
        'pool_size': 2, 
        'stride_size': 1, 
        'output_channels_h3': 64, 
        'num_classes': 6, 
        'valid_stop': 4200, 
        'test_start': 4200, 
        'test_stop': 4400, 
        'max_epochs': 5} 

trainCV = trainCV % (train_params) 
print trainCV 

而且Conv_Constructor.yaml文件我想作为一个字符串格式如下

# ---------- INPUTS --------- 
# 
#  batch_size 
#  output_channels_h2 
#  conv_kernel_size 
#  pool_size 
#  stride_size 
#  output_channels_h3 
#  num_classes 
#  valid_stop 
#  test_start 
#  test_stop 
#  max_epochs 

################################################################## 

!obj:pylearn2.train.Train { 
    dataset: !obj:pylearn2.official_train_data.load_data { 
     start: 0, 
     stop: 4000 
     # one_hot: 1, 
    }, 

    model: !obj:pylearn2.models.mlp.MLP { 
     batch_size: %(batch_size)i, 
     input_space: !obj:pylearn2.space.Conv2DSpace { 
      shape: [32, 32], 
      num_channels: 1, 
      axes = ('b',0,1,'c') 
     }, 

     layers: [ !obj:pylearn2.models.mlp.ConvRectifiedLinear { 
        layer_name: 'h2', 
        output_channels: %(output_channels_h2)i, 
        #params : !pkl: 'dae_layer_1_weights.plk', 
        irange: .05, 

        kernel_shape: [%(conv_kernel_size)i, %(conv_kernel_size)i], 

        pool_shape: [%(pool_size)i, %(pool_size)i], 

        pool_stride: [%(stride_size)i, %(stride_size)i], 

        max_kernel_norm: 1.9365 
       }, !obj:pylearn2.models.mlp.ConvRectifiedLinear { 
        layer_name: 'h3', 
        output_channels: %(output_channels_h3)i, 
        #params : !pkl: 'dae_layer_1_weights.plk', 
        irange: .05, 
        kernel_shape: %(conv_kernel_size)i, %(conv_kernel_size)i], 

        pool_shape:[%(pool_size)i, %(pool_size)i], 

        pool_stride: [%(stride_size)i, %(stride_size)i], 
        max_kernel_norm: 1.9365 


       }, !obj:pylearn2.models.mlp.Softmax { 
        max_col_norm: 1.9365, 
        layer_name: 'y', 
        n_classes: %(num_classes)i, 
        istdev: .05 
       } 
       ], 
    }, 

    algorithm: !obj:pylearn2.training_algorithms.sgd.SGD { 
     batch_size: %(batch_size)i, 
     learning_rate: .01, 
     init_momentum: .5, 
     monitoring_dataset: 
      { 
       'valid' : !obj:pylearn2.official_train_data.load_data { 
         start: 4000, 
         stop: %(valid_stop)i 
         #one_hot: 1, 
       }, 
       'test' : !obj:pylearn2.official_train_data.load_data { 
         start: %(test_start), 
         stop: %(test_stop) 
         #one_hot: 1, 
       } 
      }, 

     cost: !obj:pylearn2.costs.cost.SumOfCosts { costs: [ 
      !obj:pylearn2.costs.cost.MethodCost { 
       method: 'cost_from_X' 
      }, !obj:pylearn2.costs.mlp.WeightDecay { 
       coeffs: [ .00005, .00005, .00005 ] 
      } 
      ] 
     }, 
     termination_criterion: !obj:pylearn2.termination_criteria.And { 
      criteria: [ 
       !obj:pylearn2.termination_criteria.MonitorBased { 
        channel_name: "valid_y_misclass", 
        prop_decrease: 0.50, 
        N: 50 
       }, 
       !obj:pylearn2.termination_criteria.EpochCounter { 
        max_epochs: %(max_epochs)i 
       }, 
      ] 
     }, 
    }, 

    extensions: 
     [ !obj:pylearn2.train_extensions.best_params.MonitorBasedSaveBest { 
      channel_name: 'valid_y_misclass', 
      save_path: "%(save_path)s/convolutional_network_best.pkl" 
     }, !obj:pylearn2.training_algorithms.sgd.MomentumAdjustor { 
      start: 1, 
      saturate: 10, 
      final_momentum: .99 
     } 
    ] 
} 
+0

我不能肯定你被“检测线”的意思;异常会给你一个字符偏移量;你的文本文件在那个偏移处包含什么? –

+0

您最有可能拥有类似'%,'或'%2'或类似的序列,从'%'百分号开始,后跟有效的格式控制代码和逗号。 –

回答

2

你可以找到更多的错误很容易通过单独处理每条线而不是整个字符串。 更换

trainCV = trainCV % (train_params) 

trainCV = trainCV.split('\n') 
t1=[] 
try: 
    for i, t in enumerate(trainCV): 
     t1.append(t % (train_params)) 
except : 
    print 'Error in line {}:'.format(i) 
    print t[i] 
    raise 

,你会得到下面的输出:

78 
         start: %(test_start), 

这意味着你的字符串格式化也不太工作(在这种情况下,我认为是支架丢失后的i)。以这种方式调试你的大字符串,你应该有一个工作代码。

之后做到这一点,你可以通过加入列表打印:

print '\n'.join(t1) 
+0

谢谢你的好主意!从现在开始,我将使用这样的脚本来分别处理每行代码 – user1396713

+1

您好,我正在尝试将此代码适用于另一个案例,但我遇到了一个错误!代码中缺少什么?例如“enumerate()”是否正确?不应该枚举(TrainCV)? – user1396713

+0

是的,这当然是正确的。不知何故忘了。 –