应用Keras模型时py_call_impl()错误

时间:2019-07-14 10:46:23

标签: python r tensorflow keras

我正在关注本教程:

https://blogs.rstudio.com/tensorflow/posts/2017-12-22-word-embeddings-with-keras/

我遇到两个错误:

这里一个:

> library(reticulate)
Error in value[[3L]](cond) : 
  Package ‘reticulate’ version 1.12 cannot be unloaded:
 Error in unloadNamespace(package) : namespace ‘reticulate’ is imported by ‘tensorflow’, ‘keras’ so cannot be unloaded

我决定继续查看代码是否在没有reticulate的情况下工作。直到一切都很好。

> model %>%
+   fit_generator(
+     skipgrams_generator(reviews, tokenizer, skip_window, negative_samples), 
+     steps_per_epoch = 100000, epochs = 5
+   )
 Error in py_call_impl(callable, dots$args, dots$keywords) : 
  ValueError: Error when checking model input: the list of Numpy arrays that you are passing to your model is not the size the model expected. Expected to see 2 array(s), but instead got the following list of 1 arrays: [array([[[   11],
        [    2],
        [    7],
        ...,
        [  125],
        [11461],
        [11461]],

       [[15529],
        [ 9344],
        [ 8413],
        ...,
        [   24],
 ... 

但是昨天它仍然有效,但是由于我想使用GPU版本,因此我对kerastensorflow安装进行了许多更改。

关于如何解决的任何想法?

> dim(target_vector)
[[1]]
NULL

[[2]]
[1] 128

> dim(context_vector)
[[1]]
NULL

[[2]]
[1] 128

> dim(dot_product)
[[1]]
NULL

[[2]]
[1] 1

> dim(output)
[[1]]
NULL

[[2]]
[1] 1

教程中的代码:

download.file("https://snap.stanford.edu/data/finefoods.txt.gz", "finefoods.txt.gz")

library(readr)
library(stringr)
reviews <- read_lines("finefoods.txt.gz") 
reviews <- reviews[str_sub(reviews, 1, 12) == "review/text:"]
reviews <- str_sub(reviews, start = 14)
reviews <- iconv(reviews, to = "UTF-8")

head(reviews, 2)

library(keras)
tokenizer <- text_tokenizer(num_words = 20000)
tokenizer %>% fit_text_tokenizer(reviews)




#
library(reticulate)
library(purrr)
skipgrams_generator <- function(text, tokenizer, window_size, negative_samples) {
  gen <- texts_to_sequences_generator(tokenizer, sample(text))
  function() {
    skip <- generator_next(gen) %>%
      skipgrams(
        vocabulary_size = tokenizer$num_words, 
        window_size = window_size, 
        negative_samples = 1
      )
    x <- transpose(skip$couples) %>% map(. %>% unlist %>% as.matrix(ncol = 1))
    y <- skip$labels %>% as.matrix(ncol = 1)
    list(x, y)
  }
}



embedding_size <- 128  # Dimension of the embedding vector.
skip_window <- 5       # How many words to consider left and right.
num_sampled <- 1       # Number of negative examples to sample for each word.


input_target <- layer_input(shape = 1)
input_context <- layer_input(shape = 1)


embedding <- layer_embedding(
  input_dim = tokenizer$num_words + 1, 
  output_dim = embedding_size, 
  input_length = 1, 
  name = "embedding"
)

target_vector <- input_target %>% 
  embedding() %>% 
  layer_flatten()

context_vector <- input_context %>%
  embedding() %>%
  layer_flatten()


dot_product <- layer_dot(list(target_vector, context_vector), axes = 1)
output <- layer_dense(dot_product, units = 1, activation = "sigmoid")


model <- keras_model(list(input_target, input_context), output)
model %>% compile(loss = "binary_crossentropy", optimizer = "adam")


summary(model)


model %>%
  fit_generator(
    skipgrams_generator(reviews, tokenizer, skip_window, negative_samples), 
    steps_per_epoch = 100000, epochs = 5
  )

0 个答案:

没有答案