2017-03-09 2 views
1

Ich habe diesen Code erstellt, aber ich bin mit einer Dimensionalität Fehler steckenTensorflow Dimensionalität Ausgabe mit reshape

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}) 

Welche kehrt [7830, 78300]. Das Problem ist, dass diese beiden Nummern identisch sein sollten. Sie sind die Reihen von y und logits, und wenn sie nicht ähnlich sind, kann ich sie nicht in einer Kreuz-Entropie-Einstellung vergleichen. Kann mir jemand bitte mitteilen, wo der Prozess falsch ist? Eigentlich sollte das (y) zurückkehren [78300, 10], aber ich weiß nicht warum.

Antwort

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

Ihr x Tensor ist die Form batch(100)x784, so x[:1,:] 100x783 ist. Dies sind insgesamt 78.300 Elemente. 78300x10 wäre 783.000, Sie haben einfach nicht genug Daten in x, um diese Form zu erhalten.

Wollen Sie Logits als Parameter von y verwenden? Unter der Annahme, dass y Ihre Ausgabe ist, bedeutet die Verwendung von x als Parameter, dass Sie das gesamte Netzwerk umgangen haben.