2017-04-03 72 views
1

我目前正试图训练一个有72个输入和一个输出的cnn网络,其长度为24,表示每个第三个输入72/24 = 3的一个类。有145个类。我如何解析我的输出标签到我的网络?

这是一个与随机生成数据集相似的例子 - 预处理步骤在模型函数内部执行,因为列车输入形状不一样,但是为了便于说明,此示例的形状保持一致。

# Creating train input: 
for i in range(974): 
    nano_train_input.append(np.random.random((78,684,4))) 
    nano_train_output.append(np.random.randint(145,size=(228)).tolist()) 

# Creating test input: 
for i in range(104): 
    nano_test_input.append(np.random.random((78,684,4))) 
    nano_test_output.append(np.random.randint(145,size=(228)).tolist()) 

def model(train_input, train_output, test_input, test_output, names=0): 

    print "Type:" 
    print type(train_input) 
    print type(train_output) 
    print type(test_input) 
    print type(test_output) 
    print 
    print "len:" 
    print len(train_input) 
    print len(train_output) 
    print len(test_input) 
    print len(test_output) 
    print 
    print "Type[0]:" 
    print type(train_input[0]) 
    print type(train_output[0]) 
    print type(test_input[0]) 
    print type(test_output[0]) 
    print 
    print "shape of [0]:" 
    print train_input[0].shape 
    print len(train_output[0]) 
    print test_input[0].shape 
    print len(test_output[0]) 
    raw_input("sad...") 
    #data_train_input = np.empty((0,72,78,3)) 
    data_train_input = [] 
    #data_test_input = np.empty((0,72,78,3)) 
    data_test_input = [] 
    # Paper uses dimension (40 x 45 =(15 * 3)) 
    # Filter size 5 
    # Pooling size 
    # I use dimension (78 x 72 = (24 * 3) 
    # Filter size 9 

    print "In model" 
    i = 0 
    print_once = True 
    data_train_output = [] 
    for matrix in train_input: 
     row,col,color = matrix.shape 
     #out = np.empty((0,78,3)) 
     out = [] 
     remove = (col/3)%24 
     remove_col = col%72 
     #print "Col: " + str(col) 
     #print "Removed output: " + str(remove) 
     #print "Removed input: " + str(remove_col) 
     #print "Before:" 
     #print len(train_output[i]) 
     if remove > 0: 
      train_output[i] = train_output[i][:-(remove)] 
     # print "After:" 
     # print len(train_output[i]) 
     #else: 
      #print "After:" 
      #print len(train_output[i]) 
     #raw_input("ASD") 
     for splits in chunks(train_output[i],24): 
      #print len(splits) 
      #print np.array(splits).shape 
      #data_train_output = np.append(data_train_output,[np.array(splits)],axis=0) 
      if len(splits) == 24: 
       data_train_output.append(np.array(splits)) 
     i=i+1 
     for feature_map in xrange((col-remove_col)): 
      #out = np.append(out,[matrix[:,feature_map,:-1]],axis=0) 
      out.append(matrix[:,feature_map,:-1]) 
      #print out.shape 
      if feature_map%72 == 0: 
       #data_train_input = np.append(data_train_input,[out],axis=0) 
       data_train_input.append(np.array(out)) 
       del out 
       out = [] 
     #print "Length of train-input: " + str(len(data_train_input)) 
     #print "Length of train-output: " + str(len(data_train_output)) 
     #raw_input("ASdsad") 
    print "done train-pit" 

    print "After train_output/input" 
    i = 0 
    data_test_output = [] 
    for matrix in test_input: 
     row,col,color = matrix.shape 
     out = [] 
     remove = (col/3)%24 
     remove_col = col%72 
     #print "Col: " + str(col) 
     #print "Removed output: " + str(remove) 
     #print "Removed input: " + str(remove_col) 
     #print "Before:" 
     #print len(test_output[i]) 
     if remove > 0: 
      test_output[i] = test_output[i][:-(remove)] 
     # print "After:" 
     # print len(test_output[i]) 
     #else: 
     # print "After - Not remove:" 
     # print len(test_output[i]) 
     #raw_input("ASD") 
     for splits in chunks(test_output[i],24): 
      if len(splits) == 24: 
       data_test_output.append(np.array(splits)) 
     i=i+1 
     for feature_map in xrange((col-remove_col)):   #out = np.append(out,[matrix[:,feature_map,:-1]],axis=0) 
      out.append(matrix[:,feature_map,:-1]) 
      if feature_map%72 == 0: 
       data_test_input.append(np.array(out)) #Maybe a reshape 
       del out 
       out = [] 
     #print "Length of train-input: " + str(len(data_test_input)) 
     #print "Length of train-output: " + str(len(data_test_output)) 
     #raw_input("ASdsad") 
    print "After test_output/input" 

    print "Length:" 
    print len(data_train_input) 
    print len(data_train_output) 

    print len(data_test_input) 
    print len(data_test_output) 

    print "Type;" 
    print type(data_train_input[0]) 
    print type(data_train_output[0]) 

    print "Size [0]" 
    print data_train_input[0].shape 
    print data_train_output[0].shape 

    print "asarray - type: " 
    print type(np.asarray(data_train_input)) 
    print type(np.asarray(data_train_output)) 

    print "asarray - shape: " 
    print np.asarray(data_train_input).shape 
    print np.asarray(data_train_output).shape 

    print "asarray [0]- shape: " 
    print np.asarray(data_train_input)[0].shape 
    print np.asarray(data_train_output)[0].shape 
    #raw_input("Ok?...") 

    list_of_input = [Input(shape = (78,3)) for i in range(72)] 
    list_of_conv_output = [] 
    list_of_max_out = [] 
    #list_of_flatten_out = [] 
    for i in range(72): 
     list_of_conv_output.append(Conv1D(filters = 32 , kernel_size = 6 , padding = "same", activation = 'relu')(list_of_input[i])) 
     list_of_max_out.append(MaxPooling1D(pool_size=3)(list_of_conv_output[i])) 
     #list_of_flatten_out.append(Flatten()(list_of_max_out[i])) 

    merge = keras.layers.concatenate(list_of_max_out) 

    reshape = Reshape((-1,))(merge) 

    dense1 = Dense(units = 500, activation = 'relu', name = "dense_1")(reshape) 
    dense2 = Dense(units = 250, activation = 'relu', name = "dense_2")(dense1) 
    dense3 = Dense(units = 24 , activation = 'softmax', name = "dense_3")(dense2) 

    model = Model(inputs = list_of_input , outputs = dense3) 
    model.compile(loss="sparse_categorical_crossentropy", optimizer="adam" , metrics = [metrics.sparse_categorical_accuracy]) 

    reduce_lr=ReduceLROnPlateau(monitor='val_loss', factor=0.1, patience=3, verbose=1, mode='auto', epsilon=0.01, cooldown=0, min_lr=0.000000000000000000001) 
    stop = EarlyStopping(monitor='val_loss', min_delta=0, patience=5, verbose=1, mode='auto') 

    print "Train!" 

    list_train_input = [] 
    list_test_input = [] 

    print model.summary() 

    for i in range(len(data_train_input)): 
     list_train_input.append(data_train_input[i]) 

    for i in range(len(data_test_input)): 
     list_test_input.append(data_test_input[i]) 

    hist_current = model.fit(x = [np.array(list_train_input[i]) for i in range(72)], 
         y = np.asarray(data_train_output), 
         shuffle=False, 
         validation_data=([np.array(list_test_input[i]) for i in range(72)],np.asarray(data_test_output)), 
         validation_split=0.1, 
         epochs=150000, 
         verbose=1, 
         callbacks=[reduce_lr,stop]) 


