【问题标题】:How to solve TypeError error in Jupyter Notebok如何解决 Jupyter Notebook 中的 TypeError 错误
【发布时间】:2021-06-29 15:32:30
【问题描述】:

我正在尝试在此 Github 存储库中运行 model.py 代码。

我正在使用 Jupyter Notebook。我已经克隆了这个存储库并从这个目录(repo 被克隆的地方)启动了 jupyter notebook,这样在导入模块时就不会发生错误。

当我运行model.pyfile的这部分代码时:

def main():
    """
    Load train/validation data set and train the model
    """
    parser = argparse.ArgumentParser(description='Behavioral Cloning Training Program')
    parser.add_argument('-d', help='data directory',        dest='data_dir',          type=str,   default='data')
    parser.add_argument('-t', help='test size fraction',    dest='test_size',         type=float, default=0.2)
    parser.add_argument('-k', help='drop out probability',  dest='keep_prob',         type=float, default=0.5)
    parser.add_argument('-n', help='number of epochs',      dest='nb_epoch',          type=int,   default=10)
    parser.add_argument('-s', help='samples per epoch',     dest='samples_per_epoch', type=int,   default=20000)
    parser.add_argument('-b', help='batch size',            dest='batch_size',        type=int,   default=40)
    parser.add_argument('-o', help='save best models only', dest='save_best_only',    type=s2b,   default='true')
    parser.add_argument('-l', help='learning rate',         dest='learning_rate',     type=float, default=1.0e-4)
    args = parser.parse_args()

    #print parameters
    print('-' * 30)
    print('Parameters')
    print('-' * 30)
    for key, value in vars(args).items():
        print('{:<20} := {}'.format(key, value))
    print('-' * 30)

    #load data
    data = load_data(args)
    #build model
    model = build_model(args)
    #train model on data, it saves as model.h5 
    train_model(model, args, *data)


if __name__ == '__main__':
    main()

它给出了以下错误:

<ipython-input-16-6e1430362122> in <module>
     32 
     33 if __name__ == '__main__':
---> 34     main()

<ipython-input-16-6e1430362122> in main()
     26     data = load_data(args)
     27     #build model
---> 28     model = build_model(args)
     29     #train model on data, it saves as model.h5
     30     train_model(model, args, *data)

<ipython-input-6-b4a45377398f> in build_model(args)
     21     model = Sequential()
     22     model.add(Lambda(lambda x: x/127.5-1.0, input_shape=INPUT_SHAPE))
---> 23     model.add(Conv2D(24, 5, 5, activation='elu', subsample=(2, 2)))
     24     model.add(Conv2D(36, 5, 5, activation='elu', subsample=(2, 2)))
     25     model.add(Conv2D(48, 5, 5, activation='elu', subsample=(2, 2)))

~\anaconda3\lib\site-packages\tensorflow\python\keras\layers\convolutional.py in __init__(self, filters, kernel_size, strides, padding, data_format, dilation_rate, groups, activation, use_bias, kernel_initializer, bias_initializer, kernel_regularizer, bias_regularizer, activity_regularizer, kernel_constraint, bias_constraint, **kwargs)
    651                bias_constraint=None,
    652                **kwargs):
--> 653     super(Conv2D, self).__init__(
    654         rank=2,
    655         filters=filters,

~\anaconda3\lib\site-packages\tensorflow\python\keras\layers\convolutional.py in __init__(self, rank, filters, kernel_size, strides, padding, data_format, dilation_rate, groups, activation, use_bias, kernel_initializer, bias_initializer, kernel_regularizer, bias_regularizer, activity_regularizer, kernel_constraint, bias_constraint, trainable, name, conv_op, **kwargs)
    132                conv_op=None,
    133                **kwargs):
--> 134     super(Conv, self).__init__(
    135         trainable=trainable,
    136         name=name,

~\anaconda3\lib\site-packages\tensorflow\python\training\tracking\base.py in _method_wrapper(self, *args, **kwargs)
    515     self._self_setattr_tracking = False  # pylint: disable=protected-access
    516     try:
--> 517       result = method(self, *args, **kwargs)
    518     finally:
    519       self._self_setattr_tracking = previous_value  # pylint: disable=protected-access

~\anaconda3\lib\site-packages\tensorflow\python\keras\engine\base_layer.py in __init__(self, trainable, name, dtype, dynamic, **kwargs)
    338     }
    339     # Validate optional keyword arguments.
