2017-09-08 3 views
0

나는이 길쌈 신경망을 훈련하기 위해 노력하고있어하지만 문제는 내 마지막 층으로 무엇인지 알아낼 수 없습니다 .오류 확인 모델 대상 : 예상 dense_39은 3 개 차원을 가지고 있지만 모양으로 배열을 가지고하는 (940, 1)

model = Sequential() 
model.add(Conv1D(50, kernel_size=(1), 
       activation='relu', 
       input_dim=50)) 
model.add(Dense(32)) 
model.add(Dense(1)) 
model.summary() 
model.compile(loss=keras.losses.mean_squared_error, 
       optimizer=keras.optimizers.adam()) 

model.fit(X_train, y_train, 
      batch_size=940, 
      epochs=10, 
      verbose=1, 
      validation_data=(X_test, y_test)) 

모델 : 나는 문제가 마지막 층에 나는 단지 하나 개의 출력 노드를 가지고 있다는 의심 때문에

ValueError: Error when checking model target: expected dense_39 to have 3 dimensions, but got array with shape (940, 1)

:

_________________________________________________________________ 
Layer (type)     Output Shape    Param # 
================================================================= 
conv1d_26 (Conv1D)   (None, None, 50)   2550  
_________________________________________________________________ 
dense_38 (Dense)    (None, None, 32)   1632  
_________________________________________________________________ 
dense_39 (Dense)    (None, None, 1)   33   
================================================================= 
Total params: 4,215.0 
Trainable params: 4,215 
Non-trainable params: 0.0 
_________________________________________________________________ 

난 항상 다음과 같은 오류 메시지가 출력 치수가 2로 줄어 듭니다.

답변

3

1D 컨벌루션은 입력을 (BatchSize,length,channels)의 형식으로 예상합니다.
Keras는 이것을 (None,length,channels)으로보고합니다.

따라서 input_shape을 적절히 전달해야합니다.

model.add(Conv1D(50, kernel_size=(1), 
      activation='relu', 
      input_shape=(50,1))) 

그리고 당신의 X_train(NumberOfSamples, 50, 1) 모양되는 것을 다음과 있는지 확인하십시오 당신이 당신의 데이터에 하나의 채널이있는 경우로 정의해야합니다.

이것은 형태의 텐서를 출력합니다. (NumberOfSamples,50,50) - 첫 번째 50은 들어온 길이의 것이고 두 번째는 레이어에 정의 된 50 개 필터의 것입니다.

그런 다음 밀도가 높은 레이어는 2D 데이터가 아닌 병합 된 데이터를 기대합니다.

당신이 그랬던 것처럼 당신은 사용할 수 있습니다,하지만 그들은 여분의 차원을 유지할 것이며, 그 목적 될 것 같지 않습니다. 당신이 (내가 추측하고있어), 당신은 조밀 한 층을 사용하기 전에 데이터를 평평하게 할 필요가 마지막에 하나 개의 클래스를 원하는 경우

:

model.add(Flatten()) #this will transform (None, 50,50) into (None,2500) 
model.add(Dense(32)) 
model.add(Dense(1)) 

이 그런 다음 출력은 참으로 모양 (None,1)을 것이다 당신과 일치합니다 Y_train (940,1)