2014-05-13 41 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

是的,這當然是正確的。不知何故忘了。 –