del test_input_data 
del test_name 
del test_input_data_normalized 
del test_name_normalized 
del test_input_data_interweawed 
del test_name_interweawed 
#del test_input_data_interweawed_normalized 
#del test_name_interweawed_normalized 

del train_input_data 
del train_name 
del train_input_data_normalized 
del train_name_normalized 
del train_input_data_interweawed 
del train_name_interweawed 
#del train_input_data_interweawed_normalized 
#del train_name_interweawed_normalized 

model(nano_train_input,nano_train_output,nano_test_input, nano_test_output) 

错误消息:

Traceback (most recent call last): 
    File "keras_cnn_phoneme_classification.py", line 456, in <module> 
    model(nano_train_input,nano_train_output,nano_test_input, nano_test_output) 
    File "keras_cnn_phoneme_classification.py", line 435, in model 
    callbacks=[reduce_lr,stop]) 
    File "/usr/local/lib/python2.7/dist-packages/keras/engine/training.py", line 1405, in fit 
    batch_size=batch_size) 
    File "/usr/local/lib/python2.7/dist-packages/keras/engine/training.py", line 1299, in _standardize_user_data 
    exception_prefix='model target') 
    File "/usr/local/lib/python2.7/dist-packages/keras/engine/training.py", line 133, in _standardize_input_data 
    str(array.shape)) 
ValueError: Error when checking model target: expected dense_3 to have shape (None, 1) but got array with shape (8766, 24) 

为什么会出现这个错误?

+0

可能想要阅读[问]和[mcve] ... – boardrider

+0

我加了一个完整的例子 – Loser

回答

1

一个几句话:

  1. 为什么你有len(data_train_input) = 9436len(data_train_output) = 9417?有更多的输入比输出...
  2. dense3 = Dense(1 ,activation = 'softmax')(dense2):这没有任何意义,有两个原因,首先激活:softmax将标准化输出,以便他们总结为1,如果你只有一个输出,由于激活,它总是会变成1。第二个原因,输出的数量:我看到你的目标的形状是(24,)...为什么你只输出最后一个密度的值?如果您尝试进行分类的类24之间改变你的最后一层:

    dense3 =密集(24,激活=“SOFTMAX”)(dense2)

  3. 有可能会被更多的错误,一旦你固定的,但我不能通过查看代码来一次调试它。

我希望这可以帮助一下。

+0

谢谢:) 1.我修正了这个问题。 2.我试图将其更改为24,这给出了相同的错误。 3. Ahh ..你已经知道了.. – Loser

+0

我仍然得到和以前一样的错误.. – Loser