如何将列表输入到嵌入层?

时间:2019-11-29 09:23:40

标签: python-3.x machine-learning keras deep-learning

我有三个输入,稍后将它们串联在一起。 这些输入中有两个的形状为(1,),但是第三个是列表本身(每个列表25个元素)。 我正在尝试将这3个输入到嵌入层。但是第三个列表是一个错误:ValueError:新数组的总大小必须保持不变

def rec(n_users, n_movies, n_factors, min_rating, max_rating):

    user = Input(shape=(1,))
    u = Embedding(n_users, n_factors, embeddings_initializer='he_normal',
                  embeddings_regularizer=l2(1e-6))(user)
    u = Reshape((n_factors,))(u)

    movie = Input(shape=(1,))
    m = Embedding(n_movies, n_factors, embeddings_initializer='he_normal',
                  embeddings_regularizer=l2(1e-6))(movie)
    m = Reshape((n_factors,))(m)

    tags = Input(shape=(25,))
    t = Embedding(500, n_factors)(tags)
    t = Reshape((n_factors,))(t)

    x = Concatenate()([u, m, t])
    x = Dropout(0.05)(x)

    x = Dense(10, kernel_initializer='he_normal')(x)
    x = Activation('relu')(x)
    x = Dropout(0.5)(x)

    x = Dense(1, kernel_initializer='he_normal')(x)
    x = Activation('sigmoid')(x)

    x = Lambda(lambda x: x * (max_rating - min_rating) + min_rating)(x)
    model = Model(inputs=[user, movie, tags], outputs=x)
    opt = Adam(lr=0.001)
    model.compile(loss='mean_squared_error', optimizer=opt)
    return model

X_train_array看起来像这样:

[array([ 90, 291, 473, ..., 479,   5, 102], dtype=int64),
 array([1829,   98, 1321, ..., 4601,  748, 4522], dtype=int64),
 array([[  0,   0,   0, ..., 401, 201, 100],
        [  0,   0,   0, ..., 235, 100, 385],
        [  0,   0,   0, ..., 439, 487, 385],
        ...,
        [  0,   0,   0, ..., 471, 235, 100],
        [  0,   0,   0, ...,   0,   0, 100],
        [  0,   0,   0, ...,   0,   0, 221]], dtype=int64)]

1 个答案:

答案 0 :(得分:1)

所以,这是我为您的建议。这是我的解决方案的描述。您可以看到问题出在问号所在。此时,您需要执行一些转换才能连接并获得[None, 150]

enter image description here 顺便说一句,请注意,我做了一些小改动(不应该影响解决方案的正确性)。

  • 删除了l2正则化
  • 代替创建Adam优化器,将字符串'adam'传递给优化器参数
import tensorflow.keras.backend as K

def rec(n_users, n_movies, n_factors, min_rating, max_rating):

    user = Input(shape=(1,))
    u = Embedding(n_users, n_factors, embeddings_initializer='he_normal')(user)
    u = Reshape((n_factors,))(u)

    movie = Input(shape=(1,))
    m = Embedding(n_movies, n_factors, embeddings_initializer='he_normal')(movie)
    m = Reshape((n_factors,))(m)

    tags = Input(shape=(25,))
    t = Embedding(500, n_factors)(tags)
    t = Lambda(lambda x: K.mean(x, axis=1))(t)

    x = Concatenate()([u, m, t])
    x = Dropout(0.05)(x)

    x = Dense(10, kernel_initializer='he_normal')(x)
    x = Activation('relu')(x)
    x = Dropout(0.5)(x)

    x = Dense(1, kernel_initializer='he_normal')(x)
    x = Activation('sigmoid')(x)

    x = Lambda(lambda x: x * (max_rating - min_rating) + min_rating)(x)
    model = Model(inputs=[user, movie, tags], outputs=x)
    model.compile(loss='mean_squared_error', optimizer='adam')
    print(model.summary())
    return model