Я хочу создать 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 Бен, он выяснил, что проблема заключается в функции потерь. Он опубликовал код с регулярной функцией потерь, а затем он работает нормально. Однако с пользовательской функцией потери этот код не работает. Как могут видеть все читатели этого вопроса, я опубликовал функцию компенсации убытков выше, и есть проблема. В настоящее время я еще не знаю, почему эта ошибка существует, но это текущий статус.
В пользовательской потере - в какое измерении вы хотите применить максимальную функцию? Чтобы измерить размерность или размерность объекта? –
Обновлено мое сообщение, теперь оно должно работать. Он работает на моей стороне –