tflearn创建多个模型

2024-04-25 23:13:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用tflearngym编写机器学习脚本。在

我可以用python脚本让一个网络正常工作,但是每当我试图调用我的函数来建立第二个或第三个网络并用模型.拟合,我得到一个

tensorflow.python.framework.错误_impl.InvalidArgumentError

编辑;目标应该是建立几个不同的网络,以便进行比较。首先,这应该只关注输入数据和训练周期数,但最后,我想比较不同的网络规模。 另外,我想运行一个循环,建立两个以上的网络。在

以下代码再现了我的错误:

  • 初始人口(人口)

创建一个随机操作数组,大小为pop\u大小

  • 神经网络模型(输入值):

创建一个神经网络

  • 训练模型(训练数据)

如果没有通过,则创建新模型,并根据提供的训练数据训练模型

import gym
import random
import numpy as np
import tflearn
from tflearn.layers.core import input_data, dropout, fully_connected
from tflearn.layers.estimator import regression

LR = 1e-3
env = gym.make('CartPole-v0')
env.reset()
goal_steps = 500
score_requirement = 1


def initial_population(pop_size):

    training_data = []
    scores = []
    accepted_scores = []
    for _ in range(pop_size):
        score = 0
        game_memory = []
        prev_observation = []
        for _ in range(goal_steps):
            action = random.randrange(0,2)
            observation, reward, done, info = env.step(action)
            if len(prev_observation) > 0:
                game_memory.append([prev_observation, action])
            prev_observation = observation
            score += reward
            if done:
                break
        if score >= score_requirement:
            accepted_scores.append(score)
            for data in game_memory:
                if data[1] == 1:
                    output = [0,1]
                elif data[1] == 0:
                    output = [1,0]
                training_data.append([data[0], output])
        env.reset()
        scores.append(score)
    return np.array(training_data)


def neural_network_model(input_size):

    network = input_data(shape=[None, input_size, 1], name='input')
    network = fully_connected(network, 128, activation='relu')
    network = dropout(network, 0.8)
    network = fully_connected(network, 2, activation='softmax')
    network = regression(network, optimizer='adam', learning_rate=LR,
                         loss='categorical_crossentropy', name='targets')
    model = tflearn.DNN(network, tensorboard_dir='log')
    return model


def train_model(training_data, model=False, n_training_epochs=5):

    X = np.array([i[0] for i in training_data]).reshape(-1, len(training_data[0][0]), 1)
    Y = [i[1] for i in training_data]
    if not model:
        model = neural_network_model(input_size = len(X[0]))
    model.fit({'input':X}, {'targets':Y}, n_epoch=n_training_epochs, snapshot_step=500, show_metric=True)
    return model


if __name__ == "__main__":

    training_data = initial_population(5)
    print("still alive 1")
    model = train_model(training_data, n_training_epochs=1)
    print("still alive 2")
    training_data = initial_population(1)
    print("still alive 3")
    model = train_model(training_data, n_training_epochs=1)
    print("still alive 4")

通过输出:

^{pr2}$

关键的部分似乎是,函数模型.拟合第二次调用时,无法获取正确的数据类型。看起来这两个实例可能共享一些变量、数据等,这会把事情搞砸。在

对于常规的tensorflow,我看到您可能需要为每个新模型单独进行会话,但我不知道这是否适用于tflearn包。在

我正在开发Windows10和Python3.6。在


Tags: in模型import网络forinputdatasize
1条回答
网友
1楼 · 发布于 2024-04-25 23:13:36

实现这一点的一种方法是将对train_model的第二个调用更改为train_model(training_data, model, n_training_epochs=1),以便重用它在第一次调用中创建的模型。这似乎不是你想要的,因为你提到要建立第二个网络。在

在同一个会话中创建第二个模型似乎会导致问题,但是您可以创建一个模型并使用model.save将其保存,然后再次运行程序并将另一个模型保存到另一个文件中。在

从你的问题来看,你不太清楚你想达到什么目的,所以我不确定这两种方法是否对你有用。在

编辑:好吧,我想我已经知道怎么做你想做的了。如果不指定要使用的图形,则TensorFlow会将所有内容放入默认图形中。您可以指定要在单独的图中显示的内容,如下所示:

import tensorflow as tf  # This can be at the top of the file if you prefer
graph1 = tf.Graph()
with graph1.as_default():
    training_data = initial_population(5)
    print("still alive 1")
    model = train_model(training_data, n_training_epochs=1)
    print("still alive 2")

graph2 = tf.Graph()
with graph2.as_default():
    training_data = initial_population(1)
    print("still alive 3")
    model = train_model(training_data, n_training_epochs=1)
    print("still alive 4")

相关问题 更多 >