繁体   English   中英

我的输入层需要是什么形状? 我不断收到 ValueError:层“模型”需要 1 个输入,但它收到了 2 个输入张量

[英]What shape does my Input layer need to be? I keep getting ValueError: Layer "model" expects 1 input(s), but it received 2 input tensors

这是从该项目中获取代码并转换为 Keras 功能 API。 从这里取消了 model 的子类,并从inputs开始重新定义它。

我遇到的障碍是当我尝试安装 model 时出现以下错误。

ValueError: Layer "model" expects 1 input(s), but it received 2 input tensors. Inputs received: 
[<tf.Tensor 'IteratorGetNext:0' shape=(None,) dtype=int64>, <tf.Tensor 'IteratorGetNext:1' shape=(None,) dtype=int64>]

所以我的初始张量的形状一定是错误的——但我不确定如何进行,因为我尝试了几种不同的方法,但似乎没有任何意义。

import math
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

from tensorflow import keras
from tensorflow.keras import layers
# Import CF Model Architecture
from CFModel import CFModel

RNG_SEED = 42

# Reading ratings file
ratings = pd.read_csv('data/ratings.csv', sep='\t', encoding='latin-1', 
                      usecols=['user_id', 'movie_id', 'user_emb_id', 'movie_emb_id', 'rating'])
max_userid = ratings['user_id'].drop_duplicates().max()
max_movieid = ratings['movie_id'].drop_duplicates().max()

# Reading ratings file
users = pd.read_csv('data/users.csv', sep='\t', encoding='latin-1', 
                    usecols=['user_id', 'gender', 'zipcode', 'age_desc', 'occ_desc'])

# Reading ratings file
movies = pd.read_csv('data/movies.csv', sep='\t', encoding='latin-1', 
                     usecols=['movie_id', 'title', 'genres'])

# Create training set
shuffled_ratings = ratings.sample(frac=1., random_state=RNG_SEED)

# Shuffling users
Users = shuffled_ratings['user_emb_id'].values
print( 'Users:', Users, ', shape =', Users.shape)
# Users: [5411 5439  367 ...  853 4032  785] , shape = (1000209,)

# Shuffling movies
Movies = shuffled_ratings['movie_emb_id'].values
print( 'Movies:', Movies, ', shape =', Movies.shape)
# Movies: [2682  903 3716 ... 3101 3478 1390] , shape = (1000209,)

# Shuffling ratings
Ratings = shuffled_ratings['rating'].values
print( 'Ratings:', Ratings, ', shape =', Ratings.shape)
# Ratings: [2 5 4 ... 3 5 4] , shape = (1000209,)

K_FACTORS = 100 # The number of dimensional embeddings for movies and users
TEST_USER = 2000 # A random test user (user_id = 2000)
# Define model

inputs = layers.Input(shape=(1000209, 100)) # What should this input be? 

embeddingUsers = layers.Embedding(max_userid, K_FACTORS, input_length=1)
usersEmbedded = embeddingUsers(inputs)

embeddingMovies = layers.Embedding(max_movieid, K_FACTORS, input_length=1)
moviesEmbedded = embeddingMovies(inputs)

inputs = layers.Dot(axes=1)([usersEmbedded, moviesEmbedded])

outputs = layers.Dense(5, activation='relu')(inputs)

model = keras.Model(inputs=inputs, outputs=outputs)
keras.utils.plot_model(model, "my_first_model_with_shape_info.png", show_shapes=True)

print(model.summary())
#  Layer (type)                Output Shape              Param #
# =================================================================
#  input_2 (InputLayer)        [(None, 100, 100, 100, 1  0
#                              00)]

#  dense (Dense)               (None, 100, 100, 100, 5)  505

# =================================================================
# Total params: 505
# Trainable params: 505
# Non-trainable params: 0
# _________________________________________________________________

model.compile(optimizer="rmsprop", loss="mse")

history = model.fit(
    [Users, Movies],
    Ratings,
    epochs=10,
    batch_size=32,
    validation_split=0.2,
) 

# ValueError: Layer "model" expects 1 input(s), but it received 2 input tensors. Inputs received: 
# [<tf.Tensor 'IteratorGetNext:0' shape=(None,) dtype=int64>, <tf.Tensor 'IteratorGetNext:1' shape=(None,) dtype=int64>]

我认为你混淆了一些事情。 您引用并尝试转换为具有功能ModelCFModel的 CFModel 包含两个Sequential子模型。 如果要将两个输入传递给 model,它应该有两个Input层:

import tensorflow as tf

max_userid = 5000
max_movieid = 5000
K_FACTORS = 100
user_input = tf.keras.layers.Input(shape=(1,))
movie_input = tf.keras.layers.Input(shape=(1,))

embedding_users = tf.keras.layers.Embedding(max_userid, K_FACTORS, input_length=1)
users_embedded = embedding_users(user_input)

embedding_movies = tf.keras.layers.Embedding(max_movieid, K_FACTORS, input_length=1)
movies_embedded = embedding_movies(movie_input)

inputs = tf.keras.layers.Dot(axes=1)([users_embedded, movies_embedded])
outputs = tf.keras.layers.Dense(5, activation='relu')(inputs)
model = tf.keras.Model(inputs=[user_input, movie_input], outputs=outputs)

tf.keras.utils.plot_model(model, "my_first_model_with_shape_info.png", show_shapes=True)

print(model.summary())

model.compile(optimizer="rmsprop", loss="mse")

history = model.fit(
    [Users, Movies],
    Ratings,
    epochs=10,
    batch_size=32,
    validation_split=0.2,
) 
Model: "model_1"
__________________________________________________________________________________________________
 Layer (type)                   Output Shape         Param #     Connected to                     
==================================================================================================
 input_4 (InputLayer)           [(None, 1)]          0           []                               
                                                                                                  
 input_5 (InputLayer)           [(None, 1)]          0           []                               
                                                                                                  
 embedding_2 (Embedding)        (None, 1, 100)       500000      ['input_4[0][0]']                
                                                                                                  
 embedding_3 (Embedding)        (None, 1, 100)       500000      ['input_5[0][0]']                
                                                                                                  
 dot_1 (Dot)                    (None, 100, 100)     0           ['embedding_2[0][0]',            
                                                                  'embedding_3[0][0]']            
                                                                                                  
 dense_1 (Dense)                (None, 100, 5)       505         ['dot_1[0][0]']                  
                                                                                                  
==================================================================================================
Total params: 1,000,505
Trainable params: 1,000,505
Non-trainable params: 0
__________________________________________________________________________________________________
None

在此处输入图像描述

由于UsersMovies都具有形状(1000209,) ,因此两个Input层的输入形状都是shape=(1,) 这意味着每个样本都包含一个 ID,该 ID 使用Embedding层映射到 100 维向量。 哦,以防万一, CFModel在计算点积后不使用Dense层。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM