【发布时间】:2018-07-25 15:24:20
【问题描述】:
我已经使用 tflearn 在一些数据上训练了一个模型来进行二进制分类。该模型被训练到 97% 的准确率。
我想在另一个程序中使用model.load() 来预测一些测试输入数据的类别。
但是,model.load() 仅在我包含参数 weights_only=True 时才有效。当我从 model.load() 中省略该参数时,它会引发错误:
NotFoundError (see above for traceback): Key is_training not found in checkpoint
当我加载模型并在我的小测试集上运行一些预测时 - 分类看起来很奇怪。该模型每次都预测第一个索引中的完美 1。对我来说,如果模型被训练到非常高的准确度,这不应该发生。以下是预测的样子(右侧的预期输出):
[[ 5.59889193e-22 1.00000000e+00] [0, 1]
[ 4.25160435e-22 1.00000000e+00] [0, 1]
[ 6.65333618e-23 1.00000000e+00] [0, 1]
[ 2.07748895e-21 1.00000000e+00] [0, 1]
[ 1.77639440e-21 1.00000000e+00] [0, 1]
[ 5.77486922e-18 1.00000000e+00] [1, 0]
[ 2.70562403e-19 1.00000000e+00] [1, 0]
[ 2.78288828e-18 1.00000000e+00] [1, 0]
[ 6.10306495e-17 1.00000000e+00] [1, 0]
[ 2.35787162e-19 1.00000000e+00]] [1, 0]
注意:此测试数据是用于训练模型的数据,因此应该能够以高精度正确分类。
训练模型的代码:
tf.reset_default_graph()
train = pd.read_csv("/Users/darrentaggart/Library/Mobile Documents/com~apple~CloudDocs/Uni Documents/MEE4040 - Project 4/Coding Related Stuff/Neural Networks/modeltraindata_1280.csv")
test = pd.read_csv("/Users/darrentaggart/Library/Mobile Documents/com~apple~CloudDocs/Uni Documents/MEE4040 - Project 4/Coding Related Stuff/Neural Networks/modeltestdata_320.csv")
X = train.iloc[:,1:].values.astype(np.float32)
Y = np.array([np.array([int(i == l) for i in range(2)]) for l in
train.iloc[:,:1].values])
test_x = test.iloc[:,1:].values.astype(np.float32)
test_y = np.array([np.array([int(i == l) for i in range(2)]) for l in
test.iloc[:,:1].values])
X = X.reshape([-1, 16, 16, 1])
test_x = test_x.reshape([-1, 16, 16, 1])
convnet = input_data(shape=[None, 16, 16, 1], name='input')
initialization = tf.contrib.layers.variance_scaling_initializer(factor=1.0, mode='FAN_IN', uniform=False)
convnet = conv_2d(convnet, 32, 2, activation='elu',
weights_init=initialization)
convnet = max_pool_2d(convnet, 2)
convnet = tflearn.layers.normalization.batch_normalization(convnet, beta=0.0, gamma=1.0, epsilon=1e-05,
decay=0.9, stddev=0.002, trainable=True, restore=True, reuse=False, scope=None, name='BatchNormalization')
convnet = conv_2d(convnet, 64, 2, activation='elu',
weights_init=initialization)
convnet = max_pool_2d(convnet, 2)
convnet = tflearn.layers.normalization.batch_normalization(convnet, beta=0.0, gamma=1.0, epsilon=1e-05,
decay=0.9, stddev=0.002, trainable=True, restore=True, reuse=False, scope=None, name='BatchNormalization')
convnet = fully_connected(convnet, 254, activation='elu', weights_init=initialization)
convnet = dropout(convnet, 0.8)
convnet = tflearn.layers.normalization.batch_normalization(convnet, beta=0.0, gamma=1.0, epsilon=1e-05,
decay=0.9, stddev=0.002, trainable=True, restore=True, reuse=False, scope=None, name='BatchNormalization')
convnet = fully_connected(convnet, 2, activation='softmax')
adam = tflearn.optimizers.Adam(learning_rate=0.00065, beta1=0.9, beta2=0.999, epsilon=1e-08)
convnet = regression(convnet, optimizer=adam, loss='categorical_crossentropy', name='targets')
model = tflearn.DNN(convnet, tensorboard_dir='/Users/darrentaggart/Library/Mobile Documents/com~apple~CloudDocs/Uni Documents/MEE4040 - Project 4/Coding Related Stuff/Neural Networks/latest logs',
tensorboard_verbose=3)
model.fit({'input': X}, {'targets': Y}, n_epoch=100, batch_size=16,
validation_set=({'input': test_x}, {'targets': test_y}), snapshot_step=10, show_metric=True, run_id='1600 - ConvConvFC254 LR0.00065decay BN VSinit 16batchsize 100epochs')
model.save('tflearncnn.model')
加载和生成预测的代码:
test = pd.read_csv("/Users/darrentaggart/Library/Mobile Documents/com~apple~CloudDocs/Uni Documents/MEE4040 - Project 4/Coding Related Stuff/Neural Networks/modelpredictiondata.csv")
X = test.iloc[:,1:].values.astype(np.float32)
sess=tf.InteractiveSession()
tflearn.is_training(False)
convnet = input_data(shape=[None, 16, 16, 1], name='input')
initialization = tf.contrib.layers.variance_scaling_initializer(factor=1.0, mode='FAN_IN', uniform=False)
convnet = conv_2d(convnet, 32, 2, activation='elu', weights_init=initialization)
convnet = max_pool_2d(convnet, 2)
convnet = tflearn.layers.normalization.batch_normalization(convnet, beta=0.0, gamma=1.0, epsilon=1e-05,
decay=0.9, stddev=0.002, trainable=True, restore=True, reuse=False, scope=None, name='BatchNormalization')
convnet = conv_2d(convnet, 64, 2, activation='elu', weights_init=initialization)
convnet = max_pool_2d(convnet, 2)
convnet = tflearn.layers.normalization.batch_normalization(convnet, beta=0.0, gamma=1.0, epsilon=1e-05,
decay=0.9, stddev=0.002, trainable=True, restore=True, reuse=False, scope=None, name='BatchNormalization')
convnet = fully_connected(convnet, 254, activation='elu', weights_init=initialization)
convnet = tflearn.layers.normalization.batch_normalization(convnet, beta=0.0, gamma=1.0, epsilon=1e-05,
decay=0.9, stddev=0.002, trainable=True, restore=True, reuse=False, scope=None, name='BatchNormalization')
convnet = fully_connected(convnet, 2, activation='softmax')
adam = tflearn.optimizers.Adam(learning_rate=0.00065, beta1=0.9, beta2=0.999, epsilon=1e-08)
convnet = regression(convnet, optimizer=adam, loss='categorical_crossentropy', name='targets')
model = tflearn.DNN(convnet)
if os.path.exists('{}.meta'.format('tflearncnn.model')):
model.load('tflearncnn.model', weights_only=False)
print('model loaded!')
for i in enumerate(X):
X = X.reshape([-1, 16, 16, 1])
model_out = model.predict(X)
if np.argmax(model_out) == 1: str_label='Boss'
else: str_label = 'Slot'
print(model_out)
我知道这是一个远大的目标,但我认为有人可能能够对此事有所了解。谢谢。
【问题讨论】:
-
您解决了吗?如果是,您能分享一下解决方案吗?
标签: tensorflow machine-learning neural-network conv-neural-network tflearn