Image 基于张量流的CNN图像分类模型不收敛
我尝试训练一个CNN模型,2个类,基于tensorflow进行图像分类 我尝试了很多关于时代、学习率、批量大小和CNN大小的修改,但都没有效果 关于数据 86标签:0+63标签:1个图像 形状:128128 关于当前参数 学习率=0.00005I已尝试从0.00000001到0.8 批次大小=30我也尝试过从5到130 纪元=20 关于网络 关于结果 损失不收敛,精度也不收敛 我不知道我的CNN模型是否不适合我的数据? 或 网络的激活功能和丢失功能不合适Image 基于张量流的CNN图像分类模型不收敛,image,tensorflow,classification,conv-neural-network,convergence,Image,Tensorflow,Classification,Conv Neural Network,Convergence,我尝试训练一个CNN模型,2个类,基于tensorflow进行图像分类 我尝试了很多关于时代、学习率、批量大小和CNN大小的修改,但都没有效果 关于数据 86标签:0+63标签:1个图像 形状:128128 关于当前参数 学习率=0.00005I已尝试从0.00000001到0.8 批次大小=30我也尝试过从5到130 纪元=20 关于网络 关于结果 损失不收敛,精度也不收敛 我不知道我的CNN模型是否不适合我的数据? 或 网络的激活功能和丢失功能不合适 非常感谢代码中有几个问题: 您在最后一层
非常感谢代码中有几个问题: 您在最后一层上应用softmax,然后调用tf.nn.weighted_cross_entropy_和_logits,后者反过来应用sigmoid激活,因此您应用了两次激活。 对于权重的初始化,使用Xavier或方差_缩放以加快收敛速度。最好在实现模型时使用tf.layers API,因为其默认设置遵循最佳实践。
您是否尝试过非加权版本的损耗?此外,您正在对输出应用softmax,然后损耗函数再次应用它。不要那样做。将未激活的输出输入损失函数,并仅对预测应用softmax。@MadWombat感谢您的帮助。你是说当我把输出输入损耗函数时,我应该使用out\u put=tf.addtf.matmulh\u fc1\u drop,W\u fc2,b\u fc2?然后我仍然使用tf.nn.softmax\u cross\u entropy\u和我的损失函数?谢谢是的,那将是一个好的开始。你可以做pred=tf.nn.softmaxout\u并用它来生成你的实际预测。@MadWombat是的,我已经修改了它。但结果仍然不收敛。你能帮我看看我的网络吗?如果我的数据集有什么不合适的地方或者我有其他问题吗?谢谢你的回答:-我已经改变了:loss=tf.reduce\u meanstf.nn.weighted\u cross\u entropy\u with\u logitsy,out\u feed,weight\u balance和optimize=tf.train.gradientdescentoptimizer\u rate.minimizeloss。但现在的问题是,损失收敛得很好,但精度波动剧烈。。。
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))