2017-02-08 15 views
2

테라스 플로우 백엔드가있는 Keras 순차 모델을 사용하여 RNN을 만들고 싶습니다. 나는 다음과 같은 코드를 구현할 때 :reshape에 대한 입력은 2 * "batch_size"값을 갖는 텐서이지만 요청 된 모양에는 "batch_size"가 있습니다

batch_size = 8 
batch_inputshape = (batch_size,x_train.shape[1],x_train.shape[2]) 
print(batch_inputshape) #(8, 600, 103) 
​ 
model = Sequential() 
model.add(LSTM(103, 
       batch_input_shape = batch_inputshape, 
       return_sequences = True, 
       stateful = True)) 
model.add(Dropout(0.2)) 
​ 
model.add(LSTM(50, 
       return_sequences = True, 
       stateful = True)) 
model.add(Dropout(0.2)) 
​ 
​ 
model.add(TimeDistributed(Dense(10))) 
model.add(TimeDistributed(Dense(2))) 
model.add(Activation('softmax')) 
model.compile(loss= ncce, optimizer='adam') ​ 
​ 
print (model.output_shape) #(8, 600, 2) 

model.fit(x_train,y_train, batch_size = batch_size, 
          nb_epoch = 1, validation_split=0.25) 

을 나는 다음과 오류 메시지가 얻을 : 바꿀 수

입력 (16 개) 값으로 텐서입니다 만, 요청 된 형태는 8

그러나 어떤 I있다 batch_size를 다음 수식을 따르기 만하면됩니다 :

변형 입력은 2 * batch_size 값을 가진 텐서이지만 요청 된 sha pe가있다 batch_size

내가 다른 Q&A를 보았다. 그러나 나는 그들이 나를 많이 도와주지 않는다고 생각한다. 아니면 나는 해답을 충분히 이해하지 못한다.

도움이 될 것입니다.

EDIT : 입력 대상의 형상 요청한 :

print(x_train.shape) #(512,600,103) 
print(y_train.shape) #(512,600,2) 

EDIT 2

from functools import partial 
import keras.backend as K 
from itertools import product 
​ 
def w_categorical_crossentropy(y_true, y_pred, weights): 
    # https://github.com/fchollet/keras/issues/2115#issuecomment-274101310 # 
    nb_cl = len(weights) 
    final_mask = K.zeros_like(y_pred[:, 0]) 
    y_pred_max = K.max(y_pred, axis=1) 
    y_pred_max = K.reshape(y_pred_max, (K.shape(y_pred)[0], 1)) 
    y_pred_max_mat = K.cast(K.equal(y_pred, y_pred_max), K.floatx()) 
    for c_p, c_t in product(range(nb_cl), range(nb_cl)): 
     final_mask += (weights[c_t, c_p] * y_pred_max_mat[:, c_p] * y_true[:, c_t]) 
    return K.categorical_crossentropy(y_pred, y_true) * final_mask 
​ 
w_array = np.ones((2,2)) 
w_array[1, 0] = 100 
​ 
​ 
print(w_array) 
ncce = partial(w_categorical_crossentropy, weights=w_array) 
ncce.__name__ ='w_categorical_crossentropy 

EDIT 3 @Nassim 벤 도움 UPDATE

을 그는 문제가 손실 기능에 있다는 것을 알아 냈습니다. 그는 정기적 인 손실 함수를 사용하여 코드를 게시 한 다음 정상적으로 작동합니다. 그러나 사용자 지정 손실 기능을 사용하면 코드가 작동하지 않습니다. 이 질문에 대한 독자라면 위의 내 costum 손실 함수를 게시 한 것을 볼 수 있으며 문제가 있습니다. 현재 나는 왜이 오류가 존재하는지 아직 모르지만 이것은 현재 상태입니다.

+0

귀하의 최대 기능을 적용하고 싶은 귀하의 커스텀 손실에서? 치수 또는 피처 치수를 순서 지정 하시겠습니까? –

