我正在开发一个用于分类良性和恶意APK的神经网络模型。
我尝试使用 tf.squeeze()
函数,但使用后无法使用优化器
def neural_network_model(data): l1 = tf.add(tf.matmul(data,hidden_1_layer['weight']), hidden_1_layer['bias']) l1 = tf.nn.relu(l1) l2 = tf.add(tf.matmul(l1,hidden_2_layer['weight']), hidden_2_layer['bias']) l2 = tf.nn.relu(l2) l3 = tf.add(tf.matmul(l2,hidden_3_layer['weight']), hidden_3_layer['bias']) l3 = tf.nn.relu(l3) output = tf.matmul(l3,output_layer['weight']) + output_layer['bias'] return outputdef train_neural_network(x): prediction = neural_network_model(x) cost = tf.reduce_mean( tf.nn.softmax_cross_entropy_with_logits(logits=prediction, labels= y) ) optimizer = tf.train.AdamOptimizer(learning_rate=0.001).minimize(cost)
pred
和 y
的形状必须相同,然而运行代码后发现 pred
的形状是 (3799,2)
,而 y
的形状是 (1,3799)
。
回答:
我的评论:
- 如果你的标签不是独热编码的,你可以使用
tf.nn.sparse_softmax_cross_entropy_with_logits()
而无需将其转换为独热编码表示。否则,tf.nn.softmax_cross_entropy_with_logits()
只接受独热编码的标签。 - 如果你在图模式下编写代码,你不能将
numpy
值作为输入传递给损失函数(或除了在session.run()
中的feed_dict
之外的任何输入)。请使用占位符代替。
以下是如何使用占位符和馈送numpy数据数组的示例说明。
import numpy as npimport tensorflow as tf# 用于说明的虚拟数据,包含3个类别n_classes =3x_train = np.random.normal(size=(3799, 2)) # 3799个样本,每个样本大小为 (2, )y_train = np.random.randint(low=0, high=n_classes, size=(1, 3799))# 在这里定义占位符x = tf.placeholder(tf.float32, shape=(None, 2))y = tf.placeholder(tf.int32, shape=(1, None))# 在这里定义你的网络w = tf.Variable(tf.random_normal(shape=[2, n_classes]), dtype=tf.float32)b = tf.Variable(tf.zeros([n_classes, ]), dtype=tf.float32)logits = tf.matmul(x, w) + blabels = tf.squeeze(y)xentropy = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=logits, labels=labels)cost = tf.reduce_mean(xentropy)train_op = tf.train.AdamOptimizer(learning_rate=0.001).minimize(cost)# 训练with tf.Session() as sess: sess.run(tf.global_variables_initializer()) cost_val = sess.run(cost, feed_dict={x:x_train, y:y_train}) print(cost_val) # 1.8630761 sess.run(train_op, feed_dict={x:x_train, y:y_train}) # 优化器步骤 cost_val = sess.run(cost, feed_dict={x:x_train, y:y_train}) print(cost_val) # 1.8619089