python - TensorFlow:不兼容的形状:[100,155] 与 [128,155] 结合使用 CNN 和 LSTM

标签 python tensorflow neural-network deep-learning

问题

尝试为音频回归任务堆叠 Conv -> Lstm -> Fully connected 层时出现不兼容的形状错误。我无法弄清楚为什么我会收到我收到的错误 - 图表构建良好然后抛出错误 - 谁能帮忙?

代码

lstm_num_hidden = 128
lstm_number_layers = 3
x = tf.placeholder(tf.float32, [None, 1024])
y = tf.placeholder(tf.float32, [None, 155])
keep_probability = tf.placeholder(tf.float32)

def conv2d(x, weights):
    return tf.nn.conv2d(x, weights, strides=[1, 1, 1, 1], padding='SAME')

x_spectrogram = tf.reshape(x, [-1, 32, 32, 1])

conv1_weights = tf.Variable(tf.truncated_normal([5, 5, 1, 32], stddev=0.1))
conv1_bias = tf.Variable(tf.constant(0.1, shape=[32]))
conv1_hidden = tf.nn.relu(conv2d(x_spectrogram, conv1_weights) + conv1_bias)
conv1_pooling = tf.nn.max_pool(conv1_hidden, ksize=[1, 2, 2, 1],strides=[1, 2, 2, 1], padding='SAME')

conv2_weights = tf.Variable(tf.truncated_normal([5, 5, 32, 64], stddev=0.1))
conv2_bias = tf.Variable(tf.constant(0.1, shape=[64]))
conv2_hidden = tf.nn.relu(conv2d(conv1_pooling, conv2_weights) + conv2_bias)
conv2_pooling = tf.nn.max_pool(conv2_hidden, ksize=[1, 2, 2, 1],strides=[1, 2, 2, 1], padding='SAME')
conv2_output = tf.reshape(conv2_pooling, [-1, 64, 64])

# changes to [8, BatchSize, 8, 64]
tr_x = tf.transpose(conv2_output, [1, 0, 2])
re_x = tf.reshape(tr_x, [-1, 64])
sp_x = tf.split(0, 64, re_x)

lstm_cell = rnn_cell.LSTMCell(lstm_num_hidden, forget_bias=1.0, state_is_tuple=True)
lstm_cell = rnn_cell.MultiRNNCell([lstm_cell] * lstm_number_layers, state_is_tuple=True)
init_state = lstm_cell.zero_state(128, tf.float32)
lstm_output, _ = rnn.rnn(cell=lstm_cell, inputs=sp_x, dtype=tf.float32, initial_state=init_state)
lstm_weights = tf.Variable(tf.truncated_normal([lstm_num_hidden, 155], stddev=0.1))
lstm_bias = tf.Variable(tf.truncated_normal([155], stddev=0.1))
out = tf.add(tf.matmul(lstm_output[-1], lstm_weights), lstm_bias)

fully_connected1_weights = tf.Variable(tf.truncated_normal([155, 1024], stddev=0.1))
fully_connected1_biases = tf.Variable(tf.truncated_normal([1024], stddev=0.1))
fully_connected1 = tf.nn.relu(tf.matmul(out, fully_connected1_weights) + fully_connected1_biases)
fully_connected1_dropout = tf.nn.dropout(fully_connected1, keep_probability)

fully_connected2_weights = tf.Variable(tf.truncated_normal([1024, 155], stddev=0.1))
fully_connected2_biases = tf.Variable(tf.truncated_normal([155], stddev=0.1))
prediction = tf.matmul(fully_connected1_dropout, fully_connected2_weights) + fully_connected2_biases

def error(labels, prediction):
    return tf.sqrt(tf.reduce_mean(tf.square(tf.sub(labels, prediction))))

rmse = error(y, prediction)
optimise = tf.train.AdamOptimizer(1e-4).minimize(rmse)

# Get training and testing batch.
train_batch_x = np.load("train_x.npy")
train_batch_y = np.load("train_y.npy")
test_batch_x = np.load("test_x.npy")
test_batch_y = np.load("test_y.npy")

sess = tf.Session()
sess.run(tf.global_variables_initializer())

for i in range(100):

    for batch in trange(99, desc="Training"):
        start = batch * 100
        end = batch * 100 + 100
        sess.run(optimise, { x: train_batch_x[start:end],
                             y: train_batch_y[start:end],
                             keep_probability: 0.5 })

    rmse_error = sess.run(rmse, { x: test_batch_x,
                                  y: test_batch_y,
                                  keep_probability: 1.0 })
    print "Root Mean Squared Error:" + str(rmse_error)

错误

