2017-03-09 93 views
1

Tensorflow维度的问题,我创造了这个代码,但我坚持一个维度错误与重塑

import pandas as pd 
import matplotlib.pyplot as plt 
import numpy as np 
import tensorflow as tf 
from tensorflow.contrib.rnn.python.ops import rnn_cell, rnn 
from time import time 

# 2) Import MNIST data http://yann.lecun.com/exdb/mnist/ 
from tensorflow.examples.tutorials.mnist import input_data 
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True) 
x_train = mnist.train.images 

# Define the appropriate model and variables (USER INPUTS) 
batch = 100 # Define the size of the batch 
units = 32 # Number of units of each network 
recurrent_layers = 1 # Number of layers 
nnclasses = 10 # MNIST classes (0-9) 
steps = x_train.shape[1] # 784 
feed = 1 # Number of pixels to be fed into the model 
recurrent_layers = 1 # Define the size of the recurrent layers 
dropout = 1 # 

x = tf.placeholder(tf.float32,[None, None]) # batch(100)x784 
x_resh = tf.reshape(x,[-1,steps,1]) # (100, 784, 1) 
keep_prob = tf.placeholder(tf.float32,shape=[]) 

def weight_variable(shape): 
    initial = tf.truncated_normal(shape, stddev=0.1) 
    return tf.Variable(initial) 

w_fc = weight_variable([units, nnclasses]) 

cell = tf.contrib.rnn.GRUCell(units) 
cell = tf.contrib.rnn.DropoutWrapper(cell, input_keep_prob = keep_prob) 
cell = tf.contrib.rnn.MultiRNNCell([cell] * recurrent_layers) 
cell = tf.contrib.rnn.DropoutWrapper(cell, output_keep_prob = keep_prob) 
outputs, final_state = tf.nn.dynamic_rnn(cell, x_resh, dtype=tf.float32) 
output = outputs[:,:-1, :] 
logits = tf.matmul(tf.reshape(output,[-1,tf.shape(w_fc)[0]]), w_fc) # [78300, 10] 
y = tf.reshape(x[:,1:], [-1, nnclasses]) # [7830, 10] 
K = [tf.shape(y)[0], tf.shape(logits)[0]] 

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

def binarize(images, threshold=0.1): 
    return (threshold < images).astype('float32') 
batch_x, _ = mnist.train.next_batch(batch) 
batch_x = binarize(batch_x, threshold=0.1) 

return = sess.run(K, feed_dict={x: batch_x, keep_prob: 1.0}) 

它返回[7830,78300]。问题是这两个数字应该是一样的。它们是y和logits的行,如果它们不相似,我不能在交叉熵设置中比较它们。有人可以让我知道过程错误的地方吗?实际上,(y)应该返回[78300,10],但我不知道为什么。

回答

1
y = tf.reshape(x[:,1:], [-1, nnclasses]) # [7830, 10] 

x张量形状batch(100)x784,所以x[:1,:]是100x783。这是总共78,300个元素。 78300x10将是783,000,你只是没有足够的数据在x中使它成形。

您的意思是使用logits作为y的参数吗?假设y是你的输出,用x作为参数意味着你绕过了整个网络。