--> 340     generic_utils.validate_kwargs(kwargs, allowed_kwargs)
    341 
    342     # Mutable properties

~\anaconda3\lib\site-packages\tensorflow\python\keras\utils\generic_utils.py in validate_kwargs(kwargs, allowed_kwargs, error_message)
    806   for kwarg in kwargs:
    807     if kwarg not in allowed_kwargs:
--> 808       raise TypeError(error_message, kwarg)
    809 
    810 

TypeError: ('Keyword argument not understood:', 'subsample')

我不知道这是什么意思。

P.S:我用args, unknown = parser.parse_known_args()替换了args = parser.parse_args()(只是告诉以防万一这是错误的原因)

【问题讨论】:

    标签: python python-3.x tensorflow keras training-data


    【解决方案1】:

    我无法确切知道发生了什么,但 main() 函数被定义为处理终端运行的参数,例如 &gt; python model.py --args,而不是像在 Jupyter 上那样的交互式会话。

    如果您打算在 Jupyter Notebooks 上使用它,只需摆脱 main() 并将 load_data()build_model()train_model() 的参数直接作为用户定义的变量传递会更容易。

    例如,重写 load_data() 函数看起来像这样:

    def load_data(data_dir, test_size):
        """
        Load training data and split it into training and validation set
        """
        #reads CSV file into a single dataframe variable
        data_df = pd.read_csv(os.path.join(os.getcwd(), data_dir, 'driving_log.csv'), names=['center', 'left', 'right', 'steering', 'throttle', 'reverse', 'speed'])
    
        #yay dataframes, we can select rows and columns by their names
        #we'll store the camera images as our input data
        X = data_df[['center', 'left', 'right']].values
        #and our steering commands as our output data
        y = data_df['steering'].values
    
        #now we can split the data into a training (80), testing(20), and validation set
        #thanks scikit learn
        X_train, X_valid, y_train, y_valid = train_test_split(X, y, test_size=test_size, random_state=0)
        return X_train, X_valid, y_train, y_valid
    
    

    【讨论】:

    • 你能告诉我具体怎么做吗?我应该删除传递的参数吗?
    • 我刚刚编辑了答案给你一个例子。
    • 这个答案没有解决根本问题,即代码是为旧版本的 keras 编写的。
    • 感谢@jakub 指出这一点。在任何情况下,如果@ssmalik 在 Jupyter 笔记本上以交互方式运行它,那么继续使用 if __name__ == '__main__': 运行它是没有意义的。
    • 是的,我同意。你确实提供了非常有用的建议。我只是想指出,这并不能解决问题。
    【解决方案2】:

    如何在model.py 中启动main() 函数? 如果要使用 Jupyter Notebook 中的参数执行 model.py 文件,最简单的方法是:

    import model as mdl
    
    class Args:
      data_dir = ...
      test_size = ...
      ...
    
    args = Args()
    mdl.main(args)
    

    【讨论】:

    • 你的意思是说我应该去掉main函数?我应该为这些参数设置什么值?
    • 这个答案没有解决根本问题,即代码是为旧版本的 keras 编写的
    【解决方案3】:

    链接的 GitHub 存储库中的代码是为 Keras 1.2.0 版和 TensorFlow 1.1.0 版编写的(请参阅the conda environment spec)。 Keras 1.2.0 was released in December, 2016,从那时起该软件包发生了重大变化。例如,keras.layers.Conv2D 中的 subsample 参数存在于 Keras 1.2.0 中,但后来被删除。

    要使用链接的 GitHub 存储库,我将使用包含的 environment.yml 文件创建一个新的 conda 环境。

    conda env create -f environment.yml
    

    请参阅the conda docs 了解更多信息。

    【讨论】:

    • 我实际上是分别安装了kerastensorfowmoviepy,所以安装了这些最新版本。例如,keras 版本是 2.4.3。考虑到这一点,我必须对代码进行哪些更改?
    • Keras 多年来发生了变化,几年前有效的论点可能不再有效。这里似乎就是这种情况。您应该安装 Keras 1.2.0 和 TensorFlow 1.1.0。如果您熟悉 conda,则应该像我在回答中演示的那样创建一个 conda env。
    猜你喜欢
    • 2019-12-25
    • 1970-01-01
    • 1970-01-01
    • 2020-05-15
    • 2022-01-10
    • 1970-01-01
    • 2022-07-12
    • 2020-06-20
    • 2020-08-07
    相关资源
    最近更新 更多