【发布时间】:2019-03-22 21:01:55
【问题描述】:
我实现了以下代码。它在以前版本的 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_1、train_x_2、train_y_class。他们的类型是<class 'numpy.ndarray'>。我已经搜索了一个解决方案,所以我尝试将类型更改为元组,但它没有工作。
如果numpy.ndarray 不可散列,model.fit 接收什么类型的输入?
train数据的形状如下:
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。您能否发布这三个变量的内容示例? -
@DanielR。我发布了火车数据的形状和train_x_1的样本。我应该使用张量吗?嗯..
-
不,好的,我假设会抛出错误,因为您使用了一些 np.array 的 np.arrays,但事实并非如此。
Input(shape=(max_sequence,input_dim))中定义的输入形状是否与您提供的输入一致?此外,如果train_x_1和train_x_2应该是同一个模型的输入,最好将它们 np.stack 并将堆叠的数组提供给模型,而不是将两个张量作为列表的元素传递。train_x_1 = np.reshape(np.array(train_x_1)你为什么打电话给np.array? -
@DanielR。感谢回复。实际上,我将使用贝叶斯优化调整每个 LSTM 的超参数。所以,两个模型是不一样的。 max_sequence = 56,input_dim = 26。在我的情况下,我应该使用什么形状..?我想我必须使用 np.array 的 np.array..
-
@DanielR。对不起。我有错字。我应该使用什么类型?
标签: python numpy machine-learning keras lstm