我有三个输入,稍后将它们串联在一起。 这些输入中有两个的形状为(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)]
答案 0 :(得分:1)
所以,这是我为您的建议。这是我的解决方案的描述。您可以看到问题出在问号所在。此时,您需要执行一些转换才能连接并获得[None, 150]
。
顺便说一句,请注意,我做了一些小改动(不应该影响解决方案的正确性)。
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