首页 > 解决方案 > Tensorflow - RuntimeError:无法在 Tensorflow 图函数中获取值

问题描述

我正在尝试使用 TensorFlow 中的 Keras 功能 API 创建一个循环神经网络。RNN 接收推文并将其分类为正面或负面。

attention_input = keras.Input(shape=(512,), name='attention')
a = keras.layers.Dense(1, activation='sigmoid')(attention_input)
attention_output = keras.layers.Multiply()([attention_input, a])
attention = keras.Model(inputs=attention_input, outputs=attention_output, name='attention_model')


inputs1 = keras.Input(shape=(100,), name='lstm')
x = keras.layers.Embedding(len(tokenizer.word_counts)+1, 
                           100,
                           weights=[embedding_matrix],
                           input_length=100,
                           trainable=True)(inputs1)
x = keras.layers.Bidirectional(tf.keras.layers.LSTM(256, return_sequences=True))(x)        
x = keras.layers.TimeDistributed(attention)(x)
x = tf.unstack(x, num=256)
t_sum = x[0]
for i in range(256 - 1):
      t_sum = keras.layers.Add()([t_sum, x[i+1]]) 
lstm = keras.Model(inputs=inputs1, outputs=t_sum, name='lstm_model')


inputs2 = keras.Input(shape=(100,), name='dense')
x = keras.layers.Dense(256, activation='relu')(inputs2)
x = keras.layers.Dropout(0.2)(x)
x = keras.layers.Dense(128, activation='relu')(x)
x = keras.layers.Dropout(0.2)(x)
outputs2 = keras.layers.Dense(1, activation='sigmoid')(x)
dense = keras.Model(inputs=inputs2, outputs=outputs2, name='txt_model')


inputs = keras.Input(shape=(100,), name='text')
x = lstm(inputs)
outputs = dense(x)
model = keras.Model(inputs=inputs, outputs=outputs, name='text_model')


model.compile(
     loss = 'binary_crossentropy',
     optimizer = 'adam',
     metrics = ['acc',
                 tf.keras.metrics.Precision(),
                 tf.keras.metrics.Recall()])

我收到以下运行时错误

2019-04-13 10:29:34.855192: I tensorflow/core/platform/cpu_feature_guard.cc:142] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2
Traceback (most recent call last):
  File ".\main.py", line 25, in <module>
    ' -> '.join(permutation).lower() : { ** results.get(' -> '.join(permutation).lower(), {}), ** framework.runtime.evaluate(path, permutation, classifiers, cached) }
  File "C:\Users\steff\Desktop\Skole\MsT\framework\framework\runtime.py", line 30, in evaluate
    classifier.lower() : framework.classifiers.list[classifier.lower()](data)
  File "C:\Users\steff\Desktop\Skole\MsT\framework\framework\classifiers\rnn.py", line 93, in evaluate
    x       = lstm(inputs)
  File "C:\Users\steff\AppData\Roaming\Python\Python36\site-packages\tensorflow\python\keras\engine\base_layer.py", line 612, in __call__
    outputs = self.call(inputs, *args, **kwargs)
  File "C:\Users\steff\AppData\Roaming\Python\Python36\site-packages\tensorflow\python\keras\engine\network.py", line 870, in call
    return self._run_internal_graph(inputs, training=training, mask=mask)
  File "C:\Users\steff\AppData\Roaming\Python\Python36\site-packages\tensorflow\python\keras\engine\network.py", line 1011, in _run_internal_graph
    output_tensors = layer(computed_tensors, **kwargs)
  File "C:\Users\steff\AppData\Roaming\Python\Python36\site-packages\tensorflow\python\keras\engine\base_layer.py", line 669, in __call__
    self.set_weights(self._initial_weights)
  File "C:\Users\steff\AppData\Roaming\Python\Python36\site-packages\tensorflow\python\keras\engine\base_layer.py", line 938, in set_weights
    param_values = backend.batch_get_value(params)
  File "C:\Users\steff\AppData\Roaming\Python\Python36\site-packages\tensorflow\python\keras\backend.py", line 2837, in batch_get_value
    raise RuntimeError('Cannot get value inside Tensorflow graph function.')
RuntimeError: Cannot get value inside Tensorflow graph function.

我可以从错误中看出它与我的 LSTM 模型有关,但我看不出问题的原因。

标签: pythontensorflowneural-network

解决方案


我认为您使用的是 Tensorflow 2.0。如果是这种情况,那么使用参数embeddings_initializer=而不是weights=工作。

x = tf.keras.layers.Embedding(vocabulary_size, embedding_dim, embeddings_initializer=tf.keras.initializers.Constant(embedding_matrix), trainable=False)

推荐阅读