热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

pythonOOPattributeError:对象没有属性

我遇到了有关对象属性的问题。如您所见,mnist_network对象具有一些必须在某些方

我遇到了有关对象属性的问题。如您所见,mnist_network对象具有一些必须在某些方法中使用的属性(属性:train_img,train_res,test_img,test_res)。当我调用函数test_predict(self)时,出现以下错误:AttributeError: 'mnist_network' object has no attribute 'test_img'。你能解释一下吗?我对使用Python进行OOP相当陌生。
我使用Spyder,尝试使用“帮助”来找出属性出了什么问题,但我仅获得“没有可用的文档”。所以那没有帮助...

这是我的代码(应该可以预测手写数字):

# import keras and the MNIST dataset
from tensorflow.keras.datasets import mnist
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from keras.utils import np_utils
# import matplotlib to show pictures
import matplotlib.pyplot as plt
# numpy is necessary since keras uses numpy arrays
import numpy as np
class mnist_network():
def __init__(self):
""" load data,create and train model """
# load data
(X_train,y_train),(X_test,y_test) = mnist.load_data()
# flatten 28*28 images to a 784 vector for each image
num_pixels = X_train.shape[1] * X_train.shape[2]
X_train = X_train.reshape((X_train.shape[0],num_pixels)).astype('float32')
X_test = X_test.reshape((X_test.shape[0],num_pixels)).astype('float32')
# normalize inputs from 0-255 to 0-1
X_train = X_train / 255
X_test = X_test / 255
# one hot encode outputs
y_train = np_utils.to_categorical(y_train)
y_test = np_utils.to_categorical(y_test)
num_classes = y_test.shape[1]
# create model
model = Sequential()
model.add(Dense(num_pixels,input_dim=num_pixels,kernel_initializer='normal',activation='relu'))
model.add(Dense(num_classes,activation='softmax'))
# Compile model
model.compile(loss='categorical_crossentropy',optimizer='adam',metrics=['accuracy'])
# train the model
model.fit(X_train,y_train,validation_data=(X_test,y_test),epochs=10,batch_size=200,verbose=2)
self = model
self.train_img = X_train
self.train_res = y_train
self.test_img = X_test
self.test_res = y_test
def test_all(self):
""" evaluates the success rate using all the test data """
scores = self.evaluate(self.test_img,self.test_res,verbose=0)
print("Baseline Error: %.2f%%" % (100-scores[1]*100))
def predict(self,img,show=False):
""" img has to be a 784 vector """
""" predicts the number in a picture (vector) """
if show:
# show the picture
plt.imshow(img,cmap='Greys')
plt.show()
num_pixels = img.shape[1] * img.shape[2]
# the actual number
res_number = np.argmax(self.predict(img.reshape(-1,num_pixels)),axis = 1)
return res_number[0] # res_number is a list containing one element
def test_predict(self):
""" test a random number from the test part of the data set """
index = random.randrange(0,10000) # there are 10000 images in the test part of the data set
""" the actual result stored in the data set
It's represented as a list of 10 elements one of which being 1,the rest 0 """
num_pixels = self.test_img.shape[1] * self.test_img.shape[2]
correct_res = self.test_res[index].index(1)
predicted_res = np.argmax(self.predict(self.test_img[index].reshape(-1,axis = 1)
if correct_res != predicted_res:
print("Error in predict ! \
index = ",index," predicted result = ",predicted_res," correct result = ",correct_res)
else:
print("alright")
network = mnist_network()
network.test_predict()



因为您已将self(这是对该对象的当前实例的引用)分配给model,它是Sequential的实例,而它实际上没有属性{ {1}}。例如,如果您要在哪里做

test_img

然后,当您执行class mnist_network(Sequential):
def __init__(self):
self = "foo bar"
时,实际上将引用内存中保留的位置,该位置用于实例中的字符串“ foo bar”,而不是instance = mnist_network()的实例。一般来说,您永远不会做类似的事情

class mnist_network

任何地方。这是没有道理的。我对tensorflow和keras不太熟悉,但是我怀疑您可能想做的事情更多是:

self = some_stuff

或者您真正想做的是:

class mnist_network(Sequential):
def __init__(self):
# do stuff....

如果您尝试使用Sequential类的方法,属性但想对其进行扩展,则可以使用前者-在OOP中将其称为继承。作为Sequantial对象实例,您可以获得所有好处,但是您可以在类mnist_network内自由地向其添加新的方法和属性。

稍后,如果您需要在您的班级中访问一个Sequential对象并要求他执行操作,您将稍后做。这称为合成。


推荐阅读
  • 目录预备知识导包构建数据集神经网络结构训练测试精度可视化计算模型精度损失可视化输出网络结构信息训练神经网络定义参数载入数据载入神经网络结构、损失及优化训练及测试损失、精度可视化qu ... [详细]
  • 2020年9月15日,Oracle正式发布了最新的JDK 15版本。本次更新带来了许多新特性,包括隐藏类、EdDSA签名算法、模式匹配、记录类、封闭类和文本块等。 ... [详细]
  • 本文节选自《NLTK基础教程——用NLTK和Python库构建机器学习应用》一书的第1章第1.2节,作者Nitin Hardeniya。本文将带领读者快速了解Python的基础知识,为后续的机器学习应用打下坚实的基础。 ... [详细]
  • Android 自定义 RecycleView 左滑上下分层示例代码
    为了满足项目需求,需要在多个场景中实现左滑删除功能,并且后续可能在列表项中增加其他功能。虽然网络上有很多左滑删除的示例,但大多数封装不够完善。因此,我们尝试自己封装一个更加灵活和通用的解决方案。 ... [详细]
  • DAO(Data Access Object)模式是一种用于抽象和封装所有对数据库或其他持久化机制访问的方法,它通过提供一个统一的接口来隐藏底层数据访问的复杂性。 ... [详细]
  • 【问题】在Android开发中,当为EditText添加TextWatcher并实现onTextChanged方法时,会遇到一个问题:即使只对EditText进行一次修改(例如使用删除键删除一个字符),该方法也会被频繁触发。这不仅影响性能,还可能导致逻辑错误。本文将探讨这一问题的原因,并提供有效的解决方案,包括使用Handler或计时器来限制方法的调用频率,以及通过自定义TextWatcher来优化事件处理,从而提高应用的稳定性和用户体验。 ... [详细]
  • 本文介绍了如何利用ObjectMapper实现JSON与JavaBean之间的高效转换。ObjectMapper是Jackson库的核心组件,能够便捷地将Java对象序列化为JSON格式,并支持从JSON、XML以及文件等多种数据源反序列化为Java对象。此外,还探讨了在实际应用中如何优化转换性能,以提升系统整体效率。 ... [详细]
  • 计算机视觉领域介绍 | 自然语言驱动的跨模态行人重识别前沿技术综述(上篇)
    本文介绍了计算机视觉领域的最新进展,特别是自然语言驱动的跨模态行人重识别技术。上篇内容详细探讨了该领域的基础理论、关键技术及当前的研究热点,为读者提供了全面的概述。 ... [详细]
  • 本文探讨了如何利用 jQuery 的 JSONP 技术实现跨域调用外部 Web 服务。通过详细解析 JSONP 的工作原理及其在 jQuery 中的应用,本文提供了实用的代码示例和最佳实践,帮助开发者解决跨域请求中的常见问题。 ... [详细]
  • 本文总结了JavaScript的核心知识点和实用技巧,涵盖了变量声明、DOM操作、事件处理等重要方面。例如,通过`event.srcElement`获取触发事件的元素,并使用`alert`显示其HTML结构;利用`innerText`和`innerHTML`属性分别设置和获取文本内容及HTML内容。此外,还介绍了如何在表单中动态生成和操作``元素,以便更好地处理用户输入。这些技巧对于提升前端开发效率和代码质量具有重要意义。 ... [详细]
  • 本文详细介绍了 Spark 中的弹性分布式数据集(RDD)及其常见的操作方法,包括 union、intersection、cartesian、subtract、join、cogroup 等转换操作,以及 count、collect、reduce、take、foreach、first、saveAsTextFile 等行动操作。 ... [详细]
  • com.sun.javadoc.PackageDoc.exceptions()方法的使用及代码示例 ... [详细]
  • 实验九:使用SharedPreferences存储简单数据
    本实验旨在帮助学生理解和掌握使用SharedPreferences存储和读取简单数据的方法,包括程序参数和用户选项。 ... [详细]
  • 深入解析 Lifecycle 的实现原理
    本文将详细介绍 Android Jetpack 中 Lifecycle 组件的实现原理,帮助开发者更好地理解和使用 Lifecycle,避免常见的内存泄漏问题。 ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
author-avatar
袁立红第_593
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有