【问题标题】:Loading a model in TFLearn - predicting same value each time在 TFLearn 中加载模型 - 每次预测相同的值
【发布时间】: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


【解决方案1】:

问这个问题已经一年半了,但分享毕竟是关怀。使用 tflearn 和 Alexnet 对图像进行二进制分类。

诀窍是在转换为 nparray 后进行规范化。不要忘记更改目录路径。

from __future__ import division, print_function, absolute_import
import tflearn
from tflearn.layers.core import input_data, dropout, fully_connected
from tflearn.layers.conv import conv_2d, max_pool_2d
from tflearn.layers.normalization import local_response_normalization
from tflearn.layers.estimator import regression
from data_utils import * 
import os
from PIL import Image
from numpy import array

def res_image(f, image_shape=[224,224], grayscale=False, normalize=True):
    img = load_image(f)
    width, height = img.size
    if width != image_shape[0] or height != image_shape[1]:
        img = resize_image(img, image_shape[0], image_shape[1])
    if grayscale:
        img = convert_color(img, 'L')
    elif img.mode == 'L':
        img = convert_color(img, 'RGB')

    img = pil_to_nparray(img)
    if normalize: # << this here is what you need
        img /= 255.
    img = array(img).reshape(1, image_shape[0], image_shape[1], 3)
    return img

# Building the network
network = input_data(shape=[None, 227, 227, 3])
network = conv_2d(network, 96, 11, strides=4, activation='relu')
network = max_pool_2d(network, 3, strides=2)
network = local_response_normalization(network)
network = conv_2d(network, 256, 5, activation='relu')
network = max_pool_2d(network, 3, strides=2)
network = local_response_normalization(network)
network = conv_2d(network, 384, 3, activation='relu')
network = conv_2d(network, 384, 3, activation='relu')
network = conv_2d(network, 256, 3, activation='relu')
network = max_pool_2d(network, 3, strides=2)
network = local_response_normalization(network)
network = fully_connected(network, 4096, activation='tanh')
network = dropout(network, 0.5)
network = fully_connected(network, 4096, activation='tanh')
network = dropout(network, 0.5)
network = fully_connected(network, 2, activation='softmax') # output is the number of outcomes
network = regression(network, optimizer='momentum',
                     loss='categorical_crossentropy',
                     learning_rate=0.001)

# Training
model = tflearn.DNN(network, 
                    tensorboard_dir=R'C:\Users\b0588718\Source\Repos\AlexNet\AlexNet')

model.load('model.tfl')

f = r'C:\Users\b0588718\Source\Repos\AlexNet\AlexNet\rawdata\jpg\0\P1170047.jpg'
img = res_image(f, [227,227], grayscale=False, normalize=True)

pred = model.predict(img)
print(" %s" % pred[0])

【讨论】:

    【解决方案2】:

    你没试过model.load(&lt;path-to-saved-model&gt;)
    例如:model.load("./model.tflearn")
    我想这会解决你的问题。

    【讨论】:

      猜你喜欢
      • 2017-06-29
      • 1970-01-01
      • 1970-01-01
      • 2018-06-30
      • 2020-01-27
      • 2021-05-30
      • 1970-01-01
      • 2019-07-11
      • 2017-02-25
      相关资源
      最近更新 更多