Ошибка при попытке определить input_size в первом слое 1D CNN - PullRequest
0 голосов

Я пытаюсь обучить 1D CNN распознавать неисправности подшипников, используя данные от WCRU. У меня возникают трудности при определении input_shape первого слоя моей модели. Мой train_X - это вектор с размерами (60800,1). Это код, который я использую:

X_train = numpy.loadtxt('training_dataX.txt',dtype=float)    
Y_train = numpy.loadtxt('training_dataY.txt',dtype=int)
X_test = numpy.loadtxt('testing_dataX.txt',dtype=float)
Y_test = numpy.loadtxt('testing_dataY.txt',dtype=int)

Y_train = np_utils.to_categorical(Y_train)                                     #one hot encode outputs
Y_test = np_utils.to_categorical(Y_test)
num_classes = Y_test.shape[1]

e=0.01                                                                         #create a callback to monitor the error to avoid overfitting
class myCallback(keras.callbacks.Callback):                                            
  def on_epoch_end(self, epoch, logs={}): 
      if(logs.get('val_loss') > e):   
          print("\nReached %2.2f%% error, so stopping training!!" %(e*100))   
          self.model.stop_training = True

def baseline_model():                                                          #building our sequential model
  model = Sequential()
  model.add(Conv1D(60,9,activation='tanh',padding='same',input_shape=(1,1)))
  model.add(MaxPooling1D(4))
  model.add(Conv1D(40,9,activation='tanh',padding='same'))
  model.add(MaxPooling1D(4))
  model.add(Conv1D(40,9,activation='tanh',padding='same'))
  model.add(Flatten())
  model.add(Dense(20,activation='tanh'))
  model.add(Dense(num_classes,activation='tanh'))
  model.compile(loss='categorical_crossentropy',optimizer='adam',metrics=['accuracy'])
  return model

model = baseline_model()                                                       #initialize fitting process
model.fit(X_train, Y_train, validation_data=(X_test,Y_test),epochs=100,batch_size=10,callbacks=['callbacks'])

scores = model.evaluate(X_test,Y_test,verbose=0)                               #final model evaluation
print('CNN Error: %.2f%%' % (100-scores[1]*100)) 

К сожалению, я получаю это сообщение об ошибке, я не могу выяснить причину:

ValueError: The shape of the input to "Flatten" is not fully defined (got (0, 40)). 
Make sure to pass a complete "input_shape" or "batch_input_shape" argument to the first layer in your model.

Я попытался изменить input_shape на ( 1,) но я получаю эту ошибку:

 ValueError: Input 0 is incompatible with layer conv1d_24: expected ndim=3, found ndim=2

Любые предложения будут оценены. Заранее спасибо.

1 Ответ

0 голосов
/ 17 апреля 2020

Прежде всего, поскольку вы делаете классификацию, конечная функция активации должна быть softmax, а не tanh. Во-вторых, если каждый пример является вектором измерения (60800, 1), необходимо передать его в качестве входной формы. Проверьте код ниже:

from tensorflow.keras.layers import Input, Convolution1D, MaxPooling1D, GlobalAveragePooling1D, UpSampling1D, Conv1D, Flatten, Dense
input_shape = (60800, 1)
num_classes = 10
model = Sequential()
model.add(Conv1D(60,9,activation='tanh',padding='same',input_shape=input_shape))
model.add(MaxPooling1D(4))
model.add(Conv1D(40,9,activation='tanh',padding='same'))
model.add(MaxPooling1D(4))
model.add(Conv1D(40,9,activation='tanh',padding='same'))
model.add(Flatten())
model.add(Dense(20,activation='tanh'))
model.add(Dense(num_classes,activation='softmax'))
model.summary()

РЕДАКТИРОВАТЬ

Я использовал num_classes, чтобы быть 10, потому что я не знаю количество классов, но вы можете изменить это соответственно.

...