2017-08-27 99 views
1

我正在張量流中創建一個2 CN層+密集層網絡。當我運行程序的過濾器大小爲32,內核大小爲3 x 3時,我的準確率大約爲97%。但是當我爲CN層1和CN層2運行此過濾器大小爲10的程序時,它會給出一個值錯誤。卷積網絡錯誤; Tensorflow - 值錯誤

這是我的代碼:

from __future__ import absolute_import 
 
from __future__ import division 
 
from __future__ import print_function 
 

 
import numpy as np 
 
import tensorflow as tf 
 

 
tf.logging.set_verbosity(tf.logging.INFO) 
 

 

 
def cnn_model_fn(features, labels, mode): 
 
    """Model function for CNN.""" 
 
    # Input Layer 
 
    # Reshape X to 4-D tensor: [batch_size, width, height, channels] 
 
    # MNIST images are 28x28 pixels, and have one color channel 
 
    input_layer = tf.reshape(features["x"], [-1, 28, 28, 1]) 
 

 
    # Convolutional Layer #1 
 
    # Computes 32 features using a 5x5 filter with ReLU activation. 
 
    # Padding is added to preserve width and height. 
 
    # Input Tensor Shape: [batch_size, 28, 28, 1] 
 
    # Output Tensor Shape: [batch_size, 28, 28, 32] 
 
    conv1 = tf.layers.conv2d(
 
     inputs=input_layer, 
 
     filters=10, 
 
     kernel_size=[3, 3], 
 
     padding="same", 
 
     activation=tf.nn.relu) 
 

 
    # Pooling Layer #1 
 
    # First max pooling layer with a 2x2 filter and stride of 2 
 
    # Input Tensor Shape: [batch_size, 28, 28, 32] 
 
    # Output Tensor Shape: [batch_size, 14, 14, 32] 
 
    pool1 = tf.layers.max_pooling2d(inputs=conv1, pool_size=[2, 2], strides=2) 
 

 
    # Convolutional Layer #2 
 
    # Computes 64 features using a 5x5 filter. 
 
    # Padding is added to preserve width and height. 
 
    # Input Tensor Shape: [batch_size, 14, 14, 32] 
 
    # Output Tensor Shape: [batch_size, 14, 14, 64] 
 
    conv2 = tf.layers.conv2d(
 
     inputs=pool1, 
 
     filters=10, 
 
     kernel_size=[3, 3], 
 
     padding="same", 
 
     activation=tf.nn.relu) 
 

 
    # Pooling Layer #2 
 
    # Second max pooling layer with a 2x2 filter and stride of 2 
 
    # Input Tensor Shape: [batch_size, 14, 14, 64] 
 
    # Output Tensor Shape: [batch_size, 7, 7, 64] 
 
    pool2 = tf.layers.max_pooling2d(inputs=conv2, pool_size=[2, 2], strides=2) 
 

 
    # Flatten tensor into a batch of vectors 
 
    # Input Tensor Shape: [batch_size, 7, 7, 64] 
 
    # Output Tensor Shape: [batch_size, 7 * 7 * 64] 
 
    pool2_flat = tf.reshape(pool2, [-1, 7 * 7 * 64]) 
 

 
    # Dense Layer 
 
    # Densely connected layer with 1024 neurons 
 
    # Input Tensor Shape: [batch_size, 7 * 7 * 64] 
 
    # Output Tensor Shape: [batch_size, 1024] 
 
    dense = tf.layers.dense(inputs=pool2_flat, units=1024, activation=tf.nn.relu) 
 

 
    # Add dropout operation; 0.6 probability that element will be kept 
 
    dropout = tf.layers.dropout(
 
     inputs=dense, rate=0.4, training=mode == tf.estimator.ModeKeys.TRAIN) 
 

 
    # Logits layer 
 
    # Input Tensor Shape: [batch_size, 1024] 
 
    # Output Tensor Shape: [batch_size, 10] 
 
    logits = tf.layers.dense(inputs=dropout, units=10) 
 

 
    predictions = { 
 
     # Generate predictions (for PREDICT and EVAL mode) 
 
     "classes": tf.argmax(input=logits, axis=1), 
 
     # Add `softmax_tensor` to the graph. It is used for PREDICT and by the 
 
     # `logging_hook`. 
 
     "probabilities": tf.nn.softmax(logits, name="softmax_tensor") 
 
    } 
 
    if mode == tf.estimator.ModeKeys.PREDICT: 
 
    return tf.estimator.EstimatorSpec(mode=mode, predictions=predictions) 
 

 
    # Calculate Loss (for both TRAIN and EVAL modes) 
 
    onehot_labels = tf.one_hot(indices=tf.cast(labels, tf.int32), depth=10) 
 
    loss = tf.losses.softmax_cross_entropy(
 
     onehot_labels=onehot_labels, logits=logits) 
 

 
    # Configure the Training Op (for TRAIN mode) 
 
    if mode == tf.estimator.ModeKeys.TRAIN: 
 
    optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.001) 
 
    train_op = optimizer.minimize(
 
     loss=loss, 
 
     global_step=tf.train.get_global_step()) 
 
    return tf.estimator.EstimatorSpec(mode=mode, loss=loss, train_op=train_op) 
 

 
    # Add evaluation metrics (for EVAL mode) 
 
    eval_metric_ops = { 
 
     "accuracy": tf.metrics.accuracy(
 
      labels=labels, predictions=predictions["classes"])} 
 
    return tf.estimator.EstimatorSpec(
 
     mode=mode, loss=loss, eval_metric_ops=eval_metric_ops) 
 

 

 