+0

내 게시물이 업데이트되었으므로 지금 작동합니다. 내 편에서 일하고있다 –

답변

0

편집 : 이 코드는 저에게 효과적이며 단순함을 위해 손실 만 변경했습니다.

import keras 
from keras.layers import * 
from keras.models import Sequential 
from keras.objectives import * 
import numpy as np 

x_train = np.random.random((512,600, 103)) 
y_train = np.random.random((512,600,2)) 
batch_size = 8 
batch_inputshape = (batch_size,x_train.shape[1],x_train.shape[2]) 
print(batch_inputshape) #(8, 600, 103) 

model = Sequential() 
model.add(LSTM(103, 
      batch_input_shape = batch_inputshape, 
      return_sequences = True, 
      stateful = True)) 
model.add(Dropout(0.2)) 
model.add(LSTM(50, 
      return_sequences = True, 
      stateful = True)) 
model.add(Dropout(0.2)) 


model.add(TimeDistributed(Dense(10))) 
model.add(TimeDistributed(Dense(2))) 
model.add(Activation('softmax')) 
model.compile(loss= "mse", optimizer='adam') 

print (model.output_shape) #(8, 600, 2) 

model.fit(x_train,y_train, batch_size = batch_size, 
         nb_epoch = 1, validation_split=0.25) 

편집 2 :

그래서 오류가 손실 함수에서 오는했다. ncce 손실에 대해 github에서 복사 한 코드에는 shape (batch, 10)의 출력이 있습니다. 모양의 출력 (배치, 600, 2)이 있습니다. 그래서 여기에 제 편집 기능이 있습니다 :

def w_categorical_crossentropy(y_true, y_pred, weights): 
# https://github.com/fchollet/keras/issues/2115#issuecomment-274101310 # 
    nb_cl = len(weights) 
    # Create a mask with zeroes 
    final_mask = K.zeros_like(y_pred[:,:,0]) 
    # get the maximum probability value for every output (shape = (batch,600,1)) 
    y_pred_max = K.max(y_pred, axis=2, keepdims=True) 
    # Get the actual predictions for every output (shape = (batch,600,2)) 
    # This K.equal uses broadcasting, we compare two tensors of different sizes but it works (magic) 
    y_pred_max_mat = K.equal(y_pred, y_pred_max) 
    for c_p, c_t in product(range(nb_cl), range(nb_cl)): 
     # Create the mask of weights to apply to the result of the cat_crossentropy 
     final_mask += (weights[c_t, c_p] * K.cast(y_pred_max_mat[:,:, c_p], K.floatx()) * y_true[:,:, c_t]) 
    return K.categorical_crossentropy(y_pred, y_true) * final_mask 

w_array = np.ones((2,2)) 
w_array[1, 0] = 100 

당신이 볼 수 있듯이, 나는 당신의 특정 모양 때문에 인덱스 재생을 수정했습니다. 마스크 모양 (배치, 600)이어야합니다. 최대 값은 출력하려는 ​​확률이 있기 때문에 3 차원에서 완료되어야합니다. 텐서의 모양 때문에 업데이트해야 할 최대 값을 다시 만드는 행렬 곱셈입니다.

이렇게하면됩니다.

더 자세한 설명이 필요하면

+0

x_train.shape = (512,600,103) 및 y_train.shape = (512,600,2) 제안 된 솔루션을 모르겠다. 순차적 모델에서 x는 3 차원의 텐서이어야합니다. 맞습니까? 예 : (샘플, 시퀀스, 기능) – NeoTT

+0

글쎄, 코드가 내 컴퓨터에서 실행되고 있는데, 설정은 무엇입니까? Keras 버전, 백엔드? 그리고 네 말이 맞아, 나는 너무 빨리 대답했다. 내 컴퓨터에서 코드가 정상적으로 작동합니다. –

+0

어디에서이 버전 번호를 찾을 수 있습니까? – NeoTT