>source

이진 분류를 수행하기 위해 임베딩 레이어가 있는 상태 저장 RNN을 피팅하고 있습니다. 함수 API에 필요한 batch_size 및 batch_shape에 약간의 혼란이 있습니다.

xtrain_padded.shape= (9600, 1403); xtest_padded.shape= (2400, 1403); ytest.shape= (2400,)
input_dim= size of tokenizer word dictionary
output_dim= 100 from GloVe_100d embeddings
number of SimpleRNN layer units= 200
h0: initial hidden states sampled from random uniform.
h0 object has the same shape as RNN layer hidden states obtained when return_state= True.

모델 구조:

batch_size= 2400  # highest common factor of xtrain and xtest
inp= Input(batch_shape= (batch_size, input_length), name= 'input')
emb_out= Embedding(input_dim, output_dim, input_length= input_length,
                         weights= [Emat], trainable= False, name= 'embedding')(inp)
rnn= SimpleRNN(200, return_sequences= True, return_state= True, stateful= True,
              batch_size= (batch_size, input_length, 100), name= 'simpleRNN')
h_0= tf.random.uniform((batch_size, input_length, 200))
rnn_out, rnn_state= rnn(emb_out, initial_state=h0)
mod_out= Dense(1, activation= 'sigmoid')(rnn_out)
# Extract the y_t's and h_t's:
model= Model(inputs=inp, outputs=[mod_out, rnn_out])
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['acc'])
model.summary()
_________________________________________________________________
Layer (type)                 Output Shape              Param #
=================================================================
input (InputLayer)           [(2400, 1403)]            0
_________________________________________________________________
embedding (Embedding)        (2400, 1403, 100)         4348900
_________________________________________________________________
simpleRNN (SimpleRNN)        [(2400, 1403, 200), (2400 60200
_________________________________________________________________
dense_3 (Dense)              (2400, 1403, 1)           201

모델 API를 사용하여 모델에 테스트 데이터를 맞출 때 문제 없음:

mod_out_allsteps, rnn_ht= model(xte_pad)  # Same as the 2 items from model.predict(xte_pad)
print(mod_out_allsteps.shape, rnn_ht.shape)
>> (2400, 1403, 1) (2400, 1403, 200)

그러나 내가 사용할 때 크기가 같지 않은 것과 관련하여 ValueError가 발생했습니다.모델핏.

model.fit(xte_pad, yte, epochs=1, batch_size= batch_size, verbose= 1)
>>    ValueError: Dimensions must be equal, but are 2400 and 1403 for '{{node binary_crossentropy_1/mul}}= Mul[T=DT_FLOAT](binary_crossentropy_1/Cast, binary_crossentropy_1/Log)' with input shapes: [2400,1], [2400,1403,200].

이 오류는 모델이 반환된 숨겨진 상태를 혼동했음을 시사하는 것 같습니다.rnn_ht데이터를 맞출 때 다른 것으로 [2400,1403,200] 모양을 만듭니다. 그러나 초기 은닉 상태, 즉 t= 1,..., 1403의 경우.

상태 저장 RNN의 차원과 혼동됩니다.

  1. stateful= True인 경우 하나의 미니 배치를 기반으로 모델을 구성하고 있습니까?
    즉, 각 레이어의 출력 형태에서 첫 번째 인덱스는 batch_size가 될까요?
  2. 첫 번째 레이어(Input)에서 설정할 batch_shape는 무엇인가요? 제대로 설정했나요?

오류와 혼란을 도와주셔서 미리 감사드립니다!


업데이트:

batch_size= 2400  # highest common factor of xtrain and xtest
input_length= 1403
output_dim= 100
inp= tf.keras.layers.Input(batch_shape= (batch_size, input_length), name= 'input')
emb_out=  tf.keras.layers.Embedding(500, output_dim, input_length= input_length, trainable= False, name= 'embedding')(inp)
rnn=  tf.keras.layers.SimpleRNN(200, return_sequences= True, return_state= False, stateful= True,
              batch_size= (batch_size, input_length, 100), name= 'simpleRNN')
rnn_ht= rnn(emb_out)  # hidden states at all steps
print(rnn_ht.shape)
>>>(2400, 1403, 200)
mod_out= Dense(1, activation= 'sigmoid')(Flatten()(rnn_ht))
# Extract the y_t's and h_t's:
model=  tf.keras.Model(inputs=inp, outputs=[mod_out, rnn_ht])
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['acc'])
model.summary()
_________________________________________________________________
Layer (type)                 Output Shape              Param #
=================================================================
input (InputLayer)           [(2400, 1403)]            0
_________________________________________________________________
embedding (Embedding)        (2400, 1403, 100)         50000
_________________________________________________________________
simpleRNN (SimpleRNN)        (2400, 1403, 200)         60200
_________________________________________________________________
flatten_4 (Flatten)          (2400, 280600)            0
_________________________________________________________________
dense_4 (Dense)              (2400, 1)                 280601
mod_out_allsteps, rnn_ht= model_ht(xte_pad)
print(mod_out_allsteps.shape, rnn_ht.shape)
>>>(2400, 1) (2400, 1403, 200)
But the error with ```model.fit``` persists.

  • 답변 # 1

    모델 요약의 마지막 레이어를 확인하세요. 매개변수를 설정했기 때문에return_sequences에게진실에서RNN레이어에서 입력과 동일한 수의 시간 단계와 각 시간 단계에 대해 200의 출력 공간을 가진 시퀀스를 얻습니다. 따라서 모양(2400, 1403, 200), 여기서 2400은 배치 크기입니다. 이 매개변수를 다음으로 설정하면거짓, 레이블에 모양이 있으므로 모든 것이 작동해야 합니다.(2400, 1).

    작업 예:

    import tensorflow as tf
    batch_size= 2400  # highest common factor of xtrain and xtest
    input_length= 1403
    output_dim= 100
    inp= tf.keras.layers.Input(batch_shape= (batch_size, input_length), name= 'input')
    emb_out=  tf.keras.layers.Embedding(500, output_dim, input_length= input_length, trainable= False, name= 'embedding')(inp)
    rnn=  tf.keras.layers.SimpleRNN(200, return_sequences= False, return_state= True, stateful= True,
                  batch_size= (batch_size, input_length, 100), name= 'simpleRNN')
    rnn_out, rnn_state= rnn(emb_out)
    mod_out=  tf.keras.layers.Dense(1, activation= 'sigmoid')(rnn_out)
    # Extract the y_t's and h_t's:
    model=  tf.keras.Model(inputs=inp, outputs=[mod_out, rnn_out])
    model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['acc'])
    model.summary()
    

    여기서 첫 번째 출력은 바이너리 결정입니다.

    업데이트 1: 사용단조롭게 하다:

    import tensorflow as tf
    batch_size= 2400  # highest common factor of xtrain and xtest
    input_length= 1403
    output_dim= 100
    inp= tf.keras.layers.Input(batch_shape= (batch_size, input_length), name= 'input')
    emb_out=  tf.keras.layers.Embedding(500, output_dim, input_length= input_length, trainable= False, name= 'embedding')(inp)
    rnn=  tf.keras.layers.SimpleRNN(200, return_sequences= True, return_state= True, stateful= True,
                  batch_size= (batch_size, input_length, 100), name= 'simpleRNN')
    rnn_out, rnn_state= rnn(emb_out)
    mod_out=  tf.keras.layers.Dense(1, activation= 'sigmoid')(tf.keras.layers.Flatten()(rnn_out))
    # Extract the y_t's and h_t's:
    model=  tf.keras.Model(inputs=inp, outputs=[mod_out, rnn_out])
    model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['acc'])
    model.summary()
    

    그 model.fit이 (2400,1403,200) 모양의 모든 단계에서 RNN 은닉 상태를 사용하여 모양(2400,1)을 가져야 하는 출력을 조정하려고 했습니다. return_sequences= False를 설정하여 최종 출력과 최종 은닉 상태를 모두 얻을 수 있습니다. 그렇지 않으면 True로 설정하지만 Model API에서 rnn_out을 제거하면 (2400,1403,1) (상태 제외) 모양의 모든 단계에서 출력을 얻습니다.

    siegfried2022-02-14 02:12:12

    단계에 대한 편도함수를 플로팅하려고 하기 때문에 (2400,1403,200) 모양의 은닉 상태를 얻고 모델 피팅도 잘 작동하는 것이 바람직합니다. 이것을 달성하는 방법이 있습니까?

    siegfried2022-02-14 02:12:12

    좋아, return_state= True를 사용하는 것이 가능합니다. 조밀한 계층에 공급되는 출력을 평면화하기만 하면 됩니다. 업데이트 된 답변을 참조하십시오.

    AloneTogether2022-02-14 02:12:12

    아이디어에 대한 Thx. 실제로 return_sequences= True, return_state= False를 설정하여 출력되는 RNN 레이어는 모든 단계(2400,1403,200) 모양의 숨겨진 상태입니다. 그러나 이 출력을 평면화하고 출력 레이어로 전달한 후 모델은 질문과 동일한 오류를 반환합니다(model.fit에서만).

    siegfried2022-02-14 02:12:12
  • 이전 Angular 라이브러리에 대한 스토리북 SCSS 가져오기 경로 설정
  • 다음 오류: laravel 8을 9로 업데이트하는 동안. 스크립트 @php artisan package:discover --ansi가 오류 code 1과 함께 반환된 post-autoload-dump 이벤트를 처리합니다.