0

我试图训练一个CNN模型,2个类,它是基于张量流进行图像分类的。CNN模型对图像分类不收敛,它基于Tensorflow

我已经尝试了大量修改关于时代,学习速度,批量大小和CNN大小,但没有任何作品。

大约数据

86(标号:0)+ 63(标签:1)图像

形状:(128,128)

关于当前参数

learning_rate = 0.00005(我试过从0.00000001到0.8 ...)

批量大小= 30

历元(I也从5到130试过)= 20

有关网络

def weight_variable(shape): 

    initial = tf.truncated_normal(shape, stddev = 0.1, dtype = tf.float32) 
    return tf.Variable(initial) 


def bias_variable(shape): 

    initial = tf.constant(0.1, shape = shape, dtype = tf.float32) 
    return tf.Variable(initial) 


def conv2d(x, W): 

    #(input, filter, strides, padding) 
    #[batch, height, width, in_channels] 
    return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME') 


def max_pool_2x2(x): 

    #(value, ksize, strides, padding) 
    return tf.nn.max_pool(x, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME') 

def cnn_model(): 

    epochs = 20 
    batch_size = 30 
    learning_rate = 0.00005 
    hidden = 2 
    cap_c = 86 
    cap_h = 63 
    num = cap_c + cap_h 
    image_size = 128 
    label_size = 2 

    print ((num//(batch_size)) * epochs) 
    train_loss = np.empty((num//(batch_size)) * epochs) 
    train_acc = np.empty((num//(batch_size)) * epochs) 

    x = tf.placeholder(tf.float32, shape = [None, image_size, image_size]) 
    y = tf.placeholder(tf.float32, shape = [None, label_size]) 

    weight_balance = tf.constant([0.1]) 

    X_train_ = tf.reshape(x, [-1, image_size, image_size, 1]) 

    #First layer 
    W_conv1 = weight_variable([5, 5, 1, 4]) 
    b_conv1 = bias_variable([4]) 

    h_conv1 = tf.nn.relu(conv2d(X_train_, W_conv1) + b_conv1) 
    h_pool1 = max_pool_2x2(h_conv1) 

# #Second layer 
# W_conv2 = weight_variable([5, 5, 4, 8]) 
# b_conv2 = bias_variable([8]) 
#  
# h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2) 
# h_pool2 = max_pool_2x2(h_conv2) 
#  
# Third layer 
# W_conv3 = weight_variable([5, 5, 8, 16]) 
# b_conv3 = bias_variable([16]) 
#  
# h_conv3 = tf.nn.relu(conv2d(h_pool2, W_conv3) + b_conv3) 
# h_pool3 = max_pool_2x2(h_conv3) 

    #Full connect layer 
    W_fc1 = weight_variable([64 * 64 * 4, hidden]) 
    b_fc1 = bias_variable([hidden]) 

    h_pool2_flat = tf.reshape(h_pool1, [-1, 64 * 64 * 4]) 
    h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1) 

    keep_prob = tf.placeholder(tf.float32) 
    h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob) 

    #Output_Softmax 

    W_fc2 = weight_variable([hidden, label_size]) 
    b_fc2 = bias_variable([label_size]) 

    y_conv = tf.nn.softmax(tf.matmul(h_fc1_drop, W_fc2) + b_fc2) 

    print y_conv.shape 



    #Train 
    loss = tf.reduce_mean(tf.nn.weighted_cross_entropy_with_logits(y, y_conv, weight_balance)) 
    optimize = tf.train.AdamOptimizer(learning_rate).minimize(loss) 

    correct_prediction = tf.equal(tf.argmax(y_conv, 1), tf.argmax(y, 1)) 
    accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) 

大约结果

损失不收敛,并且还精确度。

我不知道我的CNN模型是否不适合我的数据? 或

网络的激活功能和丢失功能是不适合的?

真的很感谢你们

+0

您是否尝试过非加权版本的损失? –

+0

另外,您正在将softmax应用于您的输出,然后您的损失函数再次应用它。不要这样做。将未激活的输出送入损失函数,并将softmax仅用于预测。 –

+0

@MadWombat感谢您的帮助。你的意思是我应该使用'out_put = tf.add(tf.matmul(h_fc1_drop,W_fc2),b_fc2)''当我输出输入损失函数?然后我仍然使用'tf.nn.softmax_cross_entropy_with_logits'来丢失我的功能?谢谢 – JourneyWoo

回答

1

有几个有问题的代码:

  1. 你是最后层上应用softmax,然后调用tf.nn.weighted_cross_entropy_with_logits这反过来又适用sigmoid激活,所以您所申请激活两次。
  2. 要初始化权重,请使用XavierVariance_scaling以加快收敛速度​​。更好地使用tf.layers API来实现您的模型,因为其默认设置遵循最佳实践。
+0

感谢您的回答:-)我已更改:'loss = tf.reduce_mean(tf.nn.weighted_cross_entropy_with_logits(y,out_feed,weight_balance)) '和'optimize = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss)'。但现在的问题是,损失收敛良好,但准确性波动剧烈... – JourneyWoo