def main(unused_argv): 
 
    # Load training and eval data 
 
    mnist = tf.contrib.learn.datasets.load_dataset("mnist") 
 
    train_data = mnist.train.images # Returns np.array 
 
    train_labels = np.asarray(mnist.train.labels, dtype=np.int32) 
 
    eval_data = mnist.test.images # Returns np.array 
 
    eval_labels = np.asarray(mnist.test.labels, dtype=np.int32) 
 

 
    # Create the Estimator 
 
    mnist_classifier = tf.estimator.Estimator(
 
     model_fn=cnn_model_fn, model_dir="/tmp/mnist_convnet_model") 
 

 
    # Set up logging for predictions 
 
    # Log the values in the "Softmax" tensor with label "probabilities" 
 
    tensors_to_log = {"probabilities": "softmax_tensor"} 
 
    logging_hook = tf.train.LoggingTensorHook(
 
     tensors=tensors_to_log, every_n_iter=50) 
 

 
    # Train the model 
 
    train_input_fn = tf.estimator.inputs.numpy_input_fn(
 
     x={"x": train_data}, 
 
     y=train_labels, 
 
     batch_size=100, 
 
     num_epochs=None, 
 
     shuffle=True) 
 
    mnist_classifier.train(
 
     input_fn=train_input_fn, 
 
     steps=20000, 
 
     hooks=[logging_hook]) 
 

 
    # Evaluate the model and print results 
 
    eval_input_fn = tf.estimator.inputs.numpy_input_fn(
 
     x={"x": eval_data}, 
 
     y=eval_labels, 
 
     num_epochs=1, 
 
     shuffle=False) 
 
    eval_results = mnist_classifier.evaluate(input_fn=eval_input_fn) 
 
    print(eval_results) 
 

 

 
if __name__ == "__main__": 
 
    tf.app.run()

這是我收到的錯誤:

ValueError: Dimension size must be evenly divisible by 3136 but is 49000 for 'Reshape_1' (op: 'Reshape') with input shapes: [100,7,7,10], [2] and with input tensors computed as partial shapes: input[1] = [?,3136].

我想有人指出我需要在代碼中更改以運行程序。謝謝!

回答

0

這很簡單。您更改了濾鏡貼圖,因此您還需要採用reshape,因爲這會使卷積層變得平坦,從而將其與緻密層連接起來。在你的情況,

Conv_1 28, 28, 1 -> 28, 28, 10 
Pool_1 28, 28, 10 -> 14, 14, 10 
Conv_2 14, 14, 10 -> 14, 14, 10 
Pool_2 14, 14, 10 -> 7, 7, 10 
Flatten-> FC Layer 7, 7, 10 = 7 * 7 * 10 = 490 -> 1024 

所以,你需要改變這一行的代碼在這裏,

pool2_flat = tf.reshape(pool2, [-1, 7 * 7 * 10]) 
+0

TranThanks ..我這樣做,現在我收到以下錯誤: 'InvalidArgumentError(見上文追蹤):分配要求兩張張的形狀相匹配。 lhs shape = [10] rhs shape = [32] \t [[Node:save/Assign = Assign [T = DT_FLOAT,_class = [「loc:@ conv2d/bias」],use_locking = true,validate_shape = true,_device =「/ job:localhost/replica:0/task:0/cpu:0」](conv2d/bias,save/RestoreV2)]]' –

+0

請在更改代碼後看到上述錯誤 –

+0

刪除舊模型'「/ tmp/mnist_convnet_model」並再次運行。 –