2017-02-08 4 views
2

Я хочу создать RNN с использованием последовательной модели Keras с бэкэндом tensorflow. Когда я реализовать следующий код:Вход для изменения представляет собой тензор с 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

Но что бы я ни измените значение batch_size на ошибку, просто следуйте следующей формуле:

Вход для изменения представляет собой тензор с значениями 2 * batch_size, но запрошенная форма h as 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 

РЕДАКТИРОВАТЬ 3: ОБНОВЛЕНИЕ

С помощью @Nassim Бен, он выяснил, что проблема заключается в функции потерь. Он опубликовал код с регулярной функцией потерь, а затем он работает нормально. Однако с пользовательской функцией потери этот код не работает. Как могут видеть все читатели этого вопроса, я опубликовал функцию компенсации убытков выше, и есть проблема. В настоящее время я еще не знаю, почему эта ошибка существует, но это текущий статус.

+0

В пользовательской потере - в какое измерении вы хотите применить максимальную функцию? Чтобы измерить размерность или размерность объекта? –

+0

Обновлено мое сообщение, теперь оно должно работать. Он работает на моей стороне –

ответ

0

EDIT: Этот код работает для меня, я только изменил потерю для простоты.

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) 

EDIT 2:

Так что ошибка исходит от функции потерь. В коде, который вы скопировали из github для потери ncce, у них были выходы формы (партия, 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-м измерении, потому что существуют вероятности, которые вы хотите вывести. Матричное умножение для создания max необходимо обновить также из-за формы ваших тензоров снова.

Это должно сработать.

Если вам нужно более подробные объяснения, не стесняйтесь спросить :-)

+0

x_train.shape = (512,600,103) и, y_train.shape = (512,600,2) Я не понимаю ваше предложенное решение. Потому что в последовательной модели ваш x должен быть тензором с тремя измерениями, не так ли? например: (образцы, последовательность, функции) – NeoTT

+0

ну, ваш код работает на моей машине, какая у вас конфигурация? Версия Keras, бэкэнд? И вы правы, я ответил слишком быстро. Ваш код в порядке на моей машине –

+0

Где я могу найти эти номера версий? – NeoTT

Смежные вопросы