python - Tensorflow 损失和准确性在不同时期之间不会发生变化
问题描述
[编辑]大家好,我正在尝试学习 tensorflow 来构建特定的应用程序,所以我试图重新创建这个示例(https://medium.com/@curiousily/human-activity-recognition-using-lstms-on- android-tensorflow-for-hackers-part-vi-492da5adef64)我在互联网上找到的。
构建模型:
N_CLASSES = 6
N_HIDDEN_UNITS = 64
def create_LSTM_model(inputs):
W = {
'hidden': tf.Variable(tf.random_normal([N_FEATURES, N_HIDDEN_UNITS])),
'output': tf.Variable(tf.random_normal([N_HIDDEN_UNITS, N_CLASSES]))
}
biases = {
'hidden': tf.Variable(tf.random_normal([N_HIDDEN_UNITS], mean=1.0)),
'output': tf.Variable(tf.random_normal([N_CLASSES]))
}
X = tf.transpose(inputs, [1, 0, 2])
X = tf.reshape(X, [-1, N_FEATURES])
hidden = tf.nn.relu(tf.matmul(X, W['hidden']) + biases['hidden'])
hidden = tf.split(hidden, N_TIME_STEPS, 0)
# Stack 2 LSTM layers
lstm_layers = [tf.contrib.rnn.BasicLSTMCell(N_HIDDEN_UNITS, forget_bias=1.0) for _ in range(2)]
lstm_layers = tf.contrib.rnn.MultiRNNCell(lstm_layers)
outputs, _ = tf.contrib.rnn.static_rnn(lstm_layers, hidden, dtype=tf.float32)
# Get output for the last time step
lstm_last_output = outputs[-1]
return tf.matmul(lstm_last_output, W['output']) + biases['output']
为我们的模型创建占位符:
tf.reset_default_graph()
X = tf.placeholder(tf.float32, [None, N_TIME_STEPS, N_FEATURES], name="input")
Y = tf.placeholder(tf.float32, [None, N_CLASSES])
pred_Y = create_LSTM_model(X)
pred_softmax = tf.nn.softmax(pred_Y, name="y_")
L2_LOSS = 0.0015
l2 = L2_LOSS * \
sum(tf.nn.l2_loss(tf_var) for tf_var in tf.trainable_variables())
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits = pred_Y, labels = Y)) + l2
LEARNING_RATE = 0.0025
optimizer = tf.train.AdamOptimizer(learning_rate=LEARNING_RATE).minimize(loss)
correct_pred = tf.equal(tf.argmax(pred_softmax, 1), tf.argmax(Y, 1))
accuracy = tf.reduce_mean(tf.cast(correct_pred, dtype=tf.float32))
问题在于模型训练:
N_EPOCHS = 50
BATCH_SIZE = 1024
saver = tf.train.Saver()
history = dict(train_loss=[],
train_acc=[],
test_loss=[],
test_acc=[])
sess=tf.InteractiveSession()
sess.run(tf.global_variables_initializer())
train_count = len(X_train)
for i in range(1, N_EPOCHS + 1):
for start, end in zip(range(0, train_count, BATCH_SIZE),
range(BATCH_SIZE, train_count + 1,BATCH_SIZE)):
sess.run(optimizer, feed_dict={X: X_train[start:end],
Y: y_train[start:end]})
_, acc_train, loss_train = sess.run([pred_softmax, accuracy, loss], feed_dict={
X: X_train, Y: y_train})
_, acc_test, loss_test = sess.run([pred_softmax, accuracy, loss], feed_dict={
X: X_test, Y: y_test})
history['train_loss'].append(loss_train)
history['train_acc'].append(acc_train)
history['test_loss'].append(loss_test)
history['test_acc'].append(acc_test)
if i != 1 and i % 10 != 0:
continue
print(f'epoch: {i} test accuracy: {acc_test} loss: {loss_test}')
predictions, acc_final, loss_final = sess.run([pred_softmax, accuracy, loss], feed_dict={X: X_test, Y: y_test})
print()
print(f'final results: accuracy: {acc_final} loss: {loss_final}')
上面的链接中有更多代码。这是输出:
epoch: 1 test accuracy: 0.29729729890823364 loss: 3.0542454719543457
epoch: 10 test accuracy: 0.29729729890823364 loss: 3.0542454719543457
epoch: 20 test accuracy: 0.29729729890823364 loss: 3.0542454719543457
epoch: 30 test accuracy: 0.29729729890823364 loss: 3.0542454719543457
epoch: 40 test accuracy: 0.29729729890823364 loss: 3.0542454719543457
epoch: 50 test accuracy: 0.29729729890823364 loss: 3.0542454719543457
我真的不明白为什么我在每个时期都得到相同的准确性和损失输出。
谢谢你们,我对 ML 和 tensowflow 真的很陌生,我不太了解。
解决方案
推荐阅读
- python - Pandas Dataframe 根据现有数据添加列
- yum - 在本地 mrepo 服务器上运行 yum update 时如何解决“403 禁止”错误
- c# - 刚体 fps 控制器问题
- nestjs - NestJS 复制资产文件
- shell - Shell检查文件中的一个词来做一个语句
- python - 如何在python中生成修改后的单位矩阵
- python - 将 FastAPI 中的请求记录到项目目录中的特定文件中
- python - 如何在我的 Jupyter Sagemaker 笔记本实例中导入最新版本的 pandas?
- c - 我无法根据给出 Sum 生成数组的子集
- c++ - 以螺旋方式打印矩阵的程序。(不能正常工作)