Keras适配模型:TypeError: unhashable type: 'numpy.ndarray'。

4

我实现了以下代码。它在之前版本的Keras中成功工作:

max_sequence = 56
input_dim = 26    

print("Build model..1")
first_input = Input(shape=(max_sequence,input_dim))
first_lstm = LSTM(5, return_sequences=True)(first_input)
first_bn = BatchNormalization()(first_lstm)
first_activation = Activation('tanh')(first_bn)
first_flat = Flatten()(first_activation)

print("Build model..2")
second_input = Input(shape=(max_sequence,input_dim))
second_lstm = LSTM(5, return_sequences=True)(second_input)
second_bn = BatchNormalization()(second_lstm)
second_activation = Activation('tanh')(second_bn)
second_flat = Flatten()(second_activation)

merge=concatenate([first_flat, second_flat])
merge_dense=Dense(3)(merge)
merge_bn = BatchNormalization()(merge_dense)
merge_activation = Activation('tanh')(merge_bn)
merge_dense2=Dense(1)(merge_activation)
merge_activation2 = Activation('tanh')(merge_dense2)

train_x_1 = np.reshape(np.array(train_x_1), [2999, 56, 26])
train_x_2 = np.reshape(np.array(train_x_2), [2999, 56, 26])


model=Model(inputs=[train_x_1,train_x_2], outputs=train_y_class)

optimizer = RMSprop(lr=0.5)
model.compile(optimizer=optimizer, loss='binary_crossentropy', metrics=['accuracy'])



history = model.fit([train_x_1, train_x_2], train_y_class, nb_epoch=300, batch_size=128,
                    validation_data=([val_x_1, val_x_2], val_y_class))

当运行时:

history = model.fit([train_x_1, train_x_2], train_y_class, nb_epoch=300, batch_size=128,
                    validation_data=([val_x_1, val_x_2], val_y_class))

以下错误发生:
TypeError: unhashable type: 'numpy.ndarray' accours.

所以我检查了 train_x_1train_x_2train_y_class。它们的类型是 <class 'numpy.ndarray'>。我已经搜索了一个解决方案,所以我尝试将其类型更改为元组,但没有奏效。
如果 numpy.ndarray 是不可哈希的,那么 model.fit 接收什么样的输入?
训练数据的形状如下:
train_x_1.shape
(2999, 56, 26)
train_x_2.shape
(2999, 56, 26)
train_y_class.shape
(2999, 1)
train_x_1的一个示例如下:
array([[[ 1.62601626e-02,  2.26890756e-01,  1.17764920e-02, ...,
          0.00000000e+00,  0.00000000e+00,  0.00000000e+00],
        [ 1.62601626e-02,  2.26890756e-01,  1.17764920e-02, ...,
          0.00000000e+00,  0.00000000e+00,  0.00000000e+00],
        [ 1.62601626e-02,  2.26890756e-01,  1.17764920e-02, ...,
          0.00000000e+00,  0.00000000e+00,  0.00000000e+00],
        ...,
        [ 1.62601626e-02,  2.26890756e-01,  1.17764920e-02, ...,
          0.00000000e+00,  0.00000000e+00,  0.00000000e+00],
        [ 1.62601626e-02,  2.26890756e-01,  1.17764920e-02, ...,
          0.00000000e+00,  0.00000000e+00,  0.00000000e+00],
        [ 1.62601626e-02,  2.26890756e-01,  1.17764920e-02, ...,
          0.00000000e+00,  0.00000000e+00,  0.00000000e+00]],

train_x_1,train_x_2,train_y_class 的个体元素类型也是 numpy.ndarray 吗?这可能是问题所在。如果是这种情况,您应该使用张量而不是嵌套的 ndarray。您能否发布这三个变量内容的样本? - Daneel R.
@DanielR。我发布了训练数据的形状和train_x_1的样本。我应该使用张量吗?嗯... - Lucas Kim
不是的,我原以为会出现错误,因为你使用了一些np.array的np.array,但事实并非如此。Input(shape=(max_sequence,input_dim))中输入的形状是否与您提供的输入一致?另外,如果train_x_1train_x_2应该成为同一个模型的输入,则最好将它们np.stack在一起,并将堆叠的数组馈送到模型中,而不是将两个张量作为列表的元素传递。train_x_1 = np.reshape(np.array(train_x_1)为什么要调用np.array? - Daneel R.
@DanielR。感谢您的回复。实际上,我将使用贝叶斯优化来调整每个LSTM的超参数。因此,两个模型不同。max_sequence = 56,input_dim = 26。在我的情况下,我应该使用什么形状..?我认为我必须使用np.array of np.array。 - Lucas Kim
@DanielR 抱歉,我的打字错误了。我应该使用什么类型? - Lucas Kim
显示剩余2条评论
1个回答

5
问题在于,在构建模型时,您直接传递了输入和输出数组(而不是输入和输出张量)给 Model 类:

问题在于,在构建模型时,您直接将输入和输出数组(而不是输入和输出张量)传递给Model类:

model = Model(inputs=[train_x_1,train_x_2], outputs=train_y_class)

相反,您需要像这样传递相应的输入和输出张量:

model = Model(inputs=[first_input,second_input], outputs=merge_activation2)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接