#python #tensorflow
#python #tensorflow
Вопрос:
Я хочу вычислить умножение матрицы с помощью Tensorflow.
Но это привело к ошибкам, в то время как использование numpy не приводит к ошибкам.
(Процесс завершен с кодом выхода 139 (прерван сигналом 11: SIGSEGV))
Tensorflow с CPU / GPU: произошла ошибка: процесс завершен с кодом выхода 139 (прерван сигналом 11: SIGSEGV) С помощью Numpy (без Tensorflow): это происходит хорошо
import tensorflow as tf
mport numpy as np
num_doc = 1000 #10000
num_topic = 10
num_user = 20 #8000
cost = 0
#### Tensorflow with CPU ####
with tf.device('/cpu:0'):
a_dk = tf.Variable(tf.random_normal([num_doc,num_topic]))
x_uk = tf.Variable(tf.random_normal([num_user,num_topic]))
x_dk = tf.Variable(tf.random_normal([num_doc,num_topic]))
for u in range(num_user):
print u
for d in range(num_doc):
for k in range(num_topic):
cost = cost a_dk[d,k] * x_uk[u,k] * x_dk[d,k]
#### Tensorflow with GPU ####
a_dk = tf.Variable(tf.random_normal([num_doc,num_topic]))
x_uk = tf.Variable(tf.random_normal([num_user,num_topic]))
x_dk = tf.Variable(tf.random_normal([num_doc,num_topic]))
for u in range(num_user):
print u
for d in range(num_doc):
for k in range(num_topic):
cost = cost a_dk[d,k] * x_uk[u,k] * x_dk[d,k]
#### Numpy ####
a_dk = np.random.randn(num_doc, num_topic)
x_uk = np.random.randn(num_user, num_topic)
x_dk = np.random.randn(num_doc, num_topic)
for u in range(num_user):
print u
for d in range(num_doc):
for k in range(num_topic):
cost = cost a_dk[d,k] * x_uk[u,k] * x_dk[d,k]
Я использовал i7-4k / 16GB ram / GTX-1070 (8GB)
И мне нужно решение для поэлементного умножения матрицы на основе цикла с помощью Tensorflow.
(На самом деле, моя проблема сложнее, чем приведенный выше код. Так что трудно сделать это векторизацией)
Заранее благодарю вас!!
Комментарии:
1. Пожалуйста, добавьте больше деталей, что именно вы хотите? Почему вы пометили это как c , вам нужно решение на основе цикла for на c ? Если вам нужна помощь в python, пометьте его как python.
Ответ №1:
У вас есть несколько ошибок в том, что вы вставили. Вы неправильно импортируете numpy.
для tensorflow вам необходимо создать сеанс.
with tf.Session() as sess:
... cpu or gpu code here...
print(sess.run([cost]))
для numpy это как встроенное поэлементное умножение
result = np.multiply(A,B)
Просто используйте это. Вы также можете индексировать в A, B при его вызове
result = np.multiply(A[i,:],B[:,i])
Комментарии:
1. Я хочу вычислить его с помощью tensorflow, а не numpy.
2. если вы используете версию 0.11 и выше, это почти та же нотация, что и numpy. результат = tf.matmul(A,B) или результат = tf.matmul(A[i,:],B[:,i])
3. Я использую tensorflow 0.10. И я хочу вычислить приведенное выше уравнение #### Tensorflow с помощью GPU #### не только tf.matmul(A,B) или tf.matmul(A[i,:],B[:,i])
4. Я предлагаю, чтобы вы могли векторизовать свой подход. Это будет намного быстрее, чем цикл for.
5. tmp = tf.matmul(A[i,:,:],B[:,i,:]); res = tf.matmul(tmp[i,:,:],C[:,:,i]) вы должны быть в состоянии обобщить это.
Ответ №2:
Ошибка, скорее всего, вызвана созданием огромного графа TensorFlow, содержащего не менее 10 узлов на самую внутреннюю итерацию цикла. Подобные операции более эффективно вычисляются с использованием встроенных поэлементных операторов TensorFlow, которые поддерживают широковещательную передачу, чтобы избежать необходимости материализации всей матрицы. Например, ваша программа может быть написана с двумя (поэлементными) tf.multiply()
операциями и tf.reduce_sum()
:
a_dk = tf.Variable(tf.random_normal([num_doc,num_topic]))
x_uk = tf.Variable(tf.random_normal([num_user,num_topic]))
x_dk = tf.Variable(tf.random_normal([num_doc,num_topic]))
ax_dk = tf.multiply(a_dk, x_dk)
# Add extra dimensions to broadcast ax_dk along the user dimension, and
# x_uk along the docs dimension:
cost = tf.reduce_sum(tf.multiply(ax_dk[:, None, :], x_uk[None, :, :]))