W tensorflow/core/framework/op_kernel.cc:975] Invalid argument: Incompatible shapes: [100,155] vs. [128,155]
     [[Node: gradients/Sub_grad/BroadcastGradientArgs = BroadcastGradientArgs[T=DT_INT32, _device="/job:localhost/replica:0/task:0/gpu:0"](gradients/Sub_grad/Shape, gradients/Sub_grad/Shape_1)]]
W tensorflow/core/framework/op_kernel.cc:975] Invalid argument: Incompatible shapes: [100,155] vs. [128,155]
     [[Node: gradients/Sub_grad/BroadcastGradientArgs = BroadcastGradientArgs[T=DT_INT32, _device="/job:localhost/replica:0/task:0/gpu:0"](gradients/Sub_grad/Shape, gradients/Sub_grad/Shape_1)]]

Traceback (most recent call last):
  File "conv_rnn_experiment.py", line 81, in <module>
    keep_probability: 0.5 })
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.py", line 766, in run
    run_metadata_ptr)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.py", line 964, in _run
    feed_dict_string, options, run_metadata)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.py", line 1014, in _do_run
    target_list, options, run_metadata)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.py", line 1034, in _do_call
    raise type(e)(node_def, op, message)
tensorflow.python.framework.errors_impl.InvalidArgumentError: Incompatible shapes: [100,155] vs. [128,155]
     [[Node: gradients/Sub_grad/BroadcastGradientArgs = BroadcastGradientArgs[T=DT_INT32, _device="/job:localhost/replica:0/task:0/gpu:0"](gradients/Sub_grad/Shape, gradients/Sub_grad/Shape_1)]]

Caused by op u'gradients/Sub_grad/BroadcastGradientArgs', defined at:
  File "conv_rnn_experiment.py", line 63, in <module>
    optimise = tf.train.AdamOptimizer(1e-4).minimize(rmse)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/training/optimizer.py", line 269, in minimize
    grad_loss=grad_loss)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/training/optimizer.py", line 335, in compute_gradients
    colocate_gradients_with_ops=colocate_gradients_with_ops)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/gradients_impl.py", line 482, in gradients
    in_grads = grad_fn(op, *out_grads)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/math_grad.py", line 594, in _SubGrad
    rx, ry = gen_array_ops._broadcast_gradient_args(sx, sy)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/gen_array_ops.py", line 390, in _broadcast_gradient_args
    name=name)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/op_def_library.py", line 759, in apply_op
    op_def=op_def)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 2240, in create_op
    original_op=self._default_original_op, op_def=op_def)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 1128, in __init__
    self._traceback = _extract_stack()

  ...which was originally created as op u'Sub', defined at:
  File "conv_rnn_experiment.py", line 62, in <module>
    rmse = error(y, prediction)
  File "conv_rnn_experiment.py", line 60, in error
    return tf.sqrt(tf.reduce_mean(tf.square(tf.sub(labels, prediction))))
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/gen_math_ops.py", line 2758, in sub
    result = _op_def_lib.apply_op("Sub", x=x, y=y, name=name)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/op_def_library.py", line 759, in apply_op
    op_def=op_def)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 2240, in create_op
    original_op=self._default_original_op, op_def=op_def)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 1128, in __init__
    self._traceback = _extract_stack()

  InvalidArgumentError (see above for traceback): Incompatible shapes: [100,155] vs. [128,155]
     [[Node: gradients/Sub_grad/BroadcastGradientArgs = BroadcastGradientArgs[T=DT_INT32, _device="/job:localhost/replica:0/task:0/gpu:0"](gradients/Sub_grad/Shape, gradients/Sub_grad/Shape_1)]]

最佳答案

如果您之前在执行 sess.run() 时打印了一些内容,您会注意到它在 lstm_output 处中断。离开那个,你可以开始缩小你的问题,最终成为这一行:

init_state = lstm_cell.zero_state(128, tf.float32)

这个初始化是为了确定batch size。由于您有 155 个单位并且声明的批量大小为 128,因此预计输入为 128 x 155。但是,您的批处理似乎是 100,因此如果您更改该行,它应该会起作用。

关于python - TensorFlow:不兼容的形状:[100,155] 与 [128,155] 结合使用 CNN 和 LSTM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42822844/

相关文章:

python - 在启动时不使用配置文件将 JDBC 驱动程序添加到 PySpark

javascript - 使用 JS/CSS 缩小工具作为 python distutils 命令?

java - 使用神经网络进行文本分类

python - 神经网络的实现

python - 挤压网络问题

python - 为什么来自 scipy.spatial.distance 的 cdist 如此之快?

python - 使用 subprocess.Popen 时,使用可执行参数与将 exe 路径作为命令中的第一项有什么区别?

tensorflow - 在 TensorFlow 对象检测 API 中检测纪元结束

tensorflow - Keras/TF 2019 限制 GPU 内存使用?

python - 在 Tensorflow 中使用大